android - 如何在没有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 的应用程序?
解决方案
出于安全原因,您不能杀死另一个应用程序。作为用户,我不想安装一个没有充分理由关闭我的应用程序的应用程序,而且我什至不知道它,这会很奇怪。话虽如此,可以从另一个应用程序关闭后台进程,我没有自己测试,但这里是:
ActivityManager manager = (ActivityManager)getSystemService(Activity.ACTIVITY_SERVICE);
manager.killBackgroundProcesses(packageName);
你还需要把它放在你的清单上:
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
推荐阅读
- c# - 谷歌地图标记统一
- php - PHP检测屏幕宽度然后改变变量?
- html - 使用 nativeElement.querySelector 查询后如何找到与 div 关联的类
- php - PHP:从数据库中提取表并根据下拉列表从该表中提取列
- html - 特定帖子中 Wordpress 的 CSS
- python - 为什么python奇怪地处理变量?
- oauth-2.0 - 为什么 Actions on Google 不调用我的 OAuth 服务
- octave - 我正在尝试在 octave 最新的 mac 版本中使用 optim 包
- php - Magento 从以逗号分隔的订单中获取产品 ID
- linux - sbt.librarymanagement.ResolveException:未解决的依赖项:com.github.mpeltonen#sbt-idea;1.6.0:未找到