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

1.void restartPackage(String packageName)

该方法为@Deprecated,实际调用的是killBackgroundProcesses(packageName)方法:

Android 终止APP方法 安卓系统如何终止进程_jar


下面主要介绍一下 killBackgroundProcesses 方法。2.void killBackgroundProcesses(String packageName)

该方法返回值为空,所以我们不知道我们要杀掉的进程是否被杀死。但是他可 以根据包名结束另外一个进程。需要添加权限:<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

Android 终止APP方法 安卓系统如何终止进程_Android 终止APP方法_02


下面我们来看一下它依次调用的函数:

  • 调用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用户才能使用。

Android 终止APP方法 安卓系统如何终止进程_jar_03

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

Android 终止APP方法 安卓系统如何终止进程_Android 终止APP方法_04

Ⅲ. 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 终止APP方法 安卓系统如何终止进程_jar_05

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

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

Android 终止APP方法 安卓系统如何终止进程_Android_06

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

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

Android 终止APP方法 安卓系统如何终止进程_Android 终止APP方法_07

读入命令并分析命令:

Android 终止APP方法 安卓系统如何终止进程_android_08

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

Android 终止APP方法 安卓系统如何终止进程_jar_09

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

Android 终止APP方法 安卓系统如何终止进程_应用程序_10

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

Android 终止APP方法 安卓系统如何终止进程_应用程序_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、微信这样的『顽固进程』,并且不会重启,效果同『设置』->『应用』->『应用程序名』->『强行停止』。会将整个程序所有进程全部杀死,无法收到一些推送消息、即时消息。