直奔主题,现在介绍一下Android中结束进程的几种方法。
1.void restartPackage(String packageName)
该方法为@Deprecated
,实际调用的是killBackgroundProcesses(packageName)
方法:
下面主要介绍一下 killBackgroundProcesses
方法。2.void killBackgroundProcesses(String packageName)
该方法返回值为空,所以我们不知道我们要杀掉的进程是否被杀死。但是他可 以根据包名结束另外一个进程。需要添加权限:<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
下面我们来看一下它依次调用的函数:
- 调用ActivityManagerNative的
killBackgroundProcesses
方法 - 其中mRemote的类型是Binder,调用的函数为
java
mRemote.transct(int,Parcel,Parcel,int )
3. kill -9 pid 命令
shell命令是Linux命令,Android底层是linux系统,所以Android上可以使用所有Linux 终端命令。
Ⅰ.这里的kill指的是shell command的那个kill,输入man kill可以看到kill的作用(如下图):向某个指定的进程进程或进程租发送信号,从而结束该进程/进程租。只有”super-user”即Android root用户才能使用。
Ⅱ.kill命令支持发送的信号列表如下:
Ⅲ. kill -9 pid命令,是向进程号为pid的进程发送SIGKILL信号,SIGKILL既不能被应用程序捕获,也不能被阻塞或忽略,其动作是立即结束指定进程。也就是说,应用程序无法感应到SIGKILL信号,就会被收到SIGKILL信号的操作系统给杀死了。
4.am force-stop packagenam命令
am命令是Android在shell控制台通过am命令来发送Intent,它的源码位置在frameworks/base/cmds/am。其本身就是用java代码实现的。
am脚本文件:
Ⅰ.Android执行am命令其实就是通过运行shell脚本,然后在该脚本中运行app_process命令启动am.jar下的Am.java程序
Ⅱ.am.jar位置:/system/framework/am.jar
Ⅲ.Am.java下froce-stop pkgName源码:
让我们来看一下Am到底是什么:
首先,Am继承自BaseCommand:
读入命令并分析命令:
op为读取到的命令字符串,若命令为”force-stop”调用runForceStop()函数。
runForceStop()函数:
其实调用的是forceStopPackage(),mAm类型为IActivityManager类型,也就是调用 ActivityManager的forceStopPackage()
函数。
forceStopPackage()函数:
最终调用 ActivityManagerNative.forceStopPackage() 方法:
总结:三种结束进程方法对比
方法 | 介绍 | root权限 | Mainfest权限 |
killBackgroundProcesses | 系统根据包名来杀掉进程,并且如果系统需要这些进程的话,会重新启动这些进程。 | no | yes |
kill -9 pid | shell命令,此命令为Linux命令,Android底层是Linux,所以Android上可以使用所有Linux终端命令。 | yes | no |
am force-stop packageName | am是Android系统中/system/bin/目录下的一条命令。不仅可以在终端下启动应用程序,还可以启动Service、发送广播以及Intent、force stop process等。 | yes | no |
效果:
1.killBackgroundProcesses(pkgName):不能杀死如QQ、微信等这样的『顽固进程』
2.kill -9 pid:可以杀死类似于QQ、微信这样的进程,但是进程被杀死后又会重新启动。(一个正在运行的应用可能不止有一个进程,此时需要注意把该应用所有的进程全部杀死)
3.am force-stop packageName : 可以杀死类似QQ、微信这样的『顽固进程』,并且不会重启,效果同『设置』->『应用』->『应用程序名』->『强行停止』。会将整个程序所有进程全部杀死,无法收到一些推送消息、即时消息。