Vio*_*ffe 5 android process kill-process
我的程序需要杀死一个特定的应用程序.是否可以在股票,无根设备上?如果是 - 如何?我知道它的进程名称和PID.
ChD*_*ers 25
我再一次回答太晚,但由于我今天遇到同样的情况,我想分享我的发现以帮助某人.
首先,你需要了解你可以杀死什么,不能杀死什么.从Android的角度来看,应用程序与其他操作系统不同.Android应用程序由许多组件(活动,广播接收器,服务,最重要的任务等)组成,这些组件打包在一个包中.一个包可以有多个进程运行,具体取决于它运行的组件.
现在有趣的是,如果任何或所有进程都被杀死,那么android程序包不被认为(通过android)被杀死或停止,事实上即使没有进程运行,程序包仍然可以运行.你可以看到这个效果,如果你启动一个模拟器,启动一个程序(即浏览器)然后终止它的进程DDMS,之后转到应用程序的软件包设置(Settings --> Applications --> Manage Applications --> All --> Browser),你可以看到启用强制停止按钮,这意味着应用程序仍然是运行(从Android的角度来看).这里发生的是应用程序冻结了一个或多个任务.也就是说,Android已经保存了应用程序活动(任务或任务)的状态,因此如果用户返回它,程序包仍在运行或更好,他将在他最后做的事情上着陆.现在,如果单击" 强制停止"按钮,Android将丢弃所有这些冻结的任务,当用户返回应用程序时,他将看到第一个活动.一个任务是你杀不了(因为froyo)只有用户(从强制停止按钮),该系统或与系统中相同的密钥签名的第三方应用程序可以做到这一点(也许根能力的应用程序,但我有没有证实这一点).另一方面,只要您遵循一些限制,就可以杀死进程并回收它使用的内存:
- 你有
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;
}
Run Code Online (Sandbox Code Playgroud)
第二个做了一些愚蠢的事情,但我需要它为我的项目.
public boolean isPackageRunning(String packagename) {
return findPIDbyPackageName(packagename) != -1;
}
Run Code Online (Sandbox Code Playgroud)
第三个完成工作.
public boolean killPackageProcesses(String packagename) {
boolean result = false;
if (am != null) {
am.killBackgroundProcesses(packagename);
result = !isPackageRunning(packagename);
} else {
result = false;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
它们被证实可以与仿真器API 8和9以及使用API 15的真实设备(Galaxy S2)一起使用,并且只要不需要它们就可以杀死任何应用程序的进程(不仅仅是您自己的进程).
现在关于android.os.Process.killProcess文件说明:
...通常,这意味着只有运行调用者的包/应用程序的进程以及该应用程序创建的任何其他进程; ...
我相信"运行调用者的包/应用程序的过程"意味着主启动器应用程序而不是您自己的应用程序.您的应用程序是调用者,运行调用者程序包/应用程序的进程是主启动程序或启动应用程序的任何其他应用程序.这是我解释killBackgroundProcesses功能和android.os.Process.killProcess功能确实适用于第三方应用程序的唯一方法.