首页 > 解决方案 > 如何在没有root权限的情况下以编程方式杀死另一个应用程序或活动

问题描述

一旦另一个应用程序进入前台,我想从我的应用程序中杀死另一个应用程序。

如果我的应用程序处于前台或后台,我已经在捕获。当我的应用程序进入后台时,我想通过它的名称过滤正确的进程并使用它的pid来杀死它。我正在使用ActivityManager.getRunningAppProcesses()和过滤所需名称的进程,但只显示与我的应用程序相关的进程。这是第一个问题,因为我无法访问其他应用程序进程的 pid。

下一个问题是,即使使用其他应用程序进程的当前pid(来自 adb),我应该杀死它的代码也不起作用(其他应用程序继续运行)。

我正在使用 <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" /><uses-permission android:name="android.permission.GET_TASKS" />

我假设我需要 root 才能杀死其他应用程序,所以类似的东西Runtime.getRuntime().exec(arrayOf<String>("su", "-c", "kill 24043"))也不起作用。


val amg = getSystemService(ACTIVITY_SERVICE) as ActivityManager
var processes = amg.getRunningAppProcesses();
for (info in processes) {
    if (info.processName.equals(otherAppName)) {
        val process = Runtime.getRuntime().exec(arrayOf<String>("su", "-c", "kill $pid"))

        android.os.Process.killProcess(info.pid)
        android.os.Process.sendSignal(info.pid, android.os.Process.SIGNAL_KILL)
        amg.killBackgroundProcesses(info.processName)
    }
}

最后三行导致信号被发送,但没有发生任何事情,前一行显然导致java.io.IOException: Cannot run program "su": error=13, Permission denied.

是否有另一种方法可以杀死另一个不需要 root 的应用程序?

标签: androidandroid-activitykotlinpidkill-process

解决方案


出于安全原因,您不能杀死另一个应用程序。作为用户,我不想安装一个没有充分理由关闭我的应用程序的应用程序,而且我什至不知道它,这会很奇怪。话虽如此,可以从另一个应用程序关闭后台进程,我没有自己测试,但这里是:

ActivityManager manager = (ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE);
manager.killBackgroundProcesses(packageName);

你还需要把它放在你的清单上:

<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

推荐阅读