我有一项服务,他的主要目标是获取当前可见应用的包名称。这是负责它的代码:
try {
if (Build.VERSION.SDK_INT > 20) {
UsageStatsManager usm = (UsageStatsManager) service.getSystemService(Context.USAGE_STATS_SERVICE);
Calendar calendar = Calendar.getInstance();
long endTime = calendar.getTimeInMillis();
calendar.add(Calendar.DAY_OF_WEEK, -1);
long startTime = calendar.getTimeInMillis();
List<UsageStats> usageStatsList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, startTime, endTime);
if (usageStatsList != null && usageStatsList.size() > 0) {
Collections.sort(usageStatsList, new UsageStatsComparator());
UsageStats mUsageStats = usageStatsList.get(0);
return mUsageStats.getPackageName();
}
else {
if (!Utils.usageAccessGranted(service) && !directToSettingAlreadyTookPlace) {
launchUsageStatsSetting(service);
}
return "";
}
} else {
ActivityManager mActivityManager = (ActivityManager) service.getSystemService(Context.ACTIVITY_SERVICE);
return mActivityManager.getRunningTasks(1).get(0).topActivity.getPackageName();
}
} catch (Exception e) {
Log.e("Error", "Getting Front Package Failed " + e.toString());
return "";
}
这是我使用的比较器:
public class UsageStatsComparator implements Comparator<UsageStats> {
@Override
public int compare(UsageStats lhs, UsageStats rhs) {
if(Build.VERSION.SDK_INT > 20)
{
long time1 = lhs.getLastTimeUsed();
long time2 = rhs.getLastTimeUsed();
if (time1 > time2) {
return -1;
} else if (time1 < time2) {
return 1;
}
return 0;
}
else
return 0;
}
}
此问题出现在Lollipop和转发设备上。
一切正常,直到用户花费状态栏。一旦扩展我开始获得与通知相关的包,最有问题的是当用户关闭状态栏时我没有得到可见应用程序的包,我仍然在状态栏打开时收到最后一个包。
这导致了一个主要问题,可能需要的功能。
我尝试了以下方法:
状态栏延长时获取通知。我深入搜索,但我发现的唯一解决办法只能由一个活动处理,但在我的情况下,这是不可能的,因为我正在通过服务...
我的服务始终在状态栏中显示通知作为自定义远程视图。我试图找到一种方法来了解用户是否可以看到通知,但没有成功。
任何人都知道如何解决这个问题?
答案 0 :(得分:0)
我在这里找到了解决方案:
Android 6.0 Marshmallow UsageStatsManager issue when trying to retrieve foreground app
解决方案是使用UsageEvents 关键是检查您找到的前端包是否具有以下事件类型:Event.MOVE_TO_FOREGROUND