关于 UsageStatsManager.queryUsageStats 的注意事项及 UsageStatsService 的简单原理

问题背景:

目前需求统计应用的当天使用情况,在 5.0 以上有权限 android.permission.PACKAGE_USAGE_STATS,获取到该权限后可以通过 UsageStatsManager.queryUsageStats(int intervalType, long beginTime, long endTime) 方法查询到应用的使用情况。

问题描述:

第一天下午使用一些应用后,可以查询到相应应用的当天使用记录。第二天早上七点打开手机,在确定未使用这些应用的情况下,还是查询到了这些应用的当天使用记录。因为查询的是当天使用记录,所以在过去了一个自然日后,应该查询不到应用的使用记录才对。

问题分析:

queryUsageStats 有三个参数,分别是 intervalTypebeginTimeendTime。先说说 beginTimeendTime,它们分别表示待查询时间范围的起始时间和结束时间。而 intervalType 表示时间间隔的类型,它有5个值:

  • INTERVAL_DAILY:天存储级别的数据;
  • INTERVAL_WEEKLY:星期存储级别的数据;
  • INTERVAL_MONTHLY:月存储级别的数据;
  • INTERVAL_YEARLY:年存储级别的数据;
  • INTERVAL_BEST:根据给定时间范围选取最佳时间间隔类型。

既然有了待查询时间范围,那么时间类型又有什么用呢,这就是导致上述问题发生的原因了。测试中查询的时间范围默认是当天零点到当前时间,而时间类型用的是 INTERVAL_DAILY。在实际查询结果中发现查询到的使用记录并不是按给定时间范围来的,而是从前一天的某个时间点开始的。

我们先看下 queryUsageStats 返回的数据,它是一个 UsageStats 类型的数据集合,其中有几个关键字段:

  • mBeginTimeStamp:查询范围的起始时间;
  • mEndTimeStamp:查询范围的起结束时间;
  • mLastTimeUsed:应用最后一次使用结束时的时间;
  • mTotalTimeInForeground:查询范围内应用在前台的累积时长;
  • mLaunchCount:查询范围内应用的打开次数。

进一步分析查询结果,发现其中的 mBeginTimeStampmEndTimeStamp 并不是传入的时间范围,而是和 intervalType 有关,比如在 INTERVAL_DAILY 情况下进行如下测试:

查询时间范围 2018-10-31 00:00:002018-10-31 18:00:00,查询结果中 mBeginTimeStampmEndTimeStamp 分别为 2018-10-30 08:00:002018-10-31 07:59:59

查询时间范围 2018-10-30 10:00:002018-10-31 18:00:00,查询结果中 mBeginTimeStampmEndTimeStamp 分别为 2018-10-30 08:00:002018-10-31 07:59:59

查询时间范围 2018-10-31 10:00:002018-10-31 18:00:00,查询结果中 mBeginTimeStampmEndTimeStamp 分别为 2018-10-31 08:00:002018-10-31 19:17:32(当前系统时间)。

从以上3次测试结果可以看出,beginTimeendTimemBeginTimeStampmEndTimeStamp 没有显而易见的关系。我们再看一下 queryUsageStats 参数的注释:

### 回答1: 这是一个 Android 平台的 API,用于查询应用程序的使用情况统计数据,返回一个 UsageStats 对象列表。该方法需要传入开始时间和结束时间,以确定查询的时间范围。例如,以下代码可以查询过去一小时内应用程序的使用情况统计数据: ```java UsageStatsManager usm = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE); List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_HOUR, System.currentTimeMillis() - 3600000, System.currentTimeMillis()); ``` 需要注意的是,在 Android 5.0 及以上版本中,使用该 API 需要获取到 `android.permission.PACKAGE_USAGE_STATS` 权限。 ### 回答2: UsageStatsManager是Android系统中的一个类,它提供了一套用于查询设备上各个应用程序的使用统计信息的API。 queryUsageStats()方法是UsageStatsManager类中的一个方法,用于从指定时间段内获取应用程序的使用情况统计信息。 使用queryUsageStats()方法,我们可以获得包含了应用程序使用时间、最后一次使用时间和应用程序名称等信息的UsageStats对象列表。 首先,我们需要通过Context.getSystemService()方法来获取一个UsageStatsManager的实例,在参数中传入Context.USAGE_STATS_SERVICE。 然后,我们可以使用queryUsageStats()方法来查询特定时间段内的应用程序使用统计信息。该方法需要两个参数,分别是开始时间和结束时间,以毫秒为单位。 查询结果将返回一个List<UsageStats>对象,其中每个UsageStats对象表示一个应用程序的使用统计信息,可以通过UsageStats类提供的方法来获取具体的信息。 使用queryUsageStats()方法可以帮助我们实现一些功能,比如统计用户使用各个应用程序的时长,或者判断某个应用程序是否在指定时间段内被使用过。 需要注意的是,使用queryUsageStats()方法需要我们的应用程序具有GET_USAGE_STATS权限,否则会抛出SecurityException异常。我们需要在AndroidManifest.xml文件中声明该权限。 总结来说,UsageStatsManagerqueryUsageStats()方法提供了一种获取应用程序使用统计信息的方式,可以帮助我们了解用户对应用程序的使用情况,为用户提供更好的体验。 ### 回答3: UsageStatsManager queryUsageStats() 是一个方法,用来查询应用程序的使用统计信息。 在Android系统中,应用程序的使用统计信息可以包括应用程序的启动时间、关闭时间、使用总时长等。通过使用UsageStatsManagerqueryUsageStats()方法,我们可以获取这些统计信息。 使用该方法,我们需要先通过Context.getSystemService()方法获取到系统的UsageStatsManager对象。然后,我们可以调用queryUsageStats()方法,传入起始时间和结束时间参数,来获取在指定时间段内的应用程序使用统计信息。 返回的结果是一个List<UsageStats>对象,其中包含了每个应用程序的使用统计信息。我们可以遍历该列表,获取各个应用程序的包名、使用时长、最后使用时间等信息。 这个方法的应用场景很多。例如,我们可以利用该方法来编写一个应用程序的使用情况统计功能,或者用于分析用户对应用程序的使用习惯等。我们还可以通过比较不同应用程序的使用时长,来对用户的偏好进行分析,从而优化用户体验。 需要注意的是,为了使用该方法,我们需要在AndroidManifest.xml文件中添加权限声明:android.permission.PACKAGE_USAGE_STATS。用户在安装应用程序时,也需要授权给应用程序获取应用使用统计信息的权限。 总之,UsageStatsManager queryUsageStats()方法提供了一种获取应用程序使用统计信息的功能,为我们开发与应用程序使用情况相关的功能和分析提供了便利。
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值