Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีดูแอปพลิเคชันที่กำลังทำงานอยู่ (Running Apps) ใน Android

ภาพรวม

ตัวอย่างนี้แสดงวิธีการดึงรายการแอปที่กำลังทำงานอยู่โดยใช้ ActivityManager (หมายเหตุ: API เปลี่ยนแปลงมากในเวอร์ชันใหม่)

⚠️ ข้อจำกัดสำคัญ

  • API 21+ (Android 5.0+): getRunningTasks() ถูกจำกัด คืนค่าเฉพาะ Task ของแอปตัวเอง
  • API 23+ (Android 6.0+): ต้องขอ Permission PACKAGE_USAGE_STATS (Special Permission)
  • แนวทางใหม่: ใช้ UsageStatsManager สำหรับดูสถิติการใช้งานแอป

ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่

เปิด Android Studio ไปที่ File → New Project แล้วกรอกข้อมูลที่จำเป็น

ขั้นตอนที่ 2: จัดรูปแบบหน้าจอ (activity_main.xml)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">
    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textAlignment="center"
        android:textSize="16sp"
        android:textStyle="bold" />
</RelativeLayout>

ขั้นตอนที่ 3: เขียนโค้ดหลัก (MainActivity.java) - วิธีเก่า (Deprecated)

package com.example.runningapps;

import android.app.ActivityManager;
import android.content.Context;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
import java.util.Objects;

public class MainActivity extends AppCompatActivity {
    TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        textView = findViewById(R.id.textView);
        
        // วิธีเก่า - ทำงานได้เต็มที่เฉพาะ API < 21
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List recentTasks = Objects.requireNonNull(activityManager).getRunningTasks(Integer.MAX_VALUE);
        
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < recentTasks.size(); i++) {
            sb.append("App: ").append(recentTasks.get(i).baseActivity.getPackageName())
              .append("\nID: ").append(recentTasks.get(i).id).append("\n\n");
        }
        textView.setText(sb.toString());
    }
}

วิธีใหม่: ใช้ UsageStatsManager (API 21+)

// ต้องขอ Permission ใน Manifest
// <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />

// ในโค้ด
public void getRunningAppsModern() {
    UsageStatsManager usm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
    long now = System.currentTimeMillis();
    long beginTime = now - 1000 * 60 * 60; // 1 ชั่วโมงย้อนหลัง
    
    List statsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_BEST, beginTime, now);
    
    if (statsList != null) {
        for (UsageStats stats : statsList) {
            if (stats.getLastTimeUsed() > 0) {
                Log.d("RunningApp", "Package: " + stats.getPackageName() + " Last used: " + new Date(stats.getLastTimeUsed()));
            }
        }
    }
}

ขั้นตอนที่ 4: ตั้งค่า Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://schemas.android.com/tools"
    package="com.example.runningapps">
    
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />
    
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

การทดสอบ

รันแอปพลิเคชันบนอุปกรณ์จริง (API < 21 จะเห็นรายการเต็ม, API 21+ จะเห็นเฉพาะแอปตัวเอง)

วิธีดูแอปพลิเคชันที่กำลังทำงานอยู่ (Running Apps) ใน Android

สรุป

สำหรับแอปสมัยใหม่ ควรใช้ UsageStatsManager พร้อมขอ Permission จากผู้ใช้ (นำไปหน้าตั้งค่า Usage Access) แทน getRunningTasks() ที่ถูก Deprecated