您的位置:首页 > 其它

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之前:
<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);

时间最好不要太短,以防获取不到数据
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  UsageStatsManager