前言
本文摘抄,具体来源看末尾连接,记录于此。
好记性不如烂笔头。
小结
在实际中,发现使用[获取顶层Activity]的第一个方式存在问题,偶尔获取的顶层activity是错误的。
正文
判断当前是不是桌面
public static boolean isHome(Context context) { String topPackageName = getTopActivityName(context); //此处做了判断如果得到的是null的话就返回一个true return topPackageName == null ? true : getHomesPackageName(context).contains(topPackageName); }
获取桌面的包名
private static List<String> getHomesPackageName(Context context) { List<String> homePackageNames = new ArrayList<>(); PackageManager packageManager = context.getPackageManager(); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); List<ResolveInfo> resolveInfo = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); for (ResolveInfo info : resolveInfo) { homePackageNames.add(info.activityInfo.packageName); } return homePackageNames; }
获取顶层Activity
方式一
由于存在,问题,不太推荐使用。
//得到栈顶Activity的名字,注意此处要进行判断,Android在5.0以后Google把ge tRunningTasks的方法给屏蔽掉了,所以要分开处理 private static String getTopActivityName(Context context) { String topActivityPackageName; ActivityManager manager = (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //此处要判断用户的安全权限有没有打开,如果打开了就进行获取栈顶Activity的名字的方法 //当然,我们的要求是如果没打开就不获取了,要不然跳转会影响用户的体验 if (isSecurityPermissionOpen(context)) { UsageStatsManager mUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); long endTime = System.currentTimeMillis(); long beginTime = endTime - 1000 * 60 * 2; UsageStats recentStats = null; List<UsageStats> queryUsageStats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, beginTime, endTime); if (queryUsageStats == null || queryUsageStats.isEmpty()) { return null; } for (UsageStats usageStats : queryUsageStats) { if (recentStats == null || recentStats.getLastTimeUsed() < usageStats.getLastTimeUsed()) { recentStats = usageStats; } } topActivityPackageName = recentStats.getPackageName(); return topActivityPackageName; } else { return null; } } else { List<ActivityManager.RunningTaskInfo> taskInfos = manager.getRunningTasks(1); if (taskInfos.size() > 0) topActivityPackageName = taskInfos.get(0).topActivity.getPackageName(); else return null; return topActivityPackageName; } } //判断用户对应的安全权限有没有打开 private static boolean isSecurityPermissionOpen(Context context) { long endTime = System.currentTimeMillis(); UsageStatsManager usageStatsManager = (UsageStatsManager) context.getApplicationContext().getSystemService("usagestats"); List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, 0, endTime); if (queryUsageStats == null || queryUsageStats.isEmpty()) { return false; } return true; } //此处是跳转安全权限的跳转代码,如果你判断用户没有开启权限的话可以选择跳转,此处标明~~~ //Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); //startActivity(intent);
方式二
这个方式是我比较常用的。上面也说了,这个在高版本有废弃。
private ActivityManager mActivityManager = null; public String getCurrentTopActivity(Context context) { if (null == context) { Log.d(TAG, "getCurrentTopActivity null: "); } if (null == mActivityManager) { mActivityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); } if (null != mActivityManager.getRunningTasks(1)) { ActivityManager.RunningTaskInfo mRunningTaskInfo = mActivityManager.getRunningTasks(1).get(0); if (null != mRunningTaskInfo && null != mRunningTaskInfo.topActivity && null != mRunningTaskInfo.topActivity.getPackageName()) { return mRunningTaskInfo.topActivity.getPackageName(); } } return ""; }
参考文章
© 版权声明