UsageStatsManager
最近Lollipopで追加されたUsageStatsManagerを使ってみています。
ActivityManager.getRunningTaskの代替として使うため、他の部分を書き換えないように同じような内容を取得してみました。
UsageStatsManager.queryEventsが一番内容が良さそうですが、順番が古い順なのと、数が指定できないのと、eventがフィルタできないのでそれを実装しているだけです。
ちょっと色々カッコ悪いです。。
// 前面のアプリのComponentNameだけ取得しています。
// Taskと違ってあまり情報がありませんが。。
public static List<ComponentName> getForegroundAppList(Context context, int size) {
List<ComponentName> nameList = new ArrayList<ComponentName>();
// どこかでpermissionを確認します。
if (!checkPermission(context))
return nameList;
long time = System.currentTimeMillis();
UsageStatsManager usm = (UsageStatsManager) context.getSystemService("usagestats");
long interval = 10 * 1000;
do {
UsageEvents events = usm.queryEvents(time - interval, time);
while (events.hasNextEvent()) {
UsageEvents.Event event = new UsageEvents.Event();
if (events.getNextEvent(event)) {
// eventTypeがMOVE_TO_FOREGROUNDのものだけ取ったらgetRunningTasksっぽかったのでフィルタしています。
// 古い順に取得されるので先頭から追加して新しい順に直しています。
if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
// 使いやすいようにcomponentNameに変えています。
String packageName = event.getPackageName();
ComponentName name = new ComponentName(packageName, event.getClassName());
// リストにの先頭に追加する
nameList.add(0, name);
}
}
}
interval *= 10;
}
// 指定した数以上、foregroundのイベントが取得できるまで続けてます。
// 無限ループになりそうなので10万秒くらいを上限にしています。これでも大きすぎる気がします。
while (nameList.size() < size || interval > 100000 * 1000);
return nameList;
}
checkPermissionは以前記事にしました。
[Android][Lollipop]UsageStatsManagerの権限状態の確認方法
書いてみて思ったのは、特に必要がなければEventのListをそのまま使っていい気がします。。
もっといい方法があったら教えていただければ直します。