Stack Overflow archive
3 score

Get (real) foreground process using activityManager.getRunningAppProcesses()

score
3
question views
3.1K
license
CC BY-SA 3.0

What is the correct method to get current foreground process and prevent false positives?

UsageStatsManager is the only official API to get the current running app (see #50).

Using getRunningTasks(int maxNum), getRunningAppProcesses() or AccessibilityService to get the foreground app has never been reliable. The documentation for the first two methods has the following warning: Note: this method is only intended for debugging


Below is an example for getting the top app using UsageStatsManager:

java
Calendar endCal = Calendar.getInstance();
Calendar beginCal = Calendar.getInstance();
beginCal.add(Calendar.MINUTE, -30);
UsageStatsManager manager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
List<UsageStats> stats =  manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,  
    beginCal.getTimeInMillis(), endCal.getTimeInMillis());
Collections.sort(stats, new Comparator<UsageStats>() {

  @Override public int compare(UsageStats lhs, UsageStats rhs) {
    long time1 = lhs.getLastTimeUsed();
    long time2 = rhs.getLastTimeUsed();
    if (time1 > time2) {
      return -1;
    } else if (time1 < time2) {
      return 1;
    }
    return 0;
  }
});
// The first "UsageStats" in the list will be the top application.
// If the list is empty you will need to ask for permissions to use UsageStatsManager
// To request permission:
// startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));

I know this isn't the answer you are hoping for. Apps like CM Security and AppLock use UsageStatsManager on Android 5.1.1+. Due to SeLinux, it is impossible to get the foreground app using getRunningTasks(int maxNum) or getRunningAppProcesses().

Originally posted on Stack Overflow. Public user contributions are licensed under Creative Commons Attribution-ShareAlike.