【问题标题】:Retrieve package name of applications whom are currently running in Android检索当前在 Android 中运行的应用程序的包名称
【发布时间】:2016-07-28 14:09:16
【问题描述】:

有人可以帮助我获取有关检索当前在 Android 中运行的活动的包名称的示例代码吗?

已编辑:

代码 1

    ActivityManager am = (ActivityManager) getSystemService(Activity.ACTIVITY_SERVICE);
    List<RunningAppProcessInfo> processes = am.getRunningAppProcesses();
    if (processes != null){
        for (int i=0; i<processes.size(); i++){
            RunningAppProcessInfo temp = processes.get(i);
            String pName = temp.processName;
            for (int k=0; k<blacklist.size(); k++){
                if (pName.equalsIgnoreCase((String)blacklist.get(k))){
                    int pid = android.os.Process.getUidForName(pName);
                    android.os.Process.killProcess(pid);
                }
            }
     }

代码 2?

  int pid = temp.pid;
    String[] packages = temp.pkgList;
            for (int j=0; j<packages.length; j++){
                String packageName = packages[j];
                for (int k=0; k<blacklist.size(); k++){
                    if (packageName.equalsIgnoreCase((String)blacklist.get(k))){
                        //Android 2.2+ kill all background processes
                        am.killBackgroundProcesses(packageName);
                    }
                }
            }

假设黑色具有我已列入黑名单并想要终止的程序的应用程序包名称。上面哪个代码是实现我的任务杀手的正确方法。谁能解释 killBackgroundProcesses(packageName) 和 android.os.Process.killProcess(pid) 之间的区别,因为我似乎无法理解它们之间的区别。

【问题讨论】:

    标签: android package


    【解决方案1】:

    您可以使用 Android ActivityManager 上的 getRunningAppProcesses 来检索正在运行的进程列表。

    查看此链接:http://developer.android.com/reference/android/app/ActivityManager.html#getRunningAppProcesses%28%29

    您可以使用 Android PackageManager 上的 getInstalledPackages 方法来检索所有已安装应用程序的列表

    查看此链接:http://developer.android.com/reference/android/content/pm/PackageManager.html#getInstalledPackages%28int%29

    【讨论】:

    • 呃。我不是要查找已安装但当前正在前台或后台运行的应用程序。
    • 我确实尝试过使用 getRunningAppProcesses。但我不确定它是如何工作的。是不是我可以得到一个正在运行的进程列表,并通过使用 am.getRunningAppProcesses().get(i).pkgList 从每个进程信息中获取其应用程序的包,它返回一个字符串
    • pkgList 返回已加载到该进程中的所有包。
    • 对不起,如果我听起来像个菜鸟,但包是指导入的包吗?基本上,我正在尝试创建一个任务杀手,它将我创建的黑名单应用程序列表与当前正在运行的应用程序相匹配。然后杀了他们。
    • 你应该试试。我的回答中描述的方法应该回答你原来的问题。
    【解决方案2】:
            ActivityManager am =(ActivityManager)context.getSystemService(ACTIVITY_SERVICE);
      List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
      ActivityManager.RunningTaskInfo task = tasks.get(0); // current task
       ComponentName rootActivity = task.baseActivity;
    
    
          rootActivity.getPackageName();//*currently active applications package name*
    

    在循环中使用它,您将获得所有当前正在运行的应用程序的包名,要获取正在运行的应用程序名称,请参阅EXAMPLE

    【讨论】:

    • getRunningTasks 现已弃用
    【解决方案3】:

    首先你的 API 大于 20,然后使用下面的代码肯定可以工作。我使用此代码并正常工作。试试看

    String currentApp=null;
        UsageStatsManager usm= (UsageStatsManager) this.getSystemService(Context.USAGE_STATS_SERVICE);
        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();
            }
        }
        Log.e(TAG, "Current App in foreground is: " + currentApp);
    
        return currentApp;
    

    【讨论】:

      猜你喜欢
      • 2016-03-28
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 2013-03-02
      相关资源
      最近更新 更多