Android获取栈顶Activity/查看应用使用情况(适配Android6.0)

Android 6.0以来对权限管理加强。 
在5.0以下通过ActivityManager类的getRunningTasks()获取当前打开的所有应用程序 。 
在5.0版本之后废弃了getRunningTasks()方法,意味着我们在5.0以后不能通过该方法获取正在运行的应用程序,google在5.0又提供类新的api,可以通过ActivityManager的getRunningAppProcesses()方法获取正在运行的应用程序 。 
然后在5.1的版本发布后getRunningAppProcesses()已经获取不到正在运行的服务,在5.0版本google提供了一个UsageStatsManager类,通过这个类可以获取到应用程序的运行情况,该类的使用方法如下: 
1.在AndroidManifest文件中添加权限: 
uses-permission android:name=”android.permission.PACKAGE_USAGE_STATS” 
2.启动授权页面,需要用户授权 
Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); 
context.startActivity(intent); 
调用相关代码获取正在运行的服务: 
UsageStatsManager usm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); 
Calendar calendar = Calendar.getInstance(); 
long endTime = calendar.getTimeInMillis(); 
calendar.add(Calendar.YEAR, -1); 
long startTime = calendar.getTimeInMillis(); 
List usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime);

附:获取栈顶元素方法

    public static String getLauncherTopApp(Context context) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
            ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            List .RunningTaskInfo> appTasks = activityManager.getRunningTasks(1);
            if (null != appTasks && !appTasks.isEmpty()) {
                return appTasks.get(0).topActivity.getPackageName();
            }
        } else {
            long endTime = System.currentTimeMillis();
            long beginTime = endTime - 10000;
            if (sUsageStatsManager == null) {
                sUsageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
            }
            String result = "";
            UsageEvents.Event event = new UsageEvents.Event();
            UsageEvents usageEvents = sUsageStatsManager.queryEvents(beginTime, endTime);
            while (usageEvents.hasNextEvent()) {
                usageEvents.getNextEvent(event);
                if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
                    result = event.getPackageName();
                }
            }
            if (!android.text.TextUtils.isEmpty(result)) {
                return result;
            }
        }
        return "";
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

Android 5.1及之后版本采取UsageStatsManager的方式获取正在运行的程序内存由于需要增加权限,且开启此权限也比较复杂。 
这里提供github上的一个开源库实现。地址为:https://github.com/jaredrummler/AndroidProcesses。 
此库采用的方式是读取Android proc文件系统,适用于Android 6.0及以下。此种方式的好处是不用区分系统版本,不用增加权限。此项目有700多个star,作者在维护且本人已用于公司项目,经过了测试,还是比较稳固的。使用方式可以参照github上的使用介绍。

你可能感兴趣的:(Android,架构)