我有一项服务,他的主要目标是获取当前可见应用程序的包装名称。这是负责它的代码:
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和正向设备上。
一切正常,直到用户消耗状态栏为止。一旦扩展,我就开始获取与通知有关的软件包,最有问题的是,当用户关闭状态栏时,我没有得到可见的应用程序的包装,我仍然会在打开状态栏打开时收到最后的软件包。p>这导致主要问题可能需要的功能。
我尝试了以下方法:
何时扩展状态栏时会得到通知。我深入搜索,但是我发现的唯一解决方案只能通过一项活动来处理,但是就我而言,这是不可能的,因为我正在通过服务工作...
我的服务总是在状态栏中显示作为自定义远程视图的通知。我试图找到一种方法来知道用户是否可见通知,但没有成功。
任何人都知道如何解决?
我在这里找到了我的解决方案:
Android 6.0棉花糖USAGESTATSMANAGER问题试图检索前景应用程序
解决方案是使用USAGEEVENTS钥匙是检查您发现的前套件是否具有以下事件类型:event.move_to_foreground