【问题标题】:UsageStatsManager start returning packagename from new notification and not Current RunningUsageStatsManager 开始从新通知返回包名,而不是当前正在运行
【发布时间】:2016-06-21 13:30:58
【问题描述】:

我之前为应用程序锁开发了 android 应用程序,该应用程序运行在获取当前运行进程的包名称的想法上,适用于低于棒棒糖版本和高于棒棒糖版本。但是现在在 Marshmallow 中,由于通知,存在获取正确包名称的问题。是的,当通知到来时,当前正在运行的进程的包名将更改为通知来自的应用程序包名。简而言之,当我在 Messenger 上时,突然 whatsapp 通知来了,顶级运行进程的包名称将是 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 中。

【问题讨论】:

  • 想过拥有阅读通知的权限吗?

标签: android notifications android-6.0-marshmallow android-package-managers usagestatsmanager


【解决方案1】:

您可以使用 queryEvents 并按照此处https://stackoverflow.com/a/33748047 的建议获取最后一个 UsageEvents.Event.MOVE_TO_FOREGROUND 类型的事件,而不是使用 queryUsageStats@

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

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

【讨论】:

  • 解决方案有效,但问题不大。前台应用程序包在棉花糖延迟 3 秒后检测到。通过调试,queryUsageStats 返回快速包信息,之后 queryEvents 需要 3 秒才能在前台获取正确的包。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多