Có vẻ như Google cuối cùng đã đóng tất cả các cánh cửa để nhận gói ứng dụng nền hiện tại.
Sau bản cập nhật Lollipop, bị lỗi getRunningTasks(int maxNum)
và nhờ câu trả lời này , tôi đã sử dụng mã này để lấy gói ứng dụng nền trước kể từ Lollipop:
final int PROCESS_STATE_TOP = 2;
RunningAppProcessInfo currentInfo = null;
Field field = null;
try {
field = RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception ignored) {
}
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = am.getRunningAppProcesses();
for (RunningAppProcessInfo app : appList) {
if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
app.importanceReasonCode == 0 ) {
Integer state = null;
try {
state = field.getInt( app );
} catch (Exception ignored) {
}
if (state != null && state == PROCESS_STATE_TOP) {
currentInfo = app;
break;
}
}
}
return currentInfo;
Có vẻ như Android 5.1.1 trở lên (6.0 Marshmallow) cũng bị khai tử getRunningAppProcesses()
. Bây giờ nó trả về một danh sách các gói ứng dụng của riêng bạn.
UsageStatsManager
Chúng tôi có thể sử dụng UsageStatsManager
API mới như được mô tả ở đây nhưng nó không hoạt động cho tất cả các ứng dụng. Một số ứng dụng hệ thống sẽ trả về cùng một gói
com.google.android.googlequicksearchbox
AccessibilityService (Tháng 12 năm 2017: Sắp bị Google cấm sử dụng)
Một số ứng dụng sử dụng AccessibilityService
(như đã thấy ở đây ) nhưng nó có một số nhược điểm.
Có cách nào khác để lấy gói ứng dụng đang chạy hiện tại không?
ps
trong một shell và chính sách là "fg"
và nội dung của /proc/[pid]/oom_adj_score
bằng 0
thì ứng dụng là ứng dụng nền trước. Thật không may, nó dường như /proc/[pid]/oom_adj_score
không còn đọc được trên Android 6.0. gist.github.com/jaredrummler/7d1498485e584c8a120e