您的位置:首页 > 移动开发 > Android开发

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

2016-05-19 21:03 525 查看
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 <ActivityManager.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<AndroidAppProcess> processes = AndroidProcesses.getRunningForegroundApps(context);
for (AndroidAppProcess appProcess : processes) {
if (appProcess.foreground) {
return appProcess.getPackageName();
}
}
return "";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: