Android开发之Activity的生命周期详解

Android生命周期分为两部分:

(1)典型情况下的生命周期

(2)异常情况下的生命周期

典型情况下的生命周期分析

​图1 Activity的生命周期图解

​图2 Activity生命周期的金字塔图 

(1)典型情况下的生命周期指在有用户参与的情况下,Activity所经过的生命周期的改变,正常情况下,Activity的常用生命周期有以下几种情况:

onCreate():Activity启动后第一个被调用的函数,常用来进行Activity的初始化,如创建View,绑定数据和恢复数据。

onStart():当Activity显示在屏幕上时,函数被调用。

onRestart():Activity从停止状态进入活动状态是调用。

onResume():Activity可以接受用户输入时,该函数被调用,此时的activity位于activity栈的栈顶。

onPause():当Activity进入暂停状态时,该函数被调用,一般用来保存持久的数据或释放占用的资源。

onStop():当Activity变为不可见后,该函数被调用,Activity进入停止状态。

onDestroy():在Activity被终止前,被调用。

/*1.onCreate:
    每个Activity在写代码的过程中都会看见这个函数,
    是声明周期的第一个方法。
    一般做一些资源和数据初始化的工作,
    比如绑定相对应的资源布局setContentView*/
        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    
/*2.onRestart:
    字面意思表示Activity重新启动,这个状态一般由用户切换应用的行为产生,
    比如从应用切换到桌面或者切打开新的Activity,
    此时这个Activity就会调用onPause和onStop让这个Activity进入展厅状态。
    再回到这个Activity就是onRestart了*/
        @Override
    protected void onRestart() {
        super.onRestart();
    }
    
    
/*3.onStart:
    这个状态我理解就是Activity启动中的一个过程,
    就是启动中,但是还不能与用户交互(用户不可见),
    属于一个在后台的状态*/
        @Override
    protected void onStart() {
        super.onStart();
    }
    
    
/*4.onResume:
    表示Activity已经可见,且已经开始活动。
    与onStart类似的状态但是就是属于一种在前台的状态*/
        @Override
    protected void onResume() {
        super.onResume();
    }
    
    
/*5.onPause:
    是一个非常微妙的状态,处于正在停止的一个临界点,
    就很难重现这种状态,就是在停止过程中,
    先执行onPause然后在onStop执行之前,
    回到Activity执行onResume,这期间就是onPause的状态。
    此处可以做一些存储数据停止动画的工作,但是不能太耗时,
    不然会影响到新Activity的显示,只有这些操作做完,
    新Activity的OnResume才会执行。*/
        @Override
    protected void onPause() {
        super.onPause();
    }
    
    
/*6.onStop:
    表示Activity即将停止,可以做一些相对重量级的回收工作,
    同样不能太耗时。*/
    @Override
    protected void onStop() {
        super.onStop();
    }

/*onDestroy
    表示Activity即将被销毁,这是Activity生命的尽头,
    可以做一些回收工作和资源的释放。*/
    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

(2)进一步地,可以将Activity分为3种生存期:

完整生存期:在 onCreate() 和 onDestroy() 之间所经历的。

可见生存期:在 onStart() 和 onStop() 之间所经历的。

前台生存期:在 onResume() 和 onPause() 之间所经历的。

(3)Activity的活动状态

运行状态:位于返回栈栈顶的活动。

暂停状态:不在栈顶位置,但仍然可见。

停止状态:不在栈顶位置,完全不可见。可能会被系统回收。

销毁状态:在返回栈中移除的活动。

(返回栈:每启动一个新的活动,会在返回栈中入栈,并处于栈顶的位置。每销毁一个活动,处于栈顶的活动会出栈,前一个入栈的活动会重新处于栈顶的位置。)

异常情况下的生命周期分析

(1)系统配置发生改变引起生命周期的异常变化

        举例:开启手机的自动旋转后,当Activity从竖屏状态转变为横屏时,系统会自动销毁原先的Activity并重建。如果不做特殊处理,那么每当系统配置改变时,Activity都会销毁重建,如图所示:

图3 旋转手机时Activity的生命周期变化情况

  • 当手机从竖屏转变为横屏时,可以看到原Activity执行: onPause -> onSaveInstanceState -> onStop -> onDestroy ,走完原Activity的生命周期。
  • 当原Activity销毁后又会迅速的开启新的Activity执行 :onCreate -> onStart -> onRestoreInstanceState -> onResume, 最终新的Activity显示在用户界面上。
  • onSaveInstanceState 和 onRestoreInstanceState 两个方法仅在生命周期异常情况下执行。onSaveInstanceState主要是对异常销毁的Activity进行数据保存,onRestoreInstanceState主要是对存储的数据进行恢复,数据存取都是通过Bundle,因此我们可以在Bundle中附加个人数据进行读写。经过测试onSaveInstanceState在onStop前调用,onRestoreInstanceState在onStart方法后调用。这两个方法执行的过程中,系统会自动对视图进行信息数据的存取,例如:ListView的滚动位置等等。

(2)资源内存不足导致低优先级的Activity被杀死

        当系统资源不足时,系统会按照上述优先级去杀死目标的 Activity 所在的进程,并在后续通过 onSaveInstanceState 和 onRestoreInstanceState 来存储和恢复数据。如果一些后台的进程脱离了四大组件而独立运行,那么这个进程很快就被杀死。我们常常将后台工作放到 Service 中保持进程具有一定的优先级。

图4 configChanges添加orientation后的效果

        当系统配置改变时Activity会销毁重建,通过在AndroidMainManifest.xml中为Activity添加configChanges属性去避免这个情况。configChanges的属性有很多,例如:orientation表示屏幕方向变化、KeyboardHidden表示虚拟键盘可访问性变化等,通过设置这些属性后当运行过程中发生上述情况Activity既不会销毁重建也不会调用 onSaveInstanceState 和 onRestoreInstanceState 两个方法,而是执行onConfigChanged方法。

问题:

(1)onStart 和 onResume、onPause 和 onStop 从功能描述上看大同小异,到底有什么区别呢?

  这两组方法对的回调意义不同,onStart和onStop是从Activity是否可见这个角度来回调的,而 onResume和onPause是从 Activity 是否位于前台这个角度来回调的,不过在实际使用中没有其他明显区别。

(2)假设当前Activity为A,如果这时用户打开了一个新的Activity B,那么B的onResume方法和A的onPause方法谁先执行呢?

        根据Android的基本运行机制,不能在onPause中执行重量级的操作,因为必须onPause执行完成以后新Activity才能onResume。onPause和onResume都不能执行耗时的操作,尤其是onPause,这就意味着我们应该在onStop中操作,从而使新的Activity显示出来并切换到前台。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

有梦想的程序星空

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值