前言

本文摘抄,具体来源看末尾连接,记录于此。

好记性不如烂笔头。

小结

在实际中,发现使用[获取顶层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 "";
    }

参考文章

  1. Android判断当前栈顶Activity的包名

相关文章

暂无评论

none
暂无评论...