目前需求统计应用的当天使用情况,在 5.0 以上有权限 android.permission.PACKAGE_USAGE_STATS
,获取到该权限后可以通过 UsageStatsManager.queryUsageStats(int intervalType, long beginTime, long endTime)
方法查询到应用的使用情况。
首先需要在AndroidManifest.xml里声明权限
如果不声明权限,打不开界面。然后打开允许查看使用情况的应用界面,此功能需要在设置的里打开,android5.1以下没有此界面(Android5.0以下一定没有,大部分Android5.0系统也没有),需要在代码里打开,需要判断一下系统版本。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
if (!hasPermission()) {
startActivityForResult(
new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS),
MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS);
}
}
使用UsageStatsManager前必须手动开启“使用情况访问权限”,类似accessibilityService,需要用户手动开启。如果不打开的话,下面的UsageStatsManger的所有方法获取的包名等都为空。这块当时折腾了很久,务必开启。
下面即可获取界面顶端的应用界面:
private void getTopApp(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
UsageStatsManager m = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
if (m != null) {
long now = System.currentTimeMillis();
//获取60秒之内的应用数据
List stats = m.queryUsageStats(UsageStatsManager.INTERVAL_BEST, now - 60 * 1000, now);
Log.i(TAG, "Running app number in last 60 seconds : " + stats.size());
String topActivity = "";
//取得最近运行的一个app,即当前运行的app
if ((stats != null) && (!stats.isEmpty())) {
int j = 0;
for (int i = 0; i < stats.size(); i++) {
if (stats.get(i).getLastTimeUsed() > stats.get(j).getLastTimeUsed()) {
j = i;
}
}
topActivity = stats.get(j).getPackageName();
}
Log.i(TAG, "top running app is : " + topActivity);
}
}
}
下面就是获取到的顶端的应用包名:
完整项目地址:
https://github.com/buder-cp/base_component_learn/blob/master/IQWork/appuseage2/src/main/java/com/example/appuseage2/MainActivity.java