一般来说,在Android系统中,当某进程较长时间不活动,或系统资源比较紧时,该进程可能被系统kill掉,以此来回收一些资源。Android系统会根据进程的优先级来选择性地杀死一些进程,优先级从高到低依次是:

1. 前台进程(Foreground Process)

2. 可视进程(Visible Process)

3. 服务进程(Service Process)

4. 后台进程(Background Process)

5. 空进程(Empty Process)

1. 前台进程(Foreground Process)是指当前的活动进程,即那些有窗口、控件的,正与用户进行交互的应用程序进程。Android会努力尝试从其它进程回收系统资源来保持其响应。

2. 可见进程(Visible Process)是指那些可见的活动进程,但是当前它不在前台运行,不能对用户事件作出反映。比如一个程序A正在前台运行,接着又启动了另一个程序B,程序B的窗口把程序A的窗口完全或部分遮挡,那么,程序A现在就属于可见进程了。一般来说,只有在系统资源十分缺乏的情况下,为了保证活动进程的运行,系统才会终止它。

3. 服务进程(Service Process)是指那些没有可见界面的进程,它们不能直接与用户进行交互。前台进程(通常是一个Activity)变为非活动时,会暂停运行;但服务进程可在后台保持运行,因此如果要保持进程在转到后台后也能运行,就必需启动一个Service。但是一旦前台进程需要资源时,Service就很容易被系统给kill掉。通常,默认情况下Service被kill掉后会自动重启,但是重启后并不能保证恢复先前的环境;如果不需要Service自动重启,调用stopSelf()函数即可。

4. 后台进程(Background Process)是指不可见的,且没有任何正在运行的服务的活动的进程。通常后台进程会比较多,Android将按“最后一个被看到,第一个终止”的方式来终止它们,从而为前台进程提供资源。

5. 对于空进程,Android为了提高系统的整体性能,经常在在应用程序的生存期结束后仍然把它们保存在内存中,当该程序被再次启动时,可以加快启动速度。这类进程会根据需要被定期终止。

由上可知,要想自己所写的Service不轻易被系统在回收资源时kill掉,正常的做法是尽量提高程序的优先级,如调用startForeground(true)。因为Service启动时默认被标记为Background,当前运行的Activity被标记为Foreground,当将Service设置为Foreground后,它的优先级就与正在运行的Activity类似,但是这也不能保证它不被系统kill。

如果我们要写一个监控程序,监测其它程序的运行,那么该怎么办呢?我们必需保证我们的程序不会因回收资源而kill。显然,优先级为2-5的进程都不可靠,作为监控程序,其优先级也不可能为1。

这样看上去,貌似没有办法了……别急,继续看下面……

解决方法:

简单地说,就是将自己写的Service变成Core Service,即将自己写的程序提升为系统级别的程序,这样在任何情况下它都不会被kill掉。

要想自己写的Service提升为Core Service,应用程序需要设置两个标志:FLAG_PERSISTENT和FLAG_SYSTEM。

具体做法如下:

1. 设置FLAG_PERSISTENT:在AndroidManifest.xml文件中,加入android:persistent="true" ;

2. 设置FLAG_SYSTEM:将你写的应用程序放到/system/app/目录下即可。具体操作如下:

A. 使用Cygwin或cmd进入你工程所在的bin目录中,然后执行如下两条命令:

adb remount

adb push yourpackage.apk /system/app/

命令adb remount是为了获取系统目录的临时操作权限,然后使用push命令将自己写的程序包上传到系统应用程序目录中。

B. 重启手机。开机后,在应用列表中就可以看到你写的程序了。

需要说明的是:系统程序不能像非系统程序那样使用adb install yourpackage.apk来安装apk包,我们只需要将apk包拷贝到/system/app/目录下重启即可。如果使用adb install的方式,那么FLAG_SYSTEM标志不会被设置,FLAG_PERSISTENT标志也将不起任何作用。

C. 如果需要卸载自己写的系统应用程序,可执行如下命令:

adb remount

adb shell rm /system/app/yourpackage.apk

另外,还需要说明的是,如果想在模拟器中加入自己写的系统级应用程序,好像不行,因为将apk复制到/system/app/下后,还必需重启,但模拟器一重启,系统目录也将恢复初始状态。不过网上好像有人做到了,方法也很简单,就是将Android源码相应地方稍改下,然后重新编译……

现在,我们就可以让我们的程序为所欲为了~

如何让自己的Android程序永不被系统kill的更多相关文章

  1. 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~

    一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...

  2. 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法

    正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法 例如:一个android程序包含两个Activity,分别为MainActivity和Other ...

  3. 让Android程序获得系统的权限,实现关机重启,静默安装等功能

    引用:http://www.cnblogs.com/welenwho/archive/2012/05/10/2494984.html android想要获得系统权限有几种途径,一种就是你的程序固化的系 ...

  4. 怎么让我们自己开发的Android程序设为默认启动

    怎么让我们自己开发的Android程序设为默认启动呢?其实很简单,只要在AndroidManifest.xml文件中配置一下首次启动的那个Activity即要. <activity        ...

  5. Android程序crash处理

    Android程序crash处理 时间 2014-11-24 13:45:37  CSDN博客 原文  http://blog.csdn.net/allen315410/article/details ...

  6. 【Bugly干货分享】手把手教你逆向分析 Android 程序

    很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...

  7. android开发------第一个android程序

    好吧,现在我们就一起来写第一个android程序,看它带给了我们什么.sdk的使用和虚拟机的创建我就不说了.项目创建过程先略过,不太重要. 那第一个程序我们能学到什么知识呢?一起看吧.^-^ 在IDE ...

  8. 小米手机(HM1SW)高通开发android程序全过程

    小米手机(HM1SW)开发android程序全过程 修改历史: 2016年5月9日  --------  整理文档 a.增加了手机基本信息. b.增加360手机助手连接说明 2016年2月26日  - ...

  9. 使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB)

    使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB) http://www.cnblogs.com/mrkelly/p/4015245.html 以往调试Androi ...

随机推荐

  1. Java中final关键字的用法

  2. bootstrap sr-only

    有时候 UI 上会出现一些仅供视觉识别的元素,比如说“汉堡包菜单按钮”,只有视力正常的人才能清楚辨识这些元素的作用.而残障人士,比如弱势或盲人是不可能知道这些视觉识别元素是什么的.他们上网使用的是屏幕 ...

  3. html5--canvas学习笔记

    1. 添加<canvas>元素 right: <canvas id="myCanvas" width="300" height="3 ...

  4. text-overflow:ellipsis 的应用(转载)

    关键字: text-overflow:ellipsis 语法:text-overflow : clip | ellipsis 取值: clip :默认值 .不显示省略标记(...),而是简单的裁切. ...

  5. TCP回射服务器程序:str_echo函数

    str_echo函数执行处理每个客户的服务: 从客户读入数据,并把它们回射给客户 读入缓冲区并回射其中内容: read函数从套接字读入数据,writen函数把其中内容回射给客户 如果客户关闭连接,那么 ...

  6. 完整的struts.xml文件骨架

    完整的struts.xml文件骨架可以直接拿来用,修改一下就可以啦. <?xml version="1.0" encoding="UTF-8"?> ...

  7. .NET MVC执行过程

    1.网址路由比对 2.执行Controller与Action 3.执行View并返回结果 在使用MVC中是由IgnoreRoute()辅助方法对比成功的,会导致程序直接跳离MVC的执行生命周期,将程序 ...

  8. 生产环境下,不建议用早期版本的Mono........

    一个BUG修复需要4年!!!!!!!!!!!!!也是醉了....不造被微软收购后的Xamarin会不会好起来

  9. 关于windows service不能访问网络共享盘(NetWork Drive)的解决方案

    我映射一个网络驱动器到本机的时候,发现本机的程序直接能访问读取网络驱动器,但是把本机的程序作为本机的windows服务运行的时候就不能访问了. Qt中的QDir::exist(folder)访问失败. ...

  10. onItemClickListener监听的整个item的点击。如何只监听那个framelayout的点击 onItemClickListener监听的整个item的点击。如何只监听那个framelayout的点击

    已经知道了.复写getView()的时候,在内部Viewholder.length.setOnClickListener(匿名内部类)   然后新建一个接口方进去 ,然后外面的listView设置&l ...