Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Android

Cách lấy danh sách ứng dụng đang chạy (Running Apps) trong Android

Giới thiệu

Bài viết này minh họa cách lấy danh sách các task/app đang chạy sử dụng ActivityManager. Lưu ý quan trọng: Từ Android 5.0 (API 21), getRunningTasks() đã bị deprecated và chỉ trả về task của chính ứng dụng đó do bảo mật.

Các bước thực hiện

Bước 1: Tạo dự án mới

Khởi tạo project Android Studio mới.

Bước 2: Layout (res/layout/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/tvRunningApps"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:textAlignment="center"
        android:textSize="18sp"
        android:textStyle="bold" />

</RelativeLayout>

Bước 3: Code Java (src/MainActivity.java)

package app.com.sample;

import android.app.ActivityManager;
import android.content.Context;
import android.content.pm.PackageManager;
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 tvRunningApps;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvRunningApps = findViewById(R.id.tvRunningApps);
        getRunningAppsInfo();
    }

    private void getRunningAppsInfo() {
        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

        if (activityManager != null) {
            // CẢNH BÁO: getRunningTasks() DEPRECATED từ API 21
            // Chỉ trả về task của app này trên Android 5.0+
            List<ActivityManager.RunningTaskInfo> tasks = activityManager.getRunningTasks(Integer.MAX_VALUE);

            StringBuilder sb = new StringBuilder("Các task đang chạy:\n\n");

            for (int i = 0; i < tasks.size(); i++) {
                ActivityManager.RunningTaskInfo task = tasks.get(i);
                sb.append(i + 1).append(". ")
                  .append(task.baseActivity.flattenToShortString())
                  .append("\n   ID: ").append(task.id)
                  .append("\n   Số activity: ").append(task.numActivities)
                  .append("\n\n");
            }

            tvRunningApps.setText(sb.toString());
        }
    }
}

Giải pháp hiện đại thay thế (Android 5.0+)

1. UsageStatsManager (Cần permission đặc biệt)

// Manifest
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />

// Code
UsageStatsManager usm = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
long now = System.currentTimeMillis();
List<UsageStats> stats = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, now - 86400000, now);

// Sắp xếp theo lastTimeUsed giảm dần
stats.sort((a, b) -> Long.compare(b.getLastTimeUsed(), a.getLastTimeUsed()));

// App đang chạy gần nhất = stats.get(0).getPackageName()

Yêu cầu: User phải bật quyền "Usage access" trong Settings → Security → Apps with usage access.

2. ActivityManager.getRunningAppProcesses() (Deprecated API 26+)

List<ActivityManager.RunningAppProcessInfo> processes = activityManager.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo process : processes) {
    if (process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
        // App đang ở foreground
        String packageName = process.processName;
    }
}

3. Foreground Service Detection (App của chính mình)

Nếu chỉ cần biết app của mình có đang chạy foreground không:

// Trong Service
startForeground(notificationId, notification); // App đang chạy foreground

Bước 4: Manifest

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
    package="app.com.sample">

    <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>

Chạy ứng dụng

Chạy app, TextView hiển thị danh sách task (trên Android 5.0+ chỉ có task của app này).

Cách lấy danh sách ứng dụng đang chạy (Running Apps) trong Android

Tóm tắt khả năng theo phiên bản Android

Phiên bảngetRunningTasks()getRunningAppProcesses()UsageStatsManager
< 5.0 (API 21)Hoạt động đầy đủHoạt độngKhông có
5.0 - 7.1 (API 21-25)Chỉ task của appHoạt độngCó (cần permission)
8.0+ (API 26+)Chỉ task của appDeprecatedCó (cần permission)

Kết luận

Không còn cách nào lấy danh sách TẤT CẢ app đang chạy của hệ thống trên Android hiện đại do chính sách bảo mật. Chỉ có thể:

  • Quản lý task của chính app mình
  • Dùng UsageStatsManager (cần user cấp quyền)
  • Dùng AccessibilityService (cần user bật, phức tạp)