android 5.0以上獲取前臺應用的包名

yangxi_001發表於2016-04-13

背景


前一段時間發現android5.0以後的手機發現我們的APP懸浮窗獲取前臺應用的名稱不起作用了,以前我們的作法如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public String getForegroundApp(Context context) {
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningAppProcesInfo> lr = am.getRunningAppProcesses();
    if (lr == null) {
          return null;
    }
    for (RunningAppProcessInfo ra : lr) {
        if (ra.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE
             || ra.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    return ra.processName;
       }
    }

    return null;
}

 

現在發現上面的lr.size一直是1, 也就是隻能查詢到自己。 最後google發現API 21 新增的介面android.app.usage, 這個 API 比已棄用的 getRecentTasks( ) 方法提供了更詳細資訊。

實現


通過檢視官網文件說明實現如下:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private String getForegroundApp() {
        long ts = System.currentTimeMillis();
        List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,ts-2000, ts);
        if (queryUsageStats == null || queryUsageStats.isEmpty()) {
                return null;
        }
        UsageStats recentStats = null;
        for (UsageStats usageStats : queryUsageStats) {
                if(recentStats == null || recentStats.getLastTimeUsed() < usageStats.getLastTimeUsed()){
                        recentStats = usageStats;
                }
        }
        return recentStats.getPackageName;
}

 

許可權要求


要使用這個API,首先你必須在你的 mainifest 檔案宣告 “android.permission.PACKAGE_USAGE_STATS” 許可權。然後在 設定 > 安全 > 有權檢視使用情況的應用 裡,使用者必須允許該 app 的訪問。

相關文章