UsageStatsManager 开始从新通知返回包名而不是当前 运行

UsageStatsManager start returning packagename from new notification and not Current Running

我之前开发了 android 应用程序锁定应用程序,该应用程序 运行 的想法是获取当前 运行 棒棒糖以下和棒棒糖以上版本的进程包名称。但是现在在 Marshmallow 中,由于通知的原因,存在获取正确包名称的问题。是的,当 Notification 到来时,当前 运行 进程的包名称被更改为通知来自的应用程序包名称。简而言之,当我在使用 Messenger 时突然收到 whatsapp 通知,top 运行 进程的包名称将是 com.whatsapp。我的应用程序锁将打开。我正在使用这些方法来获取当前 运行 应用程序的包名称:

    // API below 21
@SuppressWarnings("deprecation")
public static String getProcessOld(Context c) throws Exception {
    String topPackageName = null;
    ActivityManager activity = (ActivityManager) c.getSystemService(Context.ACTIVITY_SERVICE);
    List<RunningTaskInfo> runningTask = activity.getRunningTasks(1);
    if (runningTask != null) {
        RunningTaskInfo taskTop = runningTask.get(0);
        ComponentName componentTop = taskTop.topActivity;
        topPackageName = componentTop.getPackageName();
    }
    return topPackageName;
}

// API 21 and above
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static String getProcessNew(Context c) throws Exception {
    String st = null;
    try {
        // st = getProcess();
        UsageStatsManager mUsageStatsManager = (UsageStatsManager) c.getSystemService("usagestats");
        long endTime = System.currentTimeMillis();
        long beginTime = endTime - 1000 * 10;

        // We get usage stats for the last minute
        List<UsageStats> stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, beginTime,
                endTime);

        // Sort the stats by the last time used
        if (stats != null) {
            SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
            for (UsageStats usageStats : stats) {
                mySortedMap.put(usageStats.getLastTimeUsed(), usageStats);
            }
            if (mySortedMap != null && !mySortedMap.isEmpty()) {
                st = mySortedMap.get(mySortedMap.lastKey()).getPackageName();

            }
        }

    } catch (Exception e) {
        Log.d("main", "Wxxxxexx " + e);

    }
    return st;
}

有什么方法可以在用户界面上只获取 运行 应用程序的包名称,或者从通知中过滤它并将其删除。此问题仅发生在 Marshmallow。

您可以不使用 queryUsageStats,而是使用 queryEvents 并按照此处

的建议获取 UsageEvents.Event.MOVE_TO_FOREGROUND 类型的最后一个事件

事件已经排序,但要确保您也可以访问时间戳。

我试过了,它似乎按预期工作。