【问题标题】:Kill other process in Android杀死Android中的其他进程
【发布时间】:2019-08-13 06:30:34
【问题描述】:

我可以以编程方式结束或终止正在运行的其他进程吗?有人问我的朋友,告诉我应该使用信息亭模式之类的东西!!

谁能帮我解决这个问题..

所有的问候和感谢。

【问题讨论】:

    标签: android android-activity process kill kiosk-mode


    【解决方案1】:

    最近我正在调查同样的问题,因为我厌倦了手动关闭定期自动打开并在后台继续运行并耗尽电池电量的 Google 地图应用程序...

    但我不认为 Android 允许您杀死除您自己的进程之外的任何进程。这有利于安全目的,但我至少希望它们包含应用程序权限,以便程序能够在用户允许的情况下执行此操作。

    我尝试了以下方法,但没有一种方法有效:

    • activityManagerObject.killBackgroundProcesses(packageName)
    • Process.killProcess(pid)
    • Process.sendSignal(pid, Process.SIGNAL_KILL)

    一位用户指出,从 Android 2.1 开始,这是不可能的。见这里:https://stackoverflow.com/a/6535201/4090002

    由于 Android 操作系统对我们用户也有其他限制,因此用户不得不忍受愚蠢的限制和减少对他们做任何事情的权利。我不知道其他移动操作系统,但这是 Android 大放异彩的地方。

    【讨论】:

      【解决方案2】:

      自 Android 2.2(或更高版本,我不记得了)以来,您只能使用 Intent 杀死自己的应用。要从您的应用程序中杀死另一个进程,您必须拥有 rooted 设备,手动解析 ps 命令输出,获取所需的进程 ID,执行 su,将 kill 命令写入此管道,现在我们开始。我为自己的库写了这段代码,所以这些方法是分开的,但希望你能理解:

          public interface ExecListener {
              void onProcess (String line, int i);
          }
      
          public static String exec (String input) throws IOException, InterruptedException {
              return exec (input, null);
          }
      
          public static String exec (String input, ExecListener listener) throws IOException, InterruptedException {
      
              Process process = Runtime.getRuntime ().exec (input);
              BufferedReader in = new BufferedReader (new InputStreamReader (process.getInputStream ()));
      
              StringBuilder output = new StringBuilder ();
      
              int i = 0;
              String line;
      
              while ((line = in.readLine ()) != null) {
      
                  if (listener == null)
                     output.append (line).append ("\n");
                  else
                     listener.onProcess (line, i);
      
                  ++i;
      
              }
      
              in.close ();
              process.waitFor ();
      
              return output.toString ().trim ();
      
          }
      
          public static void execSU (List<String> cmds) throws IOException, InterruptedException {
      
              Process process = Runtime.getRuntime ().exec ("su");
              DataOutputStream os = new DataOutputStream (process.getOutputStream ());
      
              for (String cmd : cmds) os.writeBytes (cmd + "\n");
      
              os.writeBytes ("exit\n");
      
              os.flush ();
              os.close ();
      
              process.waitFor ();
      
          }
      
          public static void killProcess (String id) throws IOException, InterruptedException {
              return killProcess (new String[] {id});
          }
      
          public static void killProcess (final String[] ids) throws IOException, InterruptedException {
      
              final ArrayList<String> procs = new ArrayList<> ();
      
              exec ("ps", new ExecListener () {
      
                  @Override
                  public void onProcess (String line, int i) {
      
                      if (i > 0) {
      
                          String[] data = Arrays.explode ("\\s+", line);
      
                          for (String id : ids)
                            if (id.equals (data[8]))
                              procs.add (data[1]);
      
                      }
      
                  }
      
              });
      
              if (procs.size () > 0) {
      
                  ArrayList<String> cmds = new ArrayList<> ();
                  cmds.add ("kill -9 " + Arrays.implode (" ", procs));
      
                  execSU (cmds);
      
              }
      
          }
      

      【讨论】:

      • 您的代码有错误。 execSU的第一行应该是:Process process = Runtime.getRuntime().exec("sh -c su");
      • @us_david 你好!谢谢,但奇怪的是你需要用 shell 加载你的命令,因为su 是加载 shell (sh) under 超级用户 (su) 的命令。或者您的设备根本没有植根。
      【解决方案3】:

      只是为了说清楚,这就是它对我的 root 电话的工作方式(这意味着设备可以使用 su 命令):

      Runtime.getRuntime().exec ("sh -c su -c kill -9 pid") 
      

      其中 pid 是您要杀死的应用程序的进程 ID,它应该是一个数字。

      请注意,这也取决于系统。在某些没有“sh -c”的系统中,它会起作用。在某些系统中,您需要在 su 命令后指定 uid:

      su uid 
      

      希望对您有所帮助。

      大卫

      【讨论】:

        【解决方案4】:

        我想你可以试试android.os.Process.killProcess(android.os.Process.myPid());

        但如果你想杀死其他进程,你必须有 root 权限(一般来说,你没有)

        【讨论】:

        【解决方案5】:

        试试这个代码

        杀死所有进程,但不是系统进程

        // TODO 清洁服务

        ActivityManager mActivityManager = (ActivityManager) this
                .getSystemService(ACTIVITY_SERVICE);
        List<ActivityManager.RunningServiceInfo> rs = mActivityManager
                .getRunningServices(500);
        
        Intent destrIntent;
        for (int i = 0; i < rs.size(); i++) {
            ActivityManager.RunningServiceInfo rsi = rs.get(i);
        
            if (!rsi.service.getClassName().contains("com.android")
                    || !rsi.service.getPackageName().contains("com.android")) {
        
                android.os.Process.sendSignal(rsi.pid,
                        android.os.Process.SIGNAL_KILL);
                mActivityManager.killBackgroundProcesses(rsi.service
                        .getPackageName());
            }
        }
        

        【讨论】:

        • 对不起,这段代码不起作用,可能只杀死后台运行的进程
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-14
        • 1970-01-01
        相关资源
        最近更新 更多