android L获取前台应用的包名

背景


前一段时间发现android5.0以后的手机发现我们的APP悬浮窗获取前台应用的名称不起作用了,以前我们的作法如下:

  public String getForegroundApp(Context context) {
       List lr = context.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](https://developer.android.com/about/versions/android-5.0.html#AppUsageStatistics) , 这个 API 比已弃用的 getRecentTasks( ) 方法提供了更详细信息。

实现
------
***

通过查看官网文档说明实现如下:

```java
private String getForegroundApp() {
        long ts = System.currentTimeMillis();
        List 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 的访问。

你可能感兴趣的:(android L获取前台应用的包名)