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的内容为何出现这些问题,但是认真看看文档还是必要的。