- 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之前:
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);
时间最好不要太短,以防获取不到数据