android 从 5.0 开始 大部分rom 对于原来的ActivityManager getRunningAppProcesses() 不再支持,包括 activityManager.getRunningTasks(), 当然也有部分5.0 手机继续兼容这套API,不过大部分还是不兼容的,那么有些业务需要监听顶层窗口的变化,比如桌面悬浮窗之类的,特别工具类软件,在5.0及其以上版本其实有另一套API,
/** * 获得最近的应用统计数据 * 不需要考虑新版本问题,方法中低版本默认返回null * @return * return null 持续在 duration这个时间内应用没有更新 或者新版本手机 */ @SuppressLint("NewApi") static String getRecentUsagePackageName(Context context) { long ts = System.currentTimeMillis(); UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,0, ts); if (queryUsageStats == null || queryUsageStats.isEmpty()) { return null; } UsageStats recentStats = null; for (UsageStats usageStats : queryUsageStats) { if(recentStats == null || (usageStats.getLastTimeUsed() <=System.currentTimeMillis() && recentStats.getLastTimeUsed() < usageStats.getLastTimeUsed())){ recentStats = usageStats; } } return recentStats == null ? null : recentStats.getPackageName(); }
通过 getRecentUsagePackageName 就可以拿到 当前的顶层窗口,但是 有些rom是不支持这套API的 可以通过 hasModule 来判断,
/** * has Apps with usage access module * @return isHas */ public static boolean hasModule(Context context) { try { PackageManager packageManager = context.getPackageManager(); Intent intent = new Intent("android.settings.USAGE_ACCESS_SETTINGS"); List<ResolveInfo> list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); return list.size() > 0; } catch (SecurityException e) { // 在某个三星的设备上会出现这个异常 return false; } }
另外这套API 是需要用户手动允许的可以通过hasEnable
/** * the user enabled my application * 不需要考虑新版本问题,方法中低版本默认返回false * @return is enabled */ @SuppressLint("NewApi") static boolean hasEnable(Context context){ long ts = System.currentTimeMillis(); UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,0, ts); return !(queryUsageStats == null || queryUsageStats.isEmpty()); }
来判断是否允许,具体可以参考 demo http://download.youkuaiyun.com/detail/lyz100417/9562988 或 https://github.com/lyz1005/TopTaskHelper