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 "";
    }

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

PS:有人反馈这个库只能获取正在运行的应用,没法获取栈顶的元素,现提供一种方式。(准确度并不能达到100%)

public static String getTopStackPkg(Context context) {

    List processes = AndroidProcesses.getRunningForegroundApps(context);
    for (AndroidAppProcess appProcess : processes) {
        if (appProcess.foreground) {
            return appProcess.getPackageName();
        }
    }
    return "";
}

你可能感兴趣的:(Android,Android,杂项)