文档章节

Android应对Activity进程被杀死

yolinfeng
 yolinfeng
发布于 2015/05/09 21:09
字数 839
阅读 29
收藏 0


  通常在一部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()里恢复现场。

 

 

 

 

本文转载自:http://blog.csdn.net/xinzheng_wang/article/details/23036217

yolinfeng
粉丝 12
博文 196
码字总数 11946
作品 0
珠海
架构师
私信 提问
Android 进程和线程(一)

当一个应用程序组件启动并且应用还没有运行任何其他组件时,Android系统会给应用程序启动一个新的带有单一执行线程的Linux进程。默认情况下,同一应用程序的所有组件都运行在相同的进程和线程...

长平狐
2012/10/16
74
0
Android Activity---管理Activity的生命周期

通过实现回调方法来管理Activity的生命周期是开发强壮和灵活应用程序的关键。Activity的生命周期直接受到与之相关的Activity、任务和回退堆栈的影响。 Activity存在基本的三种状态: 恢复态(...

长平狐
2012/10/16
292
0
Android安全模型之Android安全机制(内存管理)

Ashmem匿名共享内存 Android的匿名共享内存(Ashmem)机制基于Linux内核的共享内存,但是Ashmem与cache shrinker关联起来,增加了内存回收算法的注册接口,因此Linux内存管理系统将不再使用内...

柳哥
2014/12/02
0
0
android 安全退出应用程序

正常关闭应用程序: 当应用不再使用时,通常需要关闭应用,可以使用以下三种方法关闭android应用: 第一种方法:首先获取当前进程的id,然后杀死该进程。 android.os.Process.killProcess(and...

长平狐
2012/09/03
248
0
Android 操作系统的内存回收机制

Android 是一款基于 Linux 内核,面向移动终端的操作系统。为适应其作为移动平台操作系统的特殊需要,谷歌对其做了特别的设计与优化,使应用程序关闭但不退出,并由操作系统进行进程 的回收管...

IBMdW
2012/08/11
14.6K
7

没有更多内容

加载失败,请刷新页面

加载更多

系列一、入门教程web端实现地图功能

废话不多说,社会我多多 实现步骤如下 第一步、在高德api注册账户 搜索高德api点击进入官网,自己注册一个账号,你懂得怎么注册撒 点击进入下图画框位置,来到官网api入门教程 第二步、按照以...

我叫小糖主
30分钟前
12
0
springboot统一校验validator实现

第一步: pom.xml需引入spring-boot-start-web依赖,其中包含validator框架包 <!--Spring Boot Web依赖--><dependency> <groupId>org.springframework.boot</groupId> <artifact......

zzx10
31分钟前
3
0
vue组件系列-预览、放大、缩小、旋转

这个用的是别人的,如果有问题,估计改起来会很纠结。 安装 npm install v-viewer --save 卸载 npm uninstall v-viewer 注册 在main.js中 // The Vue build version to load with the `impor...

轻轻的走过
33分钟前
3
0
Taro Input输入内容无法绑定state问题

在onInput事件中,返回内容,返回内容即是输入框内容 例如只能输入一个小数点: <Input type='digit' placeholder='带小数点的数字键盘' value={this.state.advance} onInput={ e => this.ch......

步步登高
34分钟前
2
0
Windows10远程连接CentOS7(搭建Xrdp服务器)

Windows10远程连接CentOS7(搭建Xrdp服务器) 听语音 浏览:0 | 更新:2018-02-11 12:56 1 2 3 4 5 6 7 分步阅读 通过VNC或Xdmcp的方式远程连接linux图形桌面,虽然都很方便,但有个缺点就是...

linjin200
34分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部