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);
附:获取栈顶元素方法
Android 5.1及之后版本采取UsageStatsManager的方式获取正在运行的程序内存由于需要增加权限,且开启此权限也比较复杂。
这里提供github上的一个开源库实现。地址为:https://github.com/jaredrummler/AndroidProcesses。
此库采用的方式是读取Android proc文件系统,适用于Android 6.0及以下。此种方式的好处是不用区分系统版本,不用增加权限。此项目有700多个star,作者在维护且本人已用于公司项目,经过了测试,还是比较稳固的。使用方式可以参照github上的使用介绍。
PS:有人反馈这个库只能获取正在运行的应用,没法获取栈顶的元素,现提供一种方式。(准确度并不能达到100%)
在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 ""; }
相关文章推荐
- Android系统构架概述
- Android四大组件之Activity、Service
- 将Android Activity设置成对话框式
- Android 多版本Api适配
- android:layout_weight 使用方法
- Android中的通知Notification
- Multiple dex files define Landroid/support/annotation/AnimRes
- Android Scroll分析(二)——实现滑动的五种方法
- Android中Activity、Service和线程之间的通信
- Android API之android.widget.Filterable
- Android listView 设置item显示的数目
- Notification图标总是显示应用的图标(设置smallIcon无效)
- 详谈android启动模式
- AndroidStudio 优秀插件汇总
- 大图处理
- android-BaseAdapter实现ListView增删改
- Android图形用户界面
- android-startService与bindService
- android-Sqlite数据库
- android mob 短信验证码 功能