zoukankan      html  css  js  c++  java
  • 异常情况下的Activity生命周期分析

    情况1:资源相关的系统配置发生改变

    资源相关的系统配置发生改变,举个栗子。当前Activity处于竖屏状态的时候突然转成横屏,系统配置发生了改变,Activity就会销毁并且重建,其onPause, onStop, onDestory均会被调用。因为实在异常情况下终止的,所以系统会调用onSaveInstanceState来保存当前Activity状态。这个方法是在onStop之前,与onPause没有固定的时序关系。当Activity重建的时候系统会把onSaveInstanceState所保存的Bundle作为对象传递给onRestoreInstanceState和onCreate方法。

    注:

    • View的源码中每个View都有onSaveInstanceState和onRestoreInstanceState这两个方法。
    • 接收位置可以是onRestoreInstanceState和onCreate方法,区别是:onRestoreInstanceState如果被调用,参数Bundle一定是有值的,在onCreate中需要判断参数是否为null。
    • onSaveInstanceState只有在Activity即将销毁并有机会重新显示时才会调用,正常销毁的Activity生命周期中不会调用,比如:旋转屏幕,按Home键,启动新Activity等。

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

    Activity优先级

    1. 前台Activity——正在和用户交互的Activity,优先级最高
    2. 可见但非前台Activity——Activity中弹出的对话框导致Activity可见但无法交互
    3. 后台Activity——已经被暂停的Activity,优先级最低

    系统内存不足是,会按照以上优先级杀死Activity,并通过onSaveInstanceState和onRestoreInstanceState这两个方法来存储和恢复数据。

    不让Activity重新创建的方法

    系统配置有很多内容,当某项改变时,我们不想让Activity重新创建可以在AndroidMainfest中给Activity指定configChanges属性。比如

    1
    android:configChanges="orientation"

    android:configChanges="xxx"属性,常用的主要有下面三个选项:
    local:设备的本地位置发生了变化,一般指切换了系统语言;
    keyboardHidden:键盘的可访问性发生了变化,比如用户调出了键盘;
    orientation:屏幕方向发生了变化,比如旋转了手机屏幕。
    配置了android:configChanges="xxx"属性之后,Activity就不会在对应变化发生时重新创建,而是调用Activity的onConfigurationChanged方法。

    注意:

    新Activity是透明主题时,旧Activity不会走onStop;

    Activity切换时,旧Activity的onPause会先执行,然后才会启动新的Activity;

    Activity在异常情况下被回收时,onSaveInstanceState方法会被回调,回调时机是在onStop之前,当Activity被重新创建的时 候,onRestoreInstanceState方法会被回调,时序在onStart之后;

  • 相关阅读:
    HDU 1863 畅通工程(Kruskal)
    HDU 1879 继续畅通工程(Kruskra)
    HDU 1102 Constructing Roads(Kruskal)
    POJ 3150 Cellular Automaton(矩阵快速幂)
    POJ 3070 Fibonacci(矩阵快速幂)
    ZOJ 1648 Circuit Board(计算几何)
    ZOJ 3498 Javabeans
    ZOJ 3490 String Successor(模拟)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
  • 原文地址:https://www.cnblogs.com/krislight1105/p/5295955.html
Copyright © 2011-2022 走看看