9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

[Android][Lollipop]UsageStatsManagerでgetRunningAppぽく取得する

Last updated at Posted at 2015-08-26

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をそのまま使っていい気がします。。
もっといい方法があったら教えていただければ直します。

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?