現在のフォアグラウンドアプリケーションパッケージを入手するために、Googleはついにすべての扉を閉めたようです。
殺されたLollipopの更新後、この回答のgetRunningTasks(int maxNum)
おかげで、私はこのコードを使用して、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以上(6.0 Marshmallow)getRunningAppProcesses()
も殺されたようです。これで、独自のアプリケーションパッケージのリストが返されます。
UsageStatsManager
ここで説明するように新しいUsageStatsManager
APIを使用できますが、すべてのアプリケーションで機能するわけではありません。一部のシステムアプリケーションは同じパッケージを返します
com.google.android.googlequicksearchbox
AccessibilityService(2017年12月:Googleによる使用が禁止されます)
一部のアプリケーションはAccessibilityService
(ここに示すように)使用しますが、いくつかの欠点があります。
現在実行中のアプリケーションパッケージを取得する別の方法はありますか?
ps
シェルでの実行の出力を解析し、ポリシーが"fg"
で、コンテンツが/proc/[pid]/oom_adj_score
等しい0
場合、アプリはフォアグラウンドアプリケーションです。残念ながら、それ/proc/[pid]/oom_adj_score
はもはやAndroid 6.0では読めないようです。gist.github.com/jaredrummler/7d1498485e584c8a120e