Android中,虽然有很多方法(API或者shell命令)杀死后台`service`,但是仍然有很多程序几秒内再次启动,导致无法真正的杀死。这里主要着重介绍如何像 360 一样杀死Android后台服务,而不会再次启动。

一、已知的 kill 后台应用程序的方法

  • android.os.Process.killProcess(pid);
  • activityManager.killBackgroundProcesses(pkgName);
  • kill -9 pid

这三种方法都可以“杀死”后台应用程序,但是都会自启动,对于前面两种直接使用Android的API就行了,所以就不多介绍了。这里稍微介绍一下 最后一个方法的用法: kill -9 pid;

方法: kill -9 pid

这其实是一条shell 命令,我们知道Android的底层是Linux系统,所以在Android上可以使用所有的Linux终端命令。那么如何结合在代码中呢,贴一段代码

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void killProcess(String pid) {
    Process sh = null;
    DataOutputStream os = null;
    try {
        sh = Runtime.getRuntime().exec("su");
        os = new DataOutputStream(sh.getOutputStream());
        final String Command = "kill -9 " + pid + "\n";
        os.writeBytes(Command);
        os.flush();
 
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 
    try {
        sh.waitFor();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 
}

该方法最重要的功能就是告诉你,怎么在Android程序中执行Linux shell 命令


二、终极方法,杀死后台service而不自启动: am (Activity Manager)命令

相信很多人对 am 命令都挺熟悉的,它是Android系统中/system/bin/目录下的一条命令。不仅可以在终端下启动一个应用程序,还可以启动Service,发送 bro

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void forceStopAPK(String pkgName){
    Process sh = null;
    DataOutputStream os = null;
    try {
        sh = Runtime.getRuntime().exec("su");
        os = new DataOutputStream(sh.getOutputStream());
        final String Command = "am force-stop "+pkgName+ "\n";
        os.writeBytes(Command);
        os.flush();
 
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 
    try {
        sh.waitFor();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

通过上面的这段代码,我们调用forceStopAPK方法,传递一个应用程序的包名,那么我们就可以杀死对应的Android程序,而不会自动启动。亲测:微信,淘宝,酷我,等一系列应用,杀死后不会再启动!Android中,虽然有很多方法(API或者shell命令)杀死后台`service`,但是仍然有很多程序几秒内再次启动,导致无法真正的杀死。这里主要着重介绍如何像 360 一样杀死Android后台服务,而不会再次启动。

一、已知的 kill 后台应用程序的方法

  • android.os.Process.killProcess(pid);
  • activityManager.killBackgroundProcesses(pkgName);
  • kill -9 pid

这三种方法都可以“杀死”后台应用程序,但是都会自启动,对于前面两种直接使用Android的API就行了,所以就不多介绍了。这里稍微介绍一下 最后一个方法的用法: kill -9 pid;

方法: kill -9 pid

这其实是一条shell 命令,我们知道Android的底层是Linux系统,所以在Android上可以使用所有的Linux终端命令。那么如何结合在代码中呢,贴一段代码

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void killProcess(String pid) {
    Process sh = null;
    DataOutputStream os = null;
    try {
        sh = Runtime.getRuntime().exec("su");
        os = new DataOutputStream(sh.getOutputStream());
        final String Command = "kill -9 " + pid + "\n";
        os.writeBytes(Command);
        os.flush();
 
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 
    try {
        sh.waitFor();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 
}

该方法最重要的功能就是告诉你,怎么在Android程序中执行Linux shell 命令


二、终极方法,杀死后台service而不自启动: am (Activity Manager)命令

相信很多人对 am 命令都挺熟悉的,它是Android系统中/system/bin/目录下的一条命令。不仅可以在终端下启动一个应用程序,还可以启动Service,发送 broadcast以及Intent actionforce stop process 等等,功能非常强大。这里我们要用到一个功能就是强制停止应用程序!
对于命令 am 的介绍与用法,官网给的非常情况,请参照Android 官网: http://developer.android.com/tools/help/adb.html#am

我们用到的方法和功能是:am force-stop <PACKAGE>
下面是我们的代码举例

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void forceStopAPK(String pkgName){
    Process sh = null;
    DataOutputStream os = null;
    try {
        sh = Runtime.getRuntime().exec("su");
        os = new DataOutputStream(sh.getOutputStream());
        final String Command = "am force-stop "+pkgName+ "\n";
        os.writeBytes(Command);
        os.flush();
 
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
 
    try {
        sh.waitFor();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

通过上面的这段代码,我们调用forceStopAPK方法,传递一个应用程序的包名,那么我们就可以杀死对应的Android程序,而不会自动启动。亲测:微信,淘宝,酷我,等一系列应用,杀死后不会再启动!

Android中如何像 360 一样优雅的杀死后台服务而不启动的更多相关文章

  1. Android中如何像 360 一样优雅的杀死后台Service而不启动

    http://my.oschina.net/mopidick/blog/277813 目录[-] 一.已知的 kill 后台应用程序的方法 方法: kill -9 pid 二.终极方法,杀死后台ser ...

  2. Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)

    本节内容主要是讲解ActivityManager的使用,通过ActivityManager我们可以获得系统里正在运行的activities,包括 进程(Process)等.应用程序/包.服务(Serv ...

  3. Android中实现Activity的启动拦截之----实现360卫士的安装应用界面

    第一.摘要 今天不是周末,但是我已经放假了,所以就开始我们的技术探索之旅,今天我们来讲一下Android中最期待的技术,就是拦截Activity的启动,其实我在去年的时候,就像实现这个技术了,但是因为 ...

  4. Android中矢量动画

    Android中矢量动画 Android中用<path> 标签来创建SVG,就好比控制着一支画笔,从一点到一点,动一条线. <path> 标签 支持一下属性 M = (Mx, ...

  5. Android中的动画机制

          1 逐帧动画   逐帧动画 就是一系列的图片按照一定的顺序展示的过程.   逐帧动画很简单, 只需要在drawable中或者anim中定义一个Animation-list 其中包含多个it ...

  6. Android中自定义属性(attrs.xml,TypedArray的使用)

    做Android布局是件很享受的事,这得益于他良好的xml方式.使用xml可以快速有效的为软件定义界面.可是有时候我们总感觉官方定义的一些基本组件不够用,自定义组件就不可避免了.那么如何才能做到像官方 ...

  7. 关于Android中图片大小、内存占用与drawable文件夹关系的研究与分析

    原文:关于Android中图片大小.内存占用与drawable文件夹关系的研究与分析 相关: Android drawable微技巧,你所不知道的drawable的那些细节 经常会有朋友问我这个问题: ...

  8. Android中对Log日志文件的分析[转]

    一,Bug出现了, 需要“干掉”它 bug一听挺吓人的,但是只要你懂了,android里的bug是很好解决的,因为android里提供了LOG机制,具体的底层代码,以后在来分析,只要你会看bug, a ...

  9. Android中插件开发篇之----动态加载Activity(免安装运行程序)

    一.前言 又到周末了,时间过的很快,今天我们来看一下Android中插件开发篇的最后一篇文章的内容:动态加载Activity(免安装运行程序),在上一篇文章中说道了,如何动态加载资源(应用换肤原理解析 ...

随机推荐

  1. Notepad++中查找替换回车符

    用Nodepad++打开文件 View->Show Symbol->Show End of Line "End of Line"行结束符,由"CR" ...

  2. 重新开始学习javase_IO

    一,认识IO 通过数据流.序列化和文件系统提供系统输入和输出. 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接.类似的,当程序需要 ...

  3. Linux下python3与python3的多版本共存

    python3已经出来有些许时候了,python3相比python2进行了大量的改进,包括语法,新的功能,还有优化.虽然很多库已经同时支持 python2和python3了,但是有些库仍然没有很好的支 ...

  4. mysql 数据库查询与实例。

    资料是从教材弄下来的,加上了我的理解.主要内容是练习实例,在写博文中学习命令行,当然也希望这篇博文能帮助其他人学习mysq数据库命令 SELECT 语句可以从一个或多个表中选取特定的行和列 SELEC ...

  5. 关于jQuery表单校验的应用

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  6. laravel观察者模式

    laravel观察者模式: 事件

  7. c++内存管理错误记录

    extern "C" _CRTIMP int __cdecl _CrtIsValidHeapPointer( const void * pUserData ){ if (!pUse ...

  8. Egret 事件机制

    主要流程: private createGameScene():void { var JimGreen = new Boy(); var HanMeimei = new Girl(); JimGree ...

  9. openssl 进行证书格式的转换

    各类证书由于存储的内容不同(如是否包含公钥/私钥是否加密存储/单一证书或多证书等).采用编码不同(DER/BASE64).标准不同(如PEM/PKCS),所以尽管X.509标准规定了证书内容规范,但证 ...

  10. Linux Weblogic 数据源 TimesTen配置

    [wzh@localhost middleware]$ vi wlserver_10.3/common/bin/commEnv.sh [Linux] LD_LIBRARY_PATH=${PATCH_L ...