如何在安卓手机上关闭所有正在运行的应用程序?

17

我想要杀死在安卓系统中所有正在运行的应用程序。为此,我实现了以下代码。但它没有起作用。应用程序仍然在运行。

ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    for (RunningAppProcessInfo service : manager.getRunningAppProcesses()) {
    Log.i("process name " , service.processName);
    
    android.os.Process.killProcess(service.pid);
    }

那么我的代码哪里出了错?


让我告诉你,我已经在AVD上测试过了,而没有在设备上测试。那么有没有什么方法只在真实设备上运行? - Nandlal Virani
4个回答

24
  • 你可以使用 Process.killProcess(int pid) 来终止和你的 App 具有相同 UID 的进程。
  • 如果想在你的程序处于前台时杀死其他进程,你可以使用 ActivityManager.killBackgroundProcesses(String packageName) (仅适用于 API >= 8,需要在清单文件中声明 KILL_BACKGROUND_PROCESSES 权限) 或 ActivityManager.restartPackage (String packageName)(仅适用于 API < 8) 来终止指定的进程,但不包括前台进程。

因此,如果你想在你的程序处于前台时杀死所有其他进程,你需要使用 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);
   }      

在上面的代码片段中,除非是您的应用程序或系统进程,否则每个进程都将被终止。
参考资料:
如何从我的Android应用程序关闭所有活动应用程序?
任务管理器是如何工作的?


我不理解这行代码——if((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM)==1)continue; 的作用..!! 你能否解释一下? - Lalith B
1
如果 ((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM)==1) 为真,那么这个应用程序是一个系统应用程序(我们没有停止系统应用程序),所以我们继续。 - hasanghaforian
3
它会从最近应用列表中移除应用程序吗?(通过长按主屏幕按钮显示) - Umer Farooq
@UmerFarooq 我之前在答案中提到过:在上面的代码片段中,除非它是您的应用程序或系统进程的进程,否则每个进程都将被终止。 - hasanghaforian
1
最近使用的应用未被移除。 - Kaushal28
如果我们正在从后台服务运行此操作,如何终止前台应用程序? - zeitgeist

5
如果设备具有超级用户权限(已经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!            
}

我已经测试过了,应用程序仍在运行但被终止。 - Nandlal Virani
你的手机必须被root。 - Overblade

2
根据文档 enter link description here,请注意,虽然此API允许我们请求根据PID杀死任何进程,但内核仍将对您实际能够杀死的PID施加标准限制。通常这意味着只有运行调用者软件包/应用程序的进程以及该应用程序创建的任何其他进程可以被杀死。我进行了测试,它只能杀死托管我的应用的进程。

1
那么,杀死其他正在运行的应用程序是不可能的吗? - Nandlal Virani
2
我对杀死外部应用程序进行了一些搜索,但是没有找到有用的信息。另一方面,我们有许多任务管理器应用程序可以杀死任何外部进程。因此,这是可能的 - 但不幸的是我还不知道如何做。 - Bandzio

1

强制停止应用

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


1
Android Studio 警告,它只会授予系统应用程序。 - sajad abbasi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接