【发布时间】:2019-08-13 06:30:34
【问题描述】:
我可以以编程方式结束或终止正在运行的其他进程吗?有人问我的朋友,告诉我应该使用信息亭模式之类的东西!!
谁能帮我解决这个问题..
所有的问候和感谢。
【问题讨论】:
标签: android android-activity process kill kiosk-mode
我可以以编程方式结束或终止正在运行的其他进程吗?有人问我的朋友,告诉我应该使用信息亭模式之类的东西!!
谁能帮我解决这个问题..
所有的问候和感谢。
【问题讨论】:
标签: android android-activity process kill kiosk-mode
最近我正在调查同样的问题,因为我厌倦了手动关闭定期自动打开并在后台继续运行并耗尽电池电量的 Google 地图应用程序...
但我不认为 Android 允许您杀死除您自己的进程之外的任何进程。这有利于安全目的,但我至少希望它们包含应用程序权限,以便程序能够在用户允许的情况下执行此操作。
我尝试了以下方法,但没有一种方法有效:
一位用户指出,从 Android 2.1 开始,这是不可能的。见这里:https://stackoverflow.com/a/6535201/4090002
由于 Android 操作系统对我们用户也有其他限制,因此用户不得不忍受愚蠢的限制和减少对他们做任何事情的权利。我不知道其他移动操作系统,但这是 Android 大放异彩的地方。
【讨论】:
自 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);
}
}
【讨论】:
su 是加载 shell (sh) under 超级用户 (su) 的命令。或者您的设备根本没有植根。
只是为了说清楚,这就是它对我的 root 电话的工作方式(这意味着设备可以使用 su 命令):
Runtime.getRuntime().exec ("sh -c su -c kill -9 pid")
其中 pid 是您要杀死的应用程序的进程 ID,它应该是一个数字。
请注意,这也取决于系统。在某些没有“sh -c”的系统中,它会起作用。在某些系统中,您需要在 su 命令后指定 uid:
su uid
希望对您有所帮助。
大卫
【讨论】:
我想你可以试试android.os.Process.killProcess(android.os.Process.myPid());
但如果你想杀死其他进程,你必须有 root 权限(一般来说,你没有)
【讨论】:
试试这个代码
杀死所有进程,但不是系统进程
// 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());
}
}
【讨论】: