Tampaknya Google akhirnya menutup semua pintu untuk mendapatkan paket aplikasi latar depan saat ini.
Setelah pembaruan Lollipop, yang mematikan getRunningTasks(int maxNum)
dan berkat jawaban ini , saya menggunakan kode ini untuk mendapatkan paket aplikasi latar depan sejak 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;
Android 5.1.1 dan lebih tinggi (6.0 Marshmallow), tampaknya, mati getRunningAppProcesses()
juga. Sekarang mengembalikan daftar paket aplikasi Anda sendiri.
UsageStatsManager
Kita dapat menggunakan UsageStatsManager
API baru seperti yang dijelaskan di sini tetapi tidak bekerja untuk semua aplikasi. Beberapa aplikasi sistem akan mengembalikan paket yang sama
com.google.android.googlequicksearchbox
AccessibilityService (Desember 2017: Akan dilarang untuk digunakan oleh Google)
Beberapa aplikasi menggunakan AccessibilityService
(seperti yang terlihat di sini ) tetapi memiliki beberapa kekurangan.
Apakah ada cara lain untuk mendapatkan paket aplikasi yang sedang berjalan?
ps
di shell dan kebijakannya adalah "fg"
dan konten yang /proc/[pid]/oom_adj_score
sama, 0
maka aplikasi tersebut adalah aplikasi latar depan. Sayangnya, tampaknya /proc/[pid]/oom_adj_score
tidak lagi dapat dibaca di Android 6.0. gist.github.com/jaredrummler/7d1498485e584c8a120e