UsageStatsManager怎样使用问题详解和获取应用使用信息

转载自: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);

时间最好不要太短,以防获取不到数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值