美文网首页
Android获取栈顶 Activity 的包名

Android获取栈顶 Activity 的包名

作者: 熊熊熊孩子 | 来源:发表于2019-05-06 16:14 被阅读0次

    第一种方式

    //得到栈顶Activity的名字,注意此处要进行判断,Android在5.0以后Google把getRunningTasks的方法给屏蔽掉了,所以要分开处理
        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);

    第二种方式

    /**
         * 注意: getRunningAppProcesses()方法在5.0开始,就只返回自身应用的进程,所以只能判断自身进程状态,
         * 如果是400,返回为null,不能拿到当前栈顶Activity的包名
         *
         * @param context
         * @return
         */
        private static String getCurrentPkgName(Context context) {
            // 5x系统以后利用反射获取当前栈顶activity的包名.
            ActivityManager.RunningAppProcessInfo currentInfo = null;
            Field field = null;
            int startTaskToFront = 2;
            String pkgName = null;
            try {
                // 通过反射获取进程状态字段.
                field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");
            } catch (Exception e) {
                e.printStackTrace();
            }
            ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            List appList = am.getRunningAppProcesses();
            ActivityManager.RunningAppProcessInfo app;
            for (int i = 0; i < appList.size(); i++) {
                //ActivityManager.RunningAppProcessInfo app : appList
                app = (ActivityManager.RunningAppProcessInfo) appList.get(i);
                //表示前台运行进程.
                if (app.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    Integer state = null;
                    try {
                        // 反射调用字段值的方法,获取该进程的状态.
                        state = field.getInt(app);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    // 根据这个判断条件从前台中获取当前切换的进程对象
                    if (state != null && state == startTaskToFront) {
                        currentInfo = app;
                        break;
                    }
                }
            }
            if (currentInfo != null) {
                pkgName = currentInfo.processName;
            }
            return pkgName;
        }
    

    相关文章

      网友评论

          本文标题:Android获取栈顶 Activity 的包名

          本文链接:https://www.haomeiwen.com/subject/ufkdoqtx.html