如何让自己的Android程序永不被系统kill
一般来说,在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的更多相关文章
- 【定有惊喜】android程序员如何做自己的API接口?php与android的良好交互(附环境搭建),让前端数据动起来~
一.写在前面 web开发有前端和后端之分,其实android还是有前端和后端之分.android开发就相当于手机app的前端,一般都是php+android或者jsp+android开发.androi ...
- 正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法
正在运行的android程序,按home键之后退回到桌面,在次点击程序图标避免再次重新启动程序解决办法 例如:一个android程序包含两个Activity,分别为MainActivity和Other ...
- 让Android程序获得系统的权限,实现关机重启,静默安装等功能
引用:http://www.cnblogs.com/welenwho/archive/2012/05/10/2494984.html android想要获得系统权限有几种途径,一种就是你的程序固化的系 ...
- 怎么让我们自己开发的Android程序设为默认启动
怎么让我们自己开发的Android程序设为默认启动呢?其实很简单,只要在AndroidManifest.xml文件中配置一下首次启动的那个Activity即要. <activity ...
- Android程序crash处理
Android程序crash处理 时间 2014-11-24 13:45:37 CSDN博客 原文 http://blog.csdn.net/allen315410/article/details ...
- 【Bugly干货分享】手把手教你逆向分析 Android 程序
很多人写文章,喜欢把什么行业现状啊,研究现状啊什么的写了一大通,感觉好像在写毕业论文似的,我这不废话,先直接上几个图,感受一下. 第一张图是在把代码注入到地图里面,启动首页的时候弹出个浮窗,下载网络的 ...
- android开发------第一个android程序
好吧,现在我们就一起来写第一个android程序,看它带给了我们什么.sdk的使用和虚拟机的创建我就不说了.项目创建过程先略过,不太重要. 那第一个程序我们能学到什么知识呢?一起看吧.^-^ 在IDE ...
- 小米手机(HM1SW)高通开发android程序全过程
小米手机(HM1SW)开发android程序全过程 修改历史: 2016年5月9日 -------- 整理文档 a.增加了手机基本信息. b.增加360手机助手连接说明 2016年2月26日 - ...
- 使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB)
使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB) http://www.cnblogs.com/mrkelly/p/4015245.html 以往调试Androi ...
随机推荐
- c-指针的指针
概述: 贴上一个'经典C语言程序设计100例'的第77个程序 #include <stdio.h> int main(void) { char *s[]={"man", ...
- ASP.NET性能优化小结
一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的 ...
- 浏览器中 for in 反射 对象成员 的差异
http://www.cnblogs.com/_franky/archive/2010/05/08/1730437.html 下面是例子 function test(url, obj) { if($( ...
- 一个tomcat部署俩个java web项目
2.发布的时候可以发布成war包,用项目名称右键export,选择项目名称,还有发布的路径,即tomcat下的路径,参考http://zhidao.baidu.com/link?url=imOu0Uu ...
- Swift - 28 - 内部参数名和外部参数名
//: Playground - noun: a place where people can play import UIKit // 外部参数的作用是为了让程序员调用代码的时候能清晰的看出所传参数 ...
- 自定义UITableViewCell时, 使用autoLayout, 无法很好的做到屏幕适配
解决方法: 重写cell的setFrame方法即可 - (void)setFrame:(CGRect)frame { frame.size.width = self.window.frame.size ...
- javascript入门学习笔记
<button type="button" onclick="alert('Welcome!')">点击这里</button>alert ...
- C++学习之DLL注入
#include<stdio.h> #include<Windows.h> #include<TlHelp32.h> //typedef unsigned long ...
- PHP Predefined Interfaces 预定义接口
SPL提供了6个迭代器接口: Traversable 遍历接口(检测一个类是否可以使用 foreach 进行遍历的接口) Iterator 迭代器接口(可在内部迭代自己的外部迭代器或类的接口) Ite ...
- C程序设计语言练习题1-23
练习1-23 编写一个删除C语言程序中所有的注释语句.要正确处理带引号的字符串与字符常量.在C语言中,注释不能嵌套. 代码如下: #include <stdio.h> // 包含标准库的信 ...