UsageStatsManager.queryUsageStats的参数interval

本文介绍了Android 5.0及以上版本中的UsageStatsManager类,用于获取设备使用历史和统计数据。重点讨论了queryUsageStats方法中interval参数的使用问题,包括如何正确设置时间戳以避免返回null,并提醒开发者在使用时需考虑权限授予,特别是部分设备可能需要用户手动授权。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


UsageStatsManager

 

1.UsageStatsManager是android 5.0 以后增加的类,Provides access to device usage history and statistics。提供了设备的使用历史和数据。

通过UsageStatsManager我们可以获取到当前栈顶,也就是屏幕显示的应用包名,5.0以后再使用AM.getTask()那样的方法是获取不到当前应用包名了。

 

2.伴随着UsageStatsManager的使用,添加了一个权限

<uses-permission
    android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />

 

 

 

这个权限的使用通过部分华为、三星和中兴设备使用证明,大部分设备需要用户通过手动点击添加权限。为了避免出现问题,建议跟API说明一样,提示用户给予权限。下面是我的写法:

 private boolean isNoSwitch() {
        long ts = System.currentTimeMillis();
        UsageStatsManager usageStatsManager = (UsageStatsManager) getApplicationContext()
                .getSystemService("usagestats");
        List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, 0, ts);
        if (queryUsageStats == null || queryUsageStats.isEmpty()) {
            return false;
        }
        return true;
    }

 

 

 

 

if (!isNoSwitch()) {
            Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
            startActivity(intent);
        }


在queryUsageStats结果为null时,表示用户没有权限,提过ACTION_USAGE_ACCESS_SETTINGS,打开设置界面给予权限。

 

 

上面内容跟标题没有太大联系,但是关于权限的授予,是不可少的。

 

queryUsageStats 方法中参数interval的使用。

 

 

Gets application usage stats for the given time range, aggregated by the specified interval.
The returned list will contain a UsageStats object for each package that has data for an interval that is a subset of the time range given. To illustrate:
 intervalType = INTERVAL_YEARLY
 beginTime = 2013
 endTime = 2015 (exclusive)

 Results:
 2013 - com.example.alpha
 2013 - com.example.beta
 2014 - com.example.alpha
 2014 - com.example.beta
 2014 - com.example.charlie
 
Parameters:
intervalType The time interval by which the stats are aggregated.
beginTime The inclusive beginning of the range of stats to include in the results.
endTime The exclusive end of the range of stats to include in the results.
Returns:
A list of UsageStats or null if none are available.
See also:
INTERVAL_DAILY
INTERVAL_WEEKLY
INTERVAL_MONTHLY
INTERVAL_YEARLY
INTERVAL_BEST


上面是JavaDoc中的queryUsageStats的使用说明。

 

按照该写法,queryUsageStats的结果都是为null。问题出在哪里呢?

 

我们可以看到  

public List<UsageStats>queryUsageStats(int intervalType, long beginTime, long endTime) {

……

}

 

时间戳的是long型。那我们来改变一下写法。

 

 Calendar beginCal = Calendar.getInstance();
            beginCal.set(Calendar.DATE, 1);
            beginCal.set(Calendar.MONTH, 0);
            beginCal.set(Calendar.YEAR, 2012);

            Calendar endCal = Calendar.getInstance();
            endCal.set(Calendar.DATE, 1);
            endCal.set(Calendar.MONTH, 0);
            endCal.set(Calendar.YEAR, 2016);

            final List<UsageStats> stats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_YEARLY,
                    beginCal.getTimeInMillis(), endCal.getTimeInMillis());


先构造一个日历,然后获取时间戳的long型数据使用。

 

果然试验成功。

虽然不知道JavaDoc的内容为何出现这些问题,但是认真看看文档还是必要的。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值