`
阿尔萨斯
  • 浏览: 4169353 次
社区版块
存档分类
最新评论

Android应对Activity进程被杀死

 
阅读更多


  通常在一部Android手机里同时运行着多个应用(app),每个app对应一个系统进程,当系统需要更多的资源(如内存)而空闲资源不足时,Android系统就会选择杀掉一些低优先级的进程以便释放所需资源,这也是Android开发与PC桌面开发不同的之处。
  Android系统进程优先级的高低通常是这样判断的:
1)如果一个app正在与用户交互,那么它所在的进程具有最高优先级;
2)如果一个app是可见的,例如被一个对话框部分遮挡,它所在进程具有第二高的优先级;
3)如果app当前是不可见的,也就是被切换到了后台,则它所在进程具有第三高的优先级;
4)如果这个后台app启动了一个service,则它比一般的后台app优先级高一些;
5)最后,如果一个进程里没有包含任何app,那么这个进程的优先级是最低;
  当系统资源严重不足时,任何一个进程都有可能被杀掉,而当用户想回到一个已经不存在于内存中的Activity时,系统只得新建一个这样的Activity对象并调用它的onCreate()方法进行恢复。因此有时就会出现如下情况:大部分时间运行正常,偶尔在切换Activity时出现空指针异常导致强制关闭,这多半是在onCreate()方法里使用了已经被重置为空的对象造成的。即使不出现异常,也会造成表单数据丢失,严重影响用户体验。
  要解决这类问题:
  1)不能抱现在手机内存大,进程一般不会被杀掉的侥幸心理,而应该以app随时都会被杀掉的态度来谨慎处理。
2)在适当的位置将Activity所需数据进行持久化(从ram复制到rom或sd卡),并在onCreate()方法里利用这些数据恢复现场,通常包括文档类型和用户状态类型。
对于文档类型:当用户离开当前Activity时,在onPause()方法里将当前正在编辑的文档持久化到SQLite数据库或者XML文件中,若当前Activity被杀死,可在onCreate()方法中恢复。
对于状态类型:可通过SharedPreferences在onPanse()方法中将当前状态信息保存,比如保存某个应用的视图配置信息,若当前Activity被杀死,可在onCreate()方法中恢复,这样就可以确保一个较好的用户体验。

  注意事项:
  1)通常在onPause()里持久化而不是在onSaveInstanceState()里,是因为前者比后者更可靠,因为onSaveInstanceState()不属于Activity生命周期的一部分,在onPause()里做持久化比较方便,缺点是调用次数稍多。
2)从Android 3.0版本开始,Activity进程在被系统杀掉之前,将保证onStop()方法先执行完成,因此如果我们开发的应用只运行在3.0以上,可以把持久化工作放在onStop()里以减少持久化的次数。
  总之一句话:在onPause()或者onStop()里持久化Activity数据,在onCreate()里恢复现场。

分享到:
评论

相关推荐

    快速入门android AIDL(开启多进程并进行通信)

    如果仅仅在子线程中运行,一旦开启该线程的Activity被杀死后,线程也被杀死,无法实现后台运行效果,更加不合理。而如果在另外一个进程中使用service后台运行,就显得十分恰当了。 二、由于android对单个应用所使用...

    在安卓进程中怎样保证service不被杀死

    看Android的文档知道,当进程长期不活动,或系统需要资源时,会自动清理门户,杀死一些Service,和不可见的Activity等所在的进程。但是如果某个进程不想被杀死(如数据缓存进程,或状态监控进程,或远程服务进程),...

    断点下载,杀进程或activity继续下载

    此demo在Eclipse环境下实现anroid 断点下载,杀进程或activity时,再次启动断续下载,不乱码,保证一定的下载速度

    Android Service 服务不被杀死的妙招

    Service是android 系统中的一种组件,它跟Activity的级别差不多,但是他不能自己运行,只能后台运行,并且可以和其他组件进行交互。 Android开发的过程中,每次调用startService...START_STICKY:如果service进程被

    KeepAlive:使用活页夹ioctl Android高级保活对抗Android上的强制停止杀死过程

    活着的KeepAlive是在(通过JNI复活进程)的基础上,实现了通过IOCTL复活进程,能最大程度提高复活率。 master分支是利用 libbinder.so 与 ActivityManagerService 通信的版本, ioctl分支是使用 ioctl 与 binder ...

    详解android webView独立进程通讯方式

    webView 在访问结束的时候可以直接杀死该进程,防止内存泄漏。 webView 在崩溃的时候不影响主进程。 webView独立进程需要注意什么 由于进程之间内存是独立的,所以导致了Appcation, 静态类需要在新的进程重新创建...

    Android 后台运行白名单实现保活

    我们知道,Android 系统会存在杀后台进程的情况,并且随着系统版本的更新,杀进程的力度还有越来越大的趋势。系统这种做法本身出发点是好的,因为可以节省内存,降低功耗,也避免了一些流氓行为。 但有一部分应用,...

    Android 实现彻底退出自己APP 并杀掉所有相关的进程

    彻底杀掉 App 相关进程的代码 public void killAppProcess() { //注意:不能先杀掉主进程,否则逻辑代码无法继续执行,需先杀掉相关进程最后杀掉主进程 ActivityManager mActivityManager = (ActivityManager)...

    利用Android两行代码真正杀死你的App

    这两种方法比较暴力,App进程会被直接杀掉,但是由于Android的安全机制,你会发现,在调用上述两种方法后,App会被自动重启,并未达到我们想要的杀死状态! 那我们该怎样实现真正的杀死App呢? 我认为需要两个步骤:...

    新版Android开发教程.rar

    � GPS 卫星导航功能,手机照相, MP3 ,蓝芽等均被列为 Android 所提供支持的基本选项。 � Android 的平台基本上是免费的,虽然有部份原生链接库会要求费用,但大部份是免权利金; Android 的 程序可以采用 JAVA ...

    Android中进程生命周期的优先级

    淘汰顺序的凭据就是系统进程的优先级了,优先级越高越不容易被杀死,反之亦然。系统总共为进程分了五个优先级,如下 一、前台进程(进程满足如下任一条件即为前台进程): 1. 拥有 一个执行了onresume方法正在与用户...

    android手机安全卫士

    显示当前系统运行的进程信息 显示系统内存信息, 可以杀死某个进程,批量杀死进程,通过桌面widget 实时展现用户当前的手机内存状态。 上网管理: 显示出每个程序wifi和3g/2g 访问的上传和下载的流量,帮助用户了解程序...

    Android 退出多Activity的application的方式方法

    3.直接杀死进程 4.采用SingleTask的特点,结束应用 5.第四种方式的更优雅实现 6.双击返回键退出 方式一:利用ActivityContainer管理所有的Activity引用 该方式是建立一个通用的Activity的父类 BaseActivity以及一...

    Android 安全退出应用程序的方法总结

    第一种方法:首先获取当前进程的id,然后杀死该进程。 android.os.Process.killProcess(android.os.Process.myPid()) 通过这种方式不能将应用程序完全杀死,并且他不会把当前应用应用的Activity的task任务栈清空 ...

    Android内存泄漏终极解决篇(下)

    一、概述 在 Android内存泄漏终极解决篇(上)中我们介绍了如何检查一个...所以在程序的运行期间,如果进程没有被杀死,静态变量就会一直存在,不会被回收掉。如果静态变量强引用了某个Activity中变量,那么这个Activ

    Java版水果管理系统源码-Android_MobiCop:手机卫士

    进行管理功能,主要用于显示当前手机运行的进程信息,并且该功能可以单个或批量杀死进程,并设置是否显示系统进程以及锁屏自动清理进程,进程管理的部分截图如图1-2所示。 1.1.3 手机杀毒 手机杀毒功能,主要是通过...

Global site tag (gtag.js) - Google Analytics