一般来说,在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. sql - 复制表

    1,复制表结构和内容 1)这个表: select * into new_table_name from old_table_name ref:SQL复制数据表及表结构

  2. AutoLayout学习之理解intrinsicContentSize,Content Hugging Priority,Content Compression Resistance Priority

    TableViewCell的高度计算应该是所有开发者都会使用到的东西,之前都是用代码计算的方法来计算这个高度.最近有时间看了几个计算Cell高度的方法.基本上都用到了AutoLayout,这篇首先介绍 ...

  3. IIS网站部署错误总结

    aspx 常见错误 CS0016: 未能写入输出文件“c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/... ...

  4. js bind

    1.作用 函数的bind方法用于将函数体内的this绑定到某个对象,然后返回一个新函数. //bind 相比于call apply   this 都等于 obj;   bind是产生一个新的函数 不执 ...

  5. 九度OJ 1025 最大报销额(01背包)

    题目1025:最大报销额 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2683 解决:608 题目描述: 现有一笔经费可以报销一定额度的发票.允许报销的发票类型包括买图书(A类).文具( ...

  6. css expression explaination

    http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx 据说已经被弃用的IE css写法,为了修复一些IE8及老版本 ...

  7. 安装 mysql

    1.安装mysql客户端 yum install mysql 2.安装mysql 服务器端 yum install mysql-server 3.配置 mysql字符集 /etc/my.cnf 加入 ...

  8. js学习笔记之:键盘应用

    为了方便用户操作,可以为用户设置(或者屏蔽)功能键,代替使用频率比较高的操作.本次,将学习一下基本的功能键使用方法.键盘和焦点使用.屏蔽按键等知识点,以及一些相关示例: 1 设置按键功能: 功能键主要 ...

  9. oracle创建表空间、用户、用户授权、删除表空间、删除用户

    --创建临时表空间 create temporary tablespace test_temp --test_temp表空间名称 tempfile 'E:\oracle\product\10.2.0\ ...

  10. Day1 初识Python

    (1)变量与赋值 name = "wanghuafeng" age = 29 print(name, age) a和b交换值 a = 3 b = 5 tmp = a a = b b ...