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?
sumber
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/7d1498485e584c8a120eJawaban:
Untuk mendapatkan daftar proses yang berjalan di Android 1.6 - Android 6.0 Anda dapat menggunakan perpustakaan ini saya menulis: https://github.com/jaredrummler/AndroidProcesses Perpustakaan membaca / proc untuk mendapatkan info proses.
Google telah secara signifikan membatasi akses ke / proc di Android Nougat. Untuk mendapatkan daftar proses yang berjalan di Android Nougat Anda perlu menggunakan UsageStatsManager atau memiliki akses root.
Klik riwayat edit untuk solusi alternatif sebelumnya.
sumber
Process
implementasikanComparable
dan timpacompareTo
metode tersebut. Kemudian, saat Anda menggunakanCollections.sort(processesList)
, itu akan menggunakan urutan yang Anda tentukan.Gunakan metode ini untuk mendapatkan tugas latar depan. Anda akan membutuhkan Izin Sistem "android: get_usage_stats"
JIKA pengguna mengaktifkan ini dalam pengaturan -> Keamanan-> aplikasi dengan akses penggunaan. Setelah itu kamu akan mendapatkan tugas latar depan. Proses serupa Bersihkan matser oleh tautan google play Cheetahamobile
sumber
UsageStatsManager
. Samsung telah menghapus permintaan dan cukup mengganggu bagi pengguna untuk memberikan izin sistem.Lihat https://github.com/ricvalerio/foregroundappchecker , mungkin itu yang Anda butuhkan. Memberikan kode contoh, dan menghilangkan rasa sakit karena harus mengimplementasikan detektor latar depan lintas versi.
Berikut dua contoh:
Atau periksa secara teratur:
sumber
Google membatasi fungsi ini hanya untuk aplikasi sistem. Seperti yang telah dilaporkan di tiket bug , Anda memerlukan REAL_GET_TASKS izin untuk mengaksesnya.
sumber
Hanya membuang potensi pengoptimalan ke apa yang saya bayangkan adalah sedikit kode yang disalin-tempel untuk mendeteksi aplikasi paling atas di Android M.
Ini
Dapat disederhanakan untuk ini
Saya menemukan diri saya menggunakan kode ini dalam loop 2 detik, dan bertanya-tanya mengapa saya menggunakan solusi kompleks yaitu O (n * log (n)) ketika solusi yang lebih sederhana tersedia di Collections.max () yaitu O (n ).
sumber
Kemudian mulai layanan dan aksesibilitas aplikasi di pengaturan perangkat Anda-> aksesibilitas-> Aplikasi pada layanan itu.
sumber
Silakan coba gunakan
getRunningServices()
sebagai gantigetRunningAppProcesses()
metode.sumber