我的程序需要杀死特定的应用程序。是否可以在股票,无根设备上?如果是 - 如何?我知道它的进程名称和PID。
答案 0 :(得分:25)
我再一次回答太晚了但是因为我今天遇到同样的情况,所以我想分享我的发现以帮助某人。
首先,你需要了解你可以杀死什么不能。从Android的角度来看,应用程序与其他操作系统不同。 Android应用程序由许多组件(活动,广播接收器,服务,最重要的任务等)组成,这些组件打包在一个包中。一个包可以有多个进程运行,具体取决于它运行的组件。
现在有趣的部分是,如果任何或所有进程已经被杀死,则不会考虑(通过安卓)被杀或停止的安卓包,实际上是即使没有进程运行,包仍然可以运行。如果您启动模拟器,启动程序(即浏览器)然后通过DDMS
终止其进程,您可以看到此效果,之后转到应用程序的包设置(Settings --> Applications --> Manage Applications --> All --> Browser)
,您可以看到强制停止按钮,这意味着应用程序仍在运行(从Android的角度来看)。这里发生的是应用程序有一个或多个任务冻结。也就是说,Android已经保存了应用程序活动(任务或任务)的状态,因此如果用户返回它,程序包仍在运行或更好,他将落在他正在做的最后一件事上。现在,如果您单击强制停止按钮,Android将放弃所有这些冻结任务,当用户返回应用程序时,他将看到第一个活动。 任务是您无法杀死的(因为froyo
)只有用户(来自强制停止按钮),系统或使用其签名的第三方应用程序系统的相同密钥可以做到这一点(也许是一个支持root的应用程序,但我还没有证实这一点)。另一方面,只要您遵循一些限制,进程就可以杀死并回收它使用的内存:
- 您拥有
android.permission.KILL_BACKGROUND_PROCESSES
权限。- 流程不是系统或根进程。
- 该过程不属于持久性的组件。
- 通过任何其他方式对系统进行操作并不重要。
醇>
除了排名第一的规则,你不需要对它们采取任何措施,Android将负责这一点。
ActivityManager
有一个方便的功能,你可以使用它来杀死一次包的所有进程。当你调用它时,Android将杀死任何可以被杀死的进程,从而释放一些内存。但是,将保存此程序包的任务状态,当用户返回应用程序时,除非系统本身已将其杀死,否则他将看到他正在做的最后一件事。这可能是因为它需要资源或很久以前保存状态(大约30分钟)。副作用是因为用户认为所有应用程序都像桌面操作系统一样,他们不相信应用程序真的是关闭的,但这就是android的生命。
现在代码:
对于我的项目,我准备了三个功能来实现这一目标。
第一个查找包可能具有的第一个进程pid,如果没有,则返回-1。
private Context cx;
private ActivityManager am = (ActivityManager) cx.getSystemService(Context.ACTIVITY_SERVICE);
public int findPIDbyPackageName(String packagename) {
int result = -1;
if (am != null) {
for (RunningAppProcessInfo pi : am.getRunningAppProcesses()){
if (pi.processName.equalsIgnoreCase(packagename)) {
result = pi.pid;
}
if (result != -1) break;
}
} else {
result = -1;
}
return result;
}
第二个做了一些愚蠢的事情,但我需要它用于我的项目。
public boolean isPackageRunning(String packagename) {
return findPIDbyPackageName(packagename) != -1;
}
第三个完成工作。
public boolean killPackageProcesses(String packagename) {
boolean result = false;
if (am != null) {
am.killBackgroundProcesses(packagename);
result = !isPackageRunning(packagename);
} else {
result = false;
}
return result;
}
他们被证实可以使用模拟器API 8和9以及使用API 15的真实设备(Galaxy S2),并且只要不需要它们就可以杀死任何应用程序的进程(不仅仅是你自己的进程)。 p>
现在关于android.os.Process.killProcess
文档说明:
...通常这意味着只有运行调用者的包/应用程序的进程以及该应用程序创建的任何其他进程; ...
我相信“运行调用者程序包/应用程序的过程”意味着主启动器应用程序而不是您自己的应用程序。您的应用程序是来电者,运行来电者的软件包/应用程序的过程是主启动器或启动了您的应用程序的任何其他应用程序。这是我解释killBackgroundProcesses
函数和android.os.Process.killProcess
函数确实适用于第三方应用程序的唯一方法。
答案 1 :(得分:1)
站在医生那里:
使用给定的PID终止进程。请注意,尽管此API允许我们根据其PID请求终止任何进程,但内核仍将对您实际可以杀死的PID施加标准限制。通常,这意味着只有运行调用者的包/应用程序的进程以及该应用程序创建的任何其他进程;共享公共UID的软件包也可以杀死彼此的进程。
所以你可以杀死你自己的进程..
请参阅Process文档。我试图运行adb shell kill pid
但它需要超级用户权限