【问题标题】:How to kill all running applications in android?如何杀死android中所有正在运行的应用程序?
【发布时间】:2011-11-15 21:28:35
【问题描述】:

我想杀死 android 中所有正在运行的应用程序。所以对于这个任务,我实现了以下代码。但它不工作。应用程序仍在运行。

ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    for (RunningAppProcessInfo service : manager.getRunningAppProcesses()) {
    Log.i("process name " , service.processName);

    android.os.Process.killProcess(service.pid);
    }

那么我在哪里犯了代码错误? 有什么帮助吗?

【问题讨论】:

  • 让我告诉你我已经在 AVD 中测试了它,而不是在设备中。那么有什么方法只能在真实设备中运行?

标签: android


【解决方案1】:

根据文档enter link description here

请注意,尽管此 API 允许我们请求终止任何进程 基于它的PID,内核仍然会施加标准限制 您实际上可以杀死哪些PID。通常这仅意味着 运行调用者的包/应用程序的进程和任何 该应用创建的其他进程

我对其进行了测试,它只杀死了托管我的应用程序的进程。

【讨论】:

  • 那么就不可能杀死其他正在运行的应用程序吗?
  • 我很少搜索有关杀死外部应用程序的信息。但是,找不到任何有用的东西。另一方面,我们有许多可以杀死任何外部进程的任务管理器应用程序。所以,这是可能的——但不幸的是我还不知道怎么做。
【解决方案2】:

如果设备已获得 root 权限(具有超级用户权限),您还有另一种可能性。

您可以调用将使用 su 权限的外部进程。但请注意,这可能是一个糟糕的设计,因为 Android 操作系统应该是唯一杀死进程的操作系统。

try {
   Process rootProcess = Runtime.getRuntime().exec(new String[] { "su" });

   String command = "kill - 9 <pid>";

   BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(rootProcess.getOutputStream()), 2048);
   try {
      bw.write(command);
      bw.newLine();
      bw.flush();
   } catch (IOException e) {
    // Handle error
   }
} catch (Exception e) {
   e.printStackTrace();
   // Device not rooted!            
}

【讨论】:

  • 我测试了它,应用程序仍在运行但被杀死
  • 你的手机必须root
【解决方案3】:
  • 您可以使用Process.killProcess(int pid) 杀死与您的应用具有相同UID 的进程。
  • 您可以使用ActivityManager.killBackgroundProcesses(String packageName),在您的清单中使用KILL_BACKGROUND_PROCESSES 权限(对于API >= 8)或ActivityManager.restartPackage (String packageName)(对于API

所以如果你想在你的程序是前台进程时杀死所有其他进程,你会使用ActivityManager.killBackgroundProcessesActivityManager.restartPackage

List<ApplicationInfo> packages;
    PackageManager pm;
    pm = getPackageManager();
    //get a list of installed apps.
    packages = pm.getInstalledApplications(0);

   ActivityManager mActivityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
   String myPackage = getApplicationContext().getPackageName();
   for (ApplicationInfo packageInfo : packages) {
        if((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM)==1)continue;
        if(packageInfo.packageName.equals(myPackage)) continue;
        mActivityManager.killBackgroundProcesses(packageInfo.packageName);
   }      

在上面的 sn-p 代码中,每个进程都将被杀死,除非它是您的应用程序或系统进程的进程。
参考文献:
How to close all active applications from my Android app?
How do task killers work?

【讨论】:

  • 我不明白那一行-------- if((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM)==1)continue;做..!!你能解释一下吗
  • @lalith 如果 ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM)==1) 为真,则表示此应用是系统应用(并且我们没有停止系统应用),所以我们继续。
  • 会从最近的应用列表中移除应用(长按home键显示)吗?
  • @UmerFarooq 我之前在回答中提到过:In above snippet code,each process will be killed unless it be process of your App or system process.
  • 最近的应用没有被删除
【解决方案4】:

反射强制停止

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class); method.invoke(am, pkgName);

你应该添加这个系统权限:

android.permission.FORCE_STOP_PACKAGES

【讨论】:

  • android studio 警告它只会被授予系统应用程序。
猜你喜欢
  • 1970-01-01
  • 2013-02-04
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 2013-07-09
  • 2015-08-01
相关资源
最近更新 更多