【问题标题】:Android M: How can I get the current foreground activity package name(from a service)Android M:如何获取当前前台活动包名称(来自服务)
【发布时间】:2015-11-07 09:44:59
【问题描述】:

在Android L上很容易从ActivityManager服务中获取正在运行的任务列表,并首先返回当前活跃的任务。但它不再适用于 Android M,返回列表仅包含我的应用程序任务。有什么办法解决吗?

我的代码:

List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfos = activityManager.getRunningAppProcesses();
for (int i = 0; i < runningAppProcessInfos.size(); i++) {
    ActivityManager.RunningAppProcessInfo runningAppProcessInfo = runningAppProcessInfos.get(i);
    if (runningAppProcessInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
        return runningAppProcessInfo.pkgList[0];
    }
}

【问题讨论】:

    标签: android activity-manager


    【解决方案1】:

    您可以使用以下代码并获取当前前台活动包名称。

       if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
                UsageStatsManager usm = (UsageStatsManager) getSystemService("usagestats");
                long time = System.currentTimeMillis();
                List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
                                time - 1000 * 1000, time);
                        if (appList != null && appList.size() > 0) {
                            SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>();
                            for (UsageStats usageStats : appList) {
                                mySortedMap.put(usageStats.getLastTimeUsed(),
                                        usageStats);
                            }
                            if (mySortedMap != null && !mySortedMap.isEmpty()) {
                                currentApp = mySortedMap.get(
                                        mySortedMap.lastKey()).getPackageName();
                            }
                        }
            } else {
                    ActivityManager am = (ActivityManager) getBaseContext().getSystemService(ACTIVITY_SERVICE);
                    currentApp = am.getRunningTasks(1).get(0).topActivity .getPackageName(); 
    
            }
    

    编辑

    将此权限添加到清单文件中。

    <uses-permission android:name="android.permission.GET_TASKS" /> 
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" />
    

    注意

    确保您需要在设备中配置自定义设置以获得输出,您可以通过设置 > 安全 > 具有使用访问权限的应用 > 然后启用您的应用权限

    【讨论】:

    • 无法在某些设备上运行,这些设备在 RunningAppProcessInfo 列表中没有任何顺序。因此 tasts.get(0) 将始终返回错误的过程。
    • 试试这段代码希望对你有用----' ActivityManager am = (ActivityManager) getBaseContext().getSystemService(ACTIVITY_SERVICE); currentApp = am.getRunningTasks(1).get(0).topActivity .getPackageName(); ' @JacksOnF1re
    • 但自 API 21 起已弃用 :( 问题是,我无法使用 UsageStats Manager,因为三星决定不支持它的功能
    • 是的,您是对的,此代码自 API 21 起已弃用:但它在 API 21 以下正常工作,因此首先检查 API 版本并为不同版本添加条件。我也在我的应用程序中使用上述代码,并且成功运行。谢谢@JacksOnF1re
    • 到目前为止谢谢,但是我应该在 API 21 中做什么?如前所述,UsageStats 并非适用于所有设备。
    【解决方案2】:

    请在 Android M 中尝试此行。这对我有用

    String packageName =  ProcessManager.getRunningForegroundApps(getApplicationContext()).get(0).getPackageName();
    

    查看以下链接以获取其他 android 平台支持。

    https://stackoverflow.com/a/36660429/4554069

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 2016-04-04
      • 1970-01-01
      • 2016-07-30
      • 2021-10-15
      • 2011-08-05
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多