我正在尝试使用UsageStatsManager在一个带有Marshmallow的Nexus 5上获得前台应用程序。我记得它曾经工作过,但出于某种原因,我现在获得了包/类名的空字符串。
这是我的实现
public String[] getForegroundPackageNameClassNameByUsageStats() {
String packageNameByUsageStats = null;
String classByUsageStats = null;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService("usagestats");
final long INTERVAL = 1000;
final long end = System.currentTimeMillis();
final long begin = end - INTERVAL;
final UsageEvents usageEvents = mUsageStatsManager.queryEvents(begin, end);
while (usageEvents.hasNextEvent()) {
UsageEvents.Event event = new UsageEvents.Event();
usageEvents.getNextEvent(event);
if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
packageNameByUsageStats = event.getPackageName();
classByUsageStats = event.getClassName();
Log.d(TAG, "packageNameByUsageStats is" + packageNameByUsageStats + ", classByUsageStats is " + classByUsageStats);
}
}
}
return new String[]{packageNameByUsageStats,classByUsageStats};
}由于某些原因,它不会进入while循环,即usageEvents.hasNextEvent()为false。因此,它返回空包/类名。
知道我做错什么了吗?
谢谢。
发布于 2016-08-17 01:55:30
好的,我发现一旦我把间隔设置为10000而不是1000,它就能工作了。很明显,1s间隔太小了。
发布于 2017-10-05 08:11:15
我自己用的。我认为,只有当应用程序到达前台时,才会更新使用率统计数据。因此,如果前台应用程序在您的“开始”时间戳之前到达前台(并停留在前台),那么您将无法得到它。:(
另一方面,当你使用很久以前,你会得到一个巨大的列表,你只需要最高的时间来确定前景应用。
,所以我所做的是创建3个不同的时间:1分钟前,1小时前和12小时前。
当我在1分钟得到一个空列表时,我会用1h重复请求,以此类推。这样我大部分时间都能得到前景。但我从来没有让它一直在工作。
我真的很怀念以前那种只问软件包管理器哪个应用程序是前台的方法(在android 5之前),新的方式有点混乱。
https://stackoverflow.com/questions/38971472
复制相似问题