怎样使一个Android应用不被杀死 android:persistent

参考资料:

http://www.th7.cn/Program/Android/201406/213377.shtml

通过在androidmanifest.xml中的application标签中加入android:persistent="true"属性后的确就能够达到保证该应用程序所在进程不会被LMK杀死。但有个前提就是应用程序必须是系统应用,也就是说应用程序不能采用通常的安装方式。必须将应用程序的apk包直接放到/system/app目录下。而且必须重启系统后才能生效

===============================

1. android:persistent

在Android系统中,有一种永久性应用。它们对应的AndroidManifest.xml文件里,会将persistent属性设为true。

在系统启动之时,AMS的systemReady()会加载所有persistent为true的应用。

在PKMS中,有一个记录所有的程序包信息的哈希表(mPackages),每个表项中含有ApplicationInfo信息,该信息的flags(int型)数据中有一个专门的bit用于表示persistent。getPersistentApplications()函数会遍历这张表,找出所有persistent包,并返回ArrayList<ApplicationInfo>。

带persistent标志的系统应用(即flags中设置了FLAG_SYSTEM)是一定会被选上的,但如果不是系统应用的话,则要进一步判断当前是否处于“安全模式”,一旦处于安全模式,那么就算应用设置了persistent属性,也不会被选中。

那些persistent属性为true的应用,基本上都是在系统启动伊始就启动起来的。

因为启动进程的过程是异步的,所以我们需要一个缓冲列表(即上面代码中的mPersistentStartingProcesses列表)来记录那些“正处于启动状态,而又没有启动完毕的”ProcessRecord结点。一旦目标进程启动完毕后,目标进程会attach系统,于是走到AMS的attachApplicationLocked(),在这个函数里,会把目标进程对应的ProcessRecord结点从mPersistentStartingProcesses缓冲列表里删除。

如何保证应用的持久性(persistent)

我们知道,persistent一词的意思是“持久”,那么persistent应用的意思又是什么呢?简单地说,这种应用会顽固地运行于系统之中,从系统一启动,一直到系统关机。

为了保证这种持久性,persistent应用必须能够在异常出现时,自动重新启动。在Android里是这样实现的。每个ActivityThread中会有一个专门和AMS通信的binder实体——final ApplicationThread mAppThread。这个实体在AMS中对应的代理接口为IApplicationThread。

当AMS执行到attachApplicationLocked()时,会针对目标用户进程的IApplicationThread接口,注册一个binder讣告监听器,一旦日后用户进程意外挂掉,AMS就能在第一时间感知到,并采取相应的措施。如果AMS发现意外挂掉的应用是persistent的,它会尝试重新启动这个应用。

注册讣告监听器的代码如下:

AppDeathRecipient adr = new AppDeathRecipient(app, pid, thread);thread.asBinder().linkToDeath(adr, 0);app.deathRecipient = adr;

其中的thread就是IApplicationThread代理。

时间: 2024-11-03 20:22:52

怎样使一个Android应用不被杀死 android:persistent的相关文章

【Android】怎样使一个Android应用不被杀死?(整理)

[转载]怎样使一个Android应用不被杀死?(整理) 原文地址:怎样使一个Android应用不被杀死?(整理)作者:飘锦丹枫 参考:http://blog.csdn.net/windskier/article/details/6560925http://blog.csdn.net/zmyde2010/article/details/6756368http://blog.sina.com.cn/s/blog_514048cb0100wi2j.html 方法:对于一个service,可以首先把它设

[Android Memory] 怎样使一个Android应用不被杀死

转载自: http://blog.sina.com.cn/s/blog_3e3fcadd0100yjo2.html 参考:http://blog.csdn.net/windskier/article/details/6560925http://blog.csdn.net/zmyde2010/article/details/6756368http://blog.sina.com.cn/s/blog_514048cb0100wi2j.html 方法:对于一个service,可以首先把它设为在前台运行

保证Android后台不被杀死的几种方法

由于各种原因,在开发Android应用时会提出保证自己有一个后台一直运行的需求,如何保证后台始终运行,不被系统因为内存低杀死,不被任务管理器杀死,不被软件管家等软件杀死等等还是一个比较困难的问题.网上也有各种方案,笔者经过自己试验学习尝试总结了3中还可以的方式,记录如下.并不是绝对保证,不过确实提高了存活率不少. 方式一:service绑定通知栏成为前台服务 android中实现后台一般通过service方式,但系统本身会在内存低等情况下杀死service.通过将service绑定到notifi

Android防止Service被杀死

1. Service被杀死的两种场景 1.2 系统回收 在系统内存空间不足时可能会被系统杀死以回收内存,内存不足时Android会依据Service的优先级来清除Service. 1.2 用户清除 用户可以在"最近打开"(多任务窗口.任务管理窗口)中清除最近打开的任务,当用户清除了Service所在的任务时,Service可能被杀死(不同ROM有不同表现,在小米.魅族等第三方产商定制ROM上一般会被立即杀死,在Android N上没有被立即杀死). 2. 解决方案 对于第一种场景(系统

无废话Android之smartimageview使用、android多线程下载、显式意图激活另外一个activity,检查网络是否可用定位到网络的位置、隐式意图激活另外一个activity、隐式意图的配置,自定义隐式意图、在不同activity之间数据传递(5)

1.smartimageview使用 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"

Kivy a to Z -- 一个简单的通过adb同步Android系统文件的工具

来兴趣时写了些Kivy的代码,调试却总感觉不是很方便.直接打包到public.mp3的方式太繁锁,用文件共享的软件又发现没有一个好用的, 用samba filesharing本来也只是慢,但是更新的版本之后就一直提示说wifi没有tethering,意思是wifi热点没有打开,但是打开了还是提示没有tethering. 找了个叫什么卓*力的文件管理器,下载了samba插件后输入用户名和密码死活不对,被搞得实在恼火,花了点时间写了个通过adb同步安卓文件的工具,用着也挺爽的. 事件为什么总是要搞得

使一个特定的表格隔行变色(引自锋利的jQuery)

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta name="generator" content="editplus" /> <title>使一个特定的表格隔行变色</title> <script src="jquery-1.7.1.min.js" ty

如何使一个你没有源代码的DLL文件变为强命名的DLL

转载: 有时候你会需要一个DLL是强命名的,比如你想把这个文件放到GAC里面.如果这是一个第三方的DLL,你没有源代码,这会是一件比较麻烦的事情.有一个方法可以解决这个问题. 在VS.NET的命名行窗口下,输入如下的代码. 1 ,生成一个KeyFile sn -k keyPair.snk 2, 得到程序集的MSIL ildasm SomeAssembly.dll /out:SomeAssembly.il 3 ,为了避免冲突,把原来的DLL文件改名 ren SomeAssembly.dll Som

一个完整的菜谱客户端(android源码)(有独立后台)

该源码是自己写的,是一个完整的菜谱类客户端.功能简单比较简单,界面比较丑,自己乱拼接的,只为学习用.功能相对完整,数据来自独立后台,通过http协议获取,全部来自真实数据.代码里面有获取数据的相应url,url请大家不要用做商业用途,用来学习就行了.有需要的朋友可以下载看看,希望对大家有点帮助.代码比较随意比较乱,只为实现功能,请大家见谅undefined <ignore_js_op> <ignore_js_op> <ignore_js_op>  详细说明:http:/