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

Tóm tắt khả năng theo phiên bản Android
| Phiên bản | getRunningTasks() | getRunningAppProcesses() | UsageStatsManager |
|---|---|---|---|
| < 5.0 (API 21) | Hoạt động đầy đủ | Hoạt động | Không có |
| 5.0 - 7.1 (API 21-25) | Chỉ task của app | Hoạt động | Có (cần permission) |
| 8.0+ (API 26+) | Chỉ task của app | Deprecated | Có (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)