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

  • 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年


对于每一个应用来说,系统会记录以下信息:

  1. 应用最后一次被用的时间
  2. 对应存储的4个级别,应用在前台的总共时间
  3. 时间戳:一个组件一天之内改变状态的时刻(从前台到后台,或从后台到前台),这个组件可以通过包名或activity的名字来唯一标示。
  4. 时间戳:设备配置信息改变的时刻,如:横竖屏切换。

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);

时间最好不要太短,以防获取不到数据

  • 9
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值