文档章节

Android 异常退出的生命周期分析

徐昊
 徐昊
发布于 2016/11/03 12:18
字数 821
阅读 11
收藏 0

这里写图片描述

概述:

典型的Activity 生命周期众所周知,就不用多说了吧;我们知道,Activity除了受用户操作所导致的正常的生命周期方法调度,还有一些异常情况,比如当资源相关的系统配置发生了改变以及系统内存不足时,Activity就可能被杀死,下面就来具体分析这两种情况。

情况一 :
当一个activity的config改变的时候,Activity就会被杀死然后重建

而我们最熟悉的config的改变就是屏幕方向改变,系统语言改变,还有键盘可见改变了等等,系统配置发生了改变,在默认情况下,Activity就会被销毁并且重新创建,当然我们也可阻止系统重新创建我们的Activity。

在默认情况下,如果我们的Activity不做特殊处理,那么当系统配置发生改变后,Activity就会被销毁并重新创建,如图所示:
这里写图片描述

当系统配置发生改变后,Activiy会被销毁,其onPause、onStop、onDestroy 均会被调用,同时由于Activiy 是在异常情况下终止的,系统会在onStop之前调用onSaveInstanState来保存当前Activiy的状态。
所以当出现异常有重要的数据需要恢复的,要在这里做一些数据的保存工作;系统只会帮我们保存视图。

@Override
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
   //在这里我们可以把我们需要保存的东西给写入Bundle 
   //....... 
}

然后我们保存的数据就可以在onCreate中来读取了:

@Override protected void onCreate(Bundle savedInstanceState) {       
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);
    if(savedInstanceState != null){
        //TODO 取出数据
    } 
  }

另一种就是一个独立的回调了:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
}

二者的区别是:onRestoreInstanceState一旦被调用,其参数Bundle savedInstanceState 一定是有值的,我们不用额外的判断是否为空;但是onCreate不行,这两个方法都可以进行数据恢复,但是Google建议采用onRestoreInstanceState 去恢复数据。


情况二:
资源内存不足导致低优先级的Activity被杀死

Activity 按照优先级从高到低,可以分为三种:
(1)前台Activity——正在和用户交互的Activity,优先级最高。
(2)可见但非前台Activity——比如Activity中弹出了一个另外一个Activity的主题设置的Dialog,导致Activity可见但是位于后台无法和用户直接交互。
(3)后台Activity——已经被暂停的Activity,比如执行了onStop,优先级最低。

当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在的进程,并通过onSaveInstanState和onRestoreInstanceState 来存储和恢复数据。如果一个进程中没有四大组件在执行,那么这个进程将很快被系统杀死,因此,一些后台工作不适合脱离四大组件而独自运行在后台中,这样进程很容易被杀死。建议将后台工作放入Service中从而保证进程有一定的优先级,这样就不会轻易地被系统杀死了。

NOTES:虽然内容很简单,但也是博主辛苦的做了下笔记,转载请注明出处!

© 著作权归作者所有

徐昊

徐昊

粉丝 1
博文 84
码字总数 174446
作品 2
杨浦
Android工程师
私信 提问
Android 官方架构组件(二)——LiveData

上一篇文章讲到了Android架构组件之一Lifecycle(Android 官方架构组件(一)——Lifecycle),现在我们再来看看另一个成员LiveData。 LiveData是google发布的lifecycle-aware components中的...

Android小安
01/23
0
0
Service的生命周期与Activity生命周期区别

碰到一面试题 简述activity/service生命周期? 组件的生命周期 应用程序组件都有一个生命周期,从响应Intent的Android实例开始到这个实例被销毁。在这期间,他们或许有效或许无效,有效时或许...

xiahuawuyu
2012/07/24
0
0
【Android学习总结】之Activity:深入理解、体验Activity的生命周期

【本博客内的文章是本人的学习笔记总结,如有错误请各位批评指正,谢谢!欢迎加入群285077071讨论】 关于Activity的生命周期的学习,我将从以下几个方面入手来全面认识: 一、什么是生命周期...

kinbos
2018/06/26
0
0
浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法

http://www.tuicool.com/articles/2eM32a 原文 http://my.eoe.cn/916054/archive/24053.html 自从Android3.0引入了Fragment之后,使用Activity去嵌套一些Fragment的做法也变得更加流行,这确...

毛朱
2014/11/13
0
0
Android开发学习记录(2015-05-19 23:05:34更新)

占个坑位,日后增加,哈哈 -----------------分割线------------------- 发了以上这篇日志,居然意外的访问量飙升,几小时阅读破百。 真心搞不懂,是不是我这个标题太惹人注意了。真心感觉对...

听_风
2015/05/14
0
6

没有更多内容

加载失败,请刷新页面

加载更多

基础工具类

package com.atguigu.util;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid......

architect刘源源
今天
43
0
P30 Pro劲敌!DxO官宣新机:排行榜又要变

5月26日晚间,DxOMark官方推特预告,将在5月27日公布一款新机型的DxOMark评分,猜猜是哪款? 网友猜想的机型有:红米K20、谷歌Pixel 3a、索尼Xperia 1、诺基亚9 PureView等。 DxOMark即将公布...

linux-tao
昨天
15
0
Ubuntu18.04.2窗口过小不能自适应(二次转载)

解决Ubuntu在虚拟机窗口不能自适应 2018年09月06日 16:20:08 起不了名儿 阅读数 855 此博文转载:https://blog.csdn.net/nuddlle/article/details/77994080(原地址) 试了很多办法这个好用 ...

tahiti_aa
昨天
2
0
死磕 java同步系列之CountDownLatch源码解析

问题 (1)CountDownLatch是什么? (2)CountDownLatch具有哪些特性? (3)CountDownLatch通常运用在什么场景中? (4)CountDownLatch的初始次数是否可以调整? 简介 CountDownLatch,可以...

彤哥读源码
昨天
6
0
Nginx提供下载apk服务

有时候我们可能需要提供文件或者其他apk下载链接,通过 nginx 配置可以很简单地实现。 server {    listen 80;    server_name download.xxx.com;    root app;    locati...

Jack088
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部