Android结束进程的方法

直奔主题,现在介绍一下Android中结束进程的几种方法。

1.void restartPackage(String packageName)
该方法为@Deprecated,实际调用的是killBackgroundProcesses(packageName)方法:
Android结束进程的方法_第1张图片
下面主要介绍一下 killBackgroundProcesses 方法。

2.void killBackgroundProcesses(String packageName)
该方法返回值为空,所以我们不知道我们要杀掉的进程是否被杀死。但是他可 以根据包名结束另外一个进程。需要添加权限:
Android结束进程的方法_第2张图片
下面我们来看一下它依次调用的函数:

  • 调用ActivityManagerNative的killBackgroundProcesses方法

    Android结束进程的方法_第3张图片

  • 其中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用户才能使用。
Android结束进程的方法_第4张图片

Ⅱ.kill命令支持发送的信号列表如下:

Android结束进程的方法_第5张图片

Ⅲ. 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结束进程的方法_第6张图片

Ⅰ.Android执行am命令其实就是通过运行shell脚本,然后在该脚本中运行app_process命令启动am.jar下的Am.java程序

Ⅱ.am.jar位置:/system/framework/am.jar

Android结束进程的方法_第7张图片

Ⅲ.Am.java下froce-stop pkgName源码:

让我们来看一下Am到底是什么:
首先,Am继承自BaseCommand:

这里写图片描述

读入命令并分析命令:

Android结束进程的方法_第8张图片

op为读取到的命令字符串,若命令为”force-stop”调用runForceStop()函数。
runForceStop()函数:

Android结束进程的方法_第9张图片

其实调用的是forceStopPackage(),mAm类型为IActivityManager类型,也就是调用 ActivityManager的forceStopPackage()函数。
forceStopPackage()函数:

Android结束进程的方法_第10张图片

最终调用 ActivityManagerNative.forceStopPackage() 方法:

Android结束进程的方法_第11张图片

总结:三种结束进程方法对比
方法 介绍 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、微信这样的『顽固进程』,并且不会重启,效果同『设置』->『应用』->『应用程序名』->『强行停止』。会将整个程序所有进程全部杀死,无法收到一些推送消息、即时消息。

你可能感兴趣的:(Android)