【问题标题】:How to get the list of running applications?如何获取正在运行的应用程序列表?
【发布时间】:2021-08-28 23:07:08
【问题描述】:

我正在开发一个应用程序,它需要到目前为止在系统上运行的应用程序的信息。是否有检索此类信息的 API/方法?

【问题讨论】:

    标签: android


    【解决方案1】:

    无法检测到 Android 中的应用启动,但您可以使用以下代码获取当前打开的应用列表并检查您要查找的应用是否打开:

    ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();
    
    for (int i = 0; i < runningAppProcessInfo.size(); i++) {
      if(runningAppProcessInfo.get(i).processName.equals("com.the.app.you.are.looking.for")) {
        // Do your stuff here.
      }
    }
    

    您也可以使用此方法检查应用是否在前台运行

    public static boolean isForeground(Context ctx, String myPackage){
        ActivityManager manager = (ActivityManager) ctx.getSystemService(ACTIVITY_SERVICE);
        List< ActivityManager.RunningTaskInfo > runningTaskInfo = manager.getRunningTasks(1); 
    
        ComponentName componentInfo = runningTaskInfo.get(0).topActivity;
        if(componentInfo.getPackageName().equals(myPackage)) {
            return true;
        }       
        return false;
    }
    

    【讨论】:

    • 上面的第一个代码 sn-p 非常适合在后台运行的应用程序。谢谢。
    • 并非在所有情况下都有效。例如,我打开 chrome 并使用主页按钮关闭。我可以在“应用历史记录”/“正在运行的应用”列表中看到“Chrome”。我从那里刷掉了铬。上面的代码仍然显示“Chrome”正在后台运行。
    • @Manu 那么这个过程可能还在吗?
    • 我正在运行第一个函数并且只获取我的应用程序,为什么没有列出其他应用程序? (我正在运行信息亭模式)
    • 这不适用于运行 Android 6.0 及更高版本的用户。使用 UsageStats 。在 Android 7 之前它对我有用(即使您需要手动设置权限)。
    【解决方案2】:
    public static String getActiveApps(Context context) {
    
        PackageManager pm = context.getPackageManager();
        List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
    
        String value = u.dateStamp(); // basic date stamp
        value += "---------------------------------\n";
        value += "Active Apps\n";
        value += "=================================\n";
    
        for (ApplicationInfo packageInfo : packages) {
    
            //system apps! get out
            if (!isSTOPPED(packageInfo) && !isSYSTEM(packageInfo)) {
    
                value += getApplicationLabel(context, packageInfo.packageName) + "\n" + packageInfo.packageName  + "\n-----------------------\n";
    
            }
        }
    
        return value;
    
        //result on my emulator
    
        /* 2 Ekim 2017 Pazartesi 14:35:17
        ---------------------------------
        Active Apps
        =================================
        SystemSetting
        com.xyz.systemsetting
        -----------------------
        myMail
        com.my.mail
        -----------------------
        X-plore
        com.lonelycatgames.Xplore
        -----------------------
        Renotify
        com.liamlang.renotify
        -----------------------
        Mail Box
        com.mailbox.email
        -----------------------   */
    
    
    }
    

    some opened apps

    已停止

    private static boolean isSTOPPED(ApplicationInfo pkgInfo) {
    
        return ((pkgInfo.flags & ApplicationInfo.FLAG_STOPPED) != 0);
    }
    

    是系统

    private static boolean isSYSTEM(ApplicationInfo pkgInfo) {
    
        return ((pkgInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0);
    }
    

    getApplicationLabel

    public static String getApplicationLabel(Context context, String packageName) {
    
        PackageManager        packageManager = context.getPackageManager();
        List<ApplicationInfo> packages       = packageManager.getInstalledApplications(PackageManager.GET_META_DATA);
        String                label          = null;
    
        for (int i = 0; i < packages.size(); i++) {
    
            ApplicationInfo temp = packages.get(i);
    
            if (temp.packageName.equals(packageName))
                label = packageManager.getApplicationLabel(temp).toString();
        }
    
        return label;
    }
    

    【讨论】:

    • 什么是u.dateStamp()
    • 使用此代码,我得到的应用程序甚至没有运行。例如,我的工作应用程序和唯一的 youtube 应用程序正在运行并且存在于堆栈中,但它没有在输出中显示 youtube 应用程序。它显示了 Insta 和其他一些甚至没有运行的应用程序。在三星 S4 Android 5.0.1 上测试过
    • 从 Android 11 开始,该方法不再返回所有应用的信息;详情见g.co/dev/packagevisibility
    • @Sepehr 有适用于 Android 11 的解决方案吗?
    • 呃不……! @HemantKaushik ....
    【解决方案3】:

    您可以使用ActivityManager 类获取有关正在运行的进程的信息。

    【讨论】:

      猜你喜欢
      • 2019-06-28
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2019-07-16
      相关资源
      最近更新 更多