【问题标题】:Android 5.0+ getRunningTasks is deprecatedAndroid 5.0+ getRunningTasks 已弃用
【发布时间】:2015-11-25 14:03:48
【问题描述】:

我经历过这个question 和这个question。但是在library 的帮助下,我现在可以使用以下代码获取前台任务列表。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //For versions less than lollipop
            ActivityManager am = ((ActivityManager) getSystemService(ACTIVITY_SERVICE));
            List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(5);
            top = taskInfo.get(0).topActivity.getPackageName();
            Log.v(TAG, "top app = " + top);
        }else{ //For versions Lollipop and above
            List<AndroidAppProcess> processes = ProcessManager.getRunningForegroundApps(getApplicationContext());
            Collections.sort(processes, new ProcessManager.ProcessComparator());
            for (AndroidAppProcess process : processes) {
                if (process.foreground) {
                    top =process.name;
                    Log.v(TAG,top);
                }
            }
        }

在这里,对于 Android 5.0+,我得到了所有正在运行的前台进程,但我无法断定哪个应用程序是顶级应用程序。

上述代码的输出(其他条件)

com.android.vending
com.google.android.gms
com.google.android.googlequicksearchbox
com.google.android.videos
com.test1
com.naag.testing
com.example.android.gettask

我最喜欢的应用是com.google.android.videos

现在如何以编程方式确定com.google.android.videos 是上述列表中的顶级应用程序?

applocker(或类似于 applocker)应用程序如何在 5.0+ 上运行? 希望有人帮助,这将对某人有所帮助。

【问题讨论】:

  • 您需要设置标准来确定是什么构成了 Process Top 进程,例如 CPU、内存使用情况等,我想您必须遍历每个进程提供的 statm找出答案的过程。

标签: android android-5.0-lollipop deprecated android-6.0-marshmallow


【解决方案1】:

所以这里有一个更新。在 5.0 和 5.1.1 设备中测试。完美运行。

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //For versions less than lollipop
            ActivityManager am = ((ActivityManager) getSystemService(ACTIVITY_SERVICE));
            List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(5);
            top = taskInfo.get(0).topActivity.getPackageName();
            Log.v(TAG, "top app = " + top);
        }else{ //For versions Lollipop and above
            List<AndroidAppProcess> processes = ProcessManager.getRunningForegroundApps(getApplicationContext());
            Collections.sort(processes, new ProcessManager.ProcessComparator());
            for (int i = 0; i <=processes.size()-1 ; i++) {
                if(processes.get(i).name.equalsIgnoreCase("com.google.android.gms")) { //always the package name above/below this package is the top app
                    if ((i+1)<=processes.size()-1) { //If processes.get(i+1) available, then that app is the top app
                        top = processes.get(i + 1).name;
                    } else if (i!=0) { //If the last package name is "com.google.android.gms" then the package name above this is the top app
                        top = processes.get(i - 1).name;
                    } else{
                        if (i == processes.size()-1) { //If only one package name available
                            top = processes.get(i).name;
                        }
                    }
                    Log.v(TAG, "top app = " + top);
                }
            }
        }

感谢library

现在我可以在 Android 5.0+ 中获取前台任务

【讨论】:

  • 是的..它的工作..但我认为没有必要 if(processes.get(i).name.equalsIgnoreCase("com.google.android.gms")) { 这个条件..
  • 此代码不起作用。它不会从前台带来最顶级的应用程序。 ProcessManager.ProcessComparator 只是这样做: p1.name.compareToIgnoreCase(p2.name);它比较字符串,仅此而已。
【解决方案2】:

“具有使用访问权限的应用”功能有时可以满足您的需求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-25
    • 2021-08-31
    • 2015-09-18
    • 2018-02-11
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多