Android结束进程

1、自己结束自己 this.finish();

2、killProcess(int pid)

例子:android.os.Process.killProcess(android.os.Process.myPid());
对于这个方法,需要详细解释一下。在SDK的文档中,解释如下:
Kill the process with the given PID. Note that, though this API allows us to request to kill any process based on its PID, the kernel will still impose standard restrictions on which PIDs you are actually able to kill. Typically this means only the process running the caller's packages/application and any additional processes created by that app; packages sharing a common UID will also be able to kill each other's processes.
英语不好,不能准确翻译,所以希望大家自己理解,免得对大家造成误解。我个人对这句话的解释就是,这个方法使用是有条件的:
a、将被杀掉的进程 和 当前进程 处于同一个包或者应用程序中;
b、将被杀掉的进程 是由当前应用程序所创建的附加进程;
c、将被杀掉的进程 和 当前进程 共享了普通用户的UID。(这里的普通用户,是相对于Root权限的用户来说的)

3、System.exit(int code)
例子:System.exit(0);
该方法只能用于结束当前进程自身,个人觉得在程序遇到异常,无法正常执行时,可以通过这个方法强制退出。
  需要注意的是,这两个方法,会导致进程非正常退出,就是说,进程退出时不会去执行onPause、onStop和onDestroy方法,那么进程很有可能错过了保存数据的机会。因此,这两个方法最好使用在出现异常的时候!

4、killBackgroundProcesses(String packageName)
要通过一个进程去结束另一个进程。在之前的SDK版本中,一直使用方法restartPackage(packageName)方法,但是在Android的开发文档中介绍说,这个函数会导致一些问题( the previous behavior here is no longer available to applications because it allows them to break other applications by removing their alarms, stopping their services, etc.),所以建议大家使用一个新的方法:
  由于这个方法没有返回值,所以我们也不知道我们的目标进程是否真的退出了。但是,我目前只发现了这个可以结束另一个进程的方法。此方法需要权限:
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

5、利用反射调用forceStopPackage来结束进程

  Method forceStopPackage = am.getClass().getDeclaredMethod("forceStopPackage", String.class);

  forceStopPackage.setAccessible(true); 

  forceStopPackage.invoke(am, yourpkgname); 

注意:
    需要在manifest里加上shareduid定义:android:sharedUserId="android.uid.system"
    需要在manifest里加上权限:<uses-permission android:name="android.permission.FORCE_STOP_PACKAGES"></uses-permission>
    需要采用系统platform签名,因为需要用FORCE_STOP_PACKAGES权限,该权限只赋予系统签名级程序,然后经编译环境重新编译,即可实现强制停止指定程序

6、killall -HUP packageName || kill -9 pid

String cmd="killall -HUP com.android.test"; 
try { 
    Process process = Runtime.getRuntime().exec(cmd); 
    BufferedReader in = new BufferedReader(new InputStreamReader( 
                    process.getInputStream())); 
    String line = null; 
    while ((line = in.readLine()) != null) { 
        System.out.println("exec shell: == " + line); 
    } 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 


此方法理论上可行,但是应该需要系统级或底层的协助
此方法理论上可行,但是应该需要系统级或底层的协助
此方法理论上可行,但是应该需要系统级或底层的协助

 

 

 

 


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值