用户扩展状态栏会扭曲我的getFrontPackage()功能

时间:2017-02-17 10:27:50

标签: android

我有一项服务,他的主要目标是获取当前可见应用的包名称。这是负责它的代码:

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和转发设备上。

一切正常,直到用户花费状态栏。一旦扩展我开始获得与通知相关的包,最有问题的是当用户关闭状态栏时我没有得到可见应用程序的包,我仍然在状态栏打开时收到最后一个包。

这导致了一个主要问题,可能需要的功能。

我尝试了以下方法:

  1. 状态栏延长时获取通知。我深入搜索,但我发现的唯一解决办法只能由一个活动处理,但在我的情况下,这是不可能的,因为我正在通过服务...

  2. 我的服务始终在状态栏中显示通知作为自定义远程视图。我试图找到一种方法来了解用户是否可以看到通知,但没有成功。

  3. 任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我在这里找到了解决方案:

Android 6.0 Marshmallow UsageStatsManager issue when trying to retrieve foreground app

解决方案是使用UsageEvents 关键是检查您找到的前端包是否具有以下事件类型:Event.MOVE_TO_FOREGROUND