UsageStatsManager怎样使用问题详解和获取应用使用信息
2016-07-28 12:32
489 查看
转载自:http://blog.csdn.net/andoop/article/details/50593699
UsageStatsManager就是使用情况统计管理者,通过它可以获取应用的使用情况。
它是Android 5.0 才有的API。
使用它之前需要在清单文件中配置 “android.permission.PACKAGE_USAGE_STATS”的权限
用户必须在 设置–安全–有权查看使用情况的应用 中勾选相应的应用
对应设备 Android 5.0 及其以上。
魅族和小米手机不能通过UsageStatsManager获取应用使用情况
系统会统计应用的使用情况并保存起来,然后按照这些保存起来的信息的时间长短进行划分。
划分级别有4个:
1.日长短级别数据:Daily data
最长7天内的数据
2.星期长短级别数据:Weekly data
最长4个星期内的数据
3.月长短级别数据: Monthly data
最长6个月内的数据
4.年长短级别数据: Yearly data
最长2年内的数据,也就是说,数据最长保存2年
对于每一个应用来说,系统会记录以下信息:
应用最后一次被用的时间
对应存储的4个级别,应用在前台的总共时间
时间戳:一个组件一天之内改变状态的时刻(从前台到后台,或从后台到前台),这个组件可以通过包名或activity的名字来唯一标示。
时间戳:设备配置信息改变的时刻,如:横竖屏切换。
android5.0以后通过UsageStatsManager获取前台应用进程
5.0之前:
5.0之后(魅族除外)
UsageStatsManager 的方法 queryUsageStats用法
queryUsageStats的三个参数说明:
intervalType 时间间隔的类型,5种,对应上面的4个,还有一个,后面再说
beginTime 开始的时间
endTime 结束的时间
正如上面的代码,我们可以通过queryUsageStats这个方法获取指定时间段内的应用使用情况信息
但是在指定时间段的时候要注意了:有可能获取的数据为空。
很多人喜欢这样用:
long st = System.currentTimeMillis();
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,st-2*1000,st);
这种情况下,很容易获取到空的数据,如果在执行这段代码之前,有一个时间间隔:2*1000(这里就是2秒了),在这个间隔内系统没有记录应用使用情况的信息(应用什么时候记录应用使用情况信息请看上面内容),这样就导致系统数据库中没有对应这个时间段的数据,所以就为空了。
关于第一个参数:intervalType 是时间间隔的类型:
INTERVAL_DAILY 天存储级别的数据
INTERVAL_WEEKLY 星期存储级别的数据
INTERVAL_MONTHLY 月存储级别的数据
INTERVAL_YEARLY 年存储级别的数据
INTERVAL_BEST 根据提供的时间间隔(根据与第二个参数和第三个参数获取),自动搭配最好的级别
如代码:
Calendar calendar=Calendar.getInstance();
calendar.setTime(new Date());
long endt = calendar.getTimeInMillis();//结束时间
calendar.add(Calendar.DAY_OF_MONTH, -1);//时间间隔为一个月
long statt = calendar.getTimeInMillis();//开始时间
UsageStatsManager usageStatsManager=(UsageStatsManager) getSystemService(USAGE_STATS_SERVICE);
//获取一个月内的信息
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,statt,endt);
时间最好不要太短,以防获取不到数据
UsageStatsManager就是使用情况统计管理者,通过它可以获取应用的使用情况。
它是Android 5.0 才有的API。
使用它之前需要在清单文件中配置 “android.permission.PACKAGE_USAGE_STATS”的权限
用户必须在 设置–安全–有权查看使用情况的应用 中勾选相应的应用
对应设备 Android 5.0 及其以上。
魅族和小米手机不能通过UsageStatsManager获取应用使用情况
系统会统计应用的使用情况并保存起来,然后按照这些保存起来的信息的时间长短进行划分。
划分级别有4个:
1.日长短级别数据:Daily data
最长7天内的数据
2.星期长短级别数据:Weekly data
最长4个星期内的数据
3.月长短级别数据: Monthly data
最长6个月内的数据
4.年长短级别数据: Yearly data
最长2年内的数据,也就是说,数据最长保存2年
对于每一个应用来说,系统会记录以下信息:
应用最后一次被用的时间
对应存储的4个级别,应用在前台的总共时间
时间戳:一个组件一天之内改变状态的时刻(从前台到后台,或从后台到前台),这个组件可以通过包名或activity的名字来唯一标示。
时间戳:设备配置信息改变的时刻,如:横竖屏切换。
android5.0以后通过UsageStatsManager获取前台应用进程
5.0之前:
<pre name="code" class="java">public String getForegroundApp(Context context) { ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcesInfo> lr = am.getRunningAppProcesses(); if (lr == null) { return null; } for (RunningAppProcessInfo ra : lr) { if (ra.importance == RunningAppProcessInfo.IMPORTANCE_VISIBLE || ra.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { return ra.processName; } } return null; }
5.0之后(魅族除外)
@SuppressLint("NewApi") private String getForegroundApp() { Calendar calendar=Calendar.getInstance(); calendar.setTime(new Date()); long endt = calendar.getTimeInMillis();//结束时间 calendar.add(Calendar.DAY_OF_MONTH, -1);//时间间隔为一个月 long statt = calendar.getTimeInMillis();//开始时间 UsageStatsManager usageStatsManager=(UsageStatsManager) getSystemService(USAGE_STATS_SERVICE); //获取一个月内的信息 List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,statt,endt); if (queryUsageStats == null || queryUsageStats.isEmpty()) { return null; } UsageStats recentStats = null; for (UsageStats usageStats : queryUsageStats) { if(recentStats == null || recentStats.getLastTimeUsed() < usageStats.getLastTimeUsed()){ recentStats = usageStats; } } return recentStats.getPackageName(); }
UsageStatsManager 的方法 queryUsageStats用法
queryUsageStats的三个参数说明:
intervalType 时间间隔的类型,5种,对应上面的4个,还有一个,后面再说
beginTime 开始的时间
endTime 结束的时间
正如上面的代码,我们可以通过queryUsageStats这个方法获取指定时间段内的应用使用情况信息
long endt = calendar.getTimeInMillis();//结束时间 calendar.add(Calendar.DAY_OF_MONTH, -1);//时间间隔为一个月 long statt = calendar.getTimeInMillis();//开始时间 UsageStatsManager usageStatsManager=(UsageStatsManager) getSystemService(USAGE_STATS_SERVICE); //获取一个月内的信息 List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,statt,endt);
但是在指定时间段的时候要注意了:有可能获取的数据为空。
很多人喜欢这样用:
long st = System.currentTimeMillis();
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,st-2*1000,st);
这种情况下,很容易获取到空的数据,如果在执行这段代码之前,有一个时间间隔:2*1000(这里就是2秒了),在这个间隔内系统没有记录应用使用情况的信息(应用什么时候记录应用使用情况信息请看上面内容),这样就导致系统数据库中没有对应这个时间段的数据,所以就为空了。
关于第一个参数:intervalType 是时间间隔的类型:
INTERVAL_DAILY 天存储级别的数据
INTERVAL_WEEKLY 星期存储级别的数据
INTERVAL_MONTHLY 月存储级别的数据
INTERVAL_YEARLY 年存储级别的数据
INTERVAL_BEST 根据提供的时间间隔(根据与第二个参数和第三个参数获取),自动搭配最好的级别
如代码:
Calendar calendar=Calendar.getInstance();
calendar.setTime(new Date());
long endt = calendar.getTimeInMillis();//结束时间
calendar.add(Calendar.DAY_OF_MONTH, -1);//时间间隔为一个月
long statt = calendar.getTimeInMillis();//开始时间
UsageStatsManager usageStatsManager=(UsageStatsManager) getSystemService(USAGE_STATS_SERVICE);
//获取一个月内的信息
List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY,statt,endt);
时间最好不要太短,以防获取不到数据
相关文章推荐
- TopTaskHelper 判断顶层窗口是否变化
- 一次UsageStatsManager在UTC零点清零数据的Debug
- Android 5.0以上通过UsageStatsManager类 获取应用使用情况(精品)
- 当图片有点击监听和长按监听时会产生的问题
- POJ 2442 优先队列
- Hibernate的二级缓存管理
- [leetcode] 203. Remove Linked List Elements
- eclipse项目迁移到android studio上
- 查看linux版本
- 图形学的日文博客或者链接
- iOS 中使用.9图
- UVA 11988 - Broken Keyboard (a.k.a. Beiju Text)
- Android KeyCode列表
- Windows7下使用VS2015搭建Lua开发环境
- Linux入门笔记——文件操作命令2
- HDUOJ 2121 Ice_cream’s world II(不定根的最小树形图-好题)
- Exception 笔记
- 二叉树先序遍历,中序遍历,后续遍历 非递归版本+二叉树转换为string保存+二叉树的层次遍历+平衡二叉树判断
- xutils的HttpUtils,Post和Get基本使用,以及BitmapUtils的简单使用
- Doxygen安装、中文PDF输出全攻略(Linux + MacOS)