Android复习-Acitivity的生命周期(二、异常情况下的各种回调)

首先来明确一下何为异常情况:

Acitivty被异常杀死,例如Activity在后台时由于内存不足或一键清理引起的杀死,或者Acitivty的配置发生变化时,例如横屏转为竖屏。

这些情况都会导致Activity执行“死亡”流程,并且再执行创建流程。

进入一个Activity:

A...onCreate
A...onStart
A...onResume

然后进行横屏:

03-13 11:16:18.555 8491-8491/ryrj.pzfw.net.activitytest I/mydata: Main3Activity...onPause
03-13 11:16:18.555 8491-8491/ryrj.pzfw.net.activitytest I/mydata: Main3Activity...onSaveInstanceState
03-13 11:16:18.555 8491-8491/ryrj.pzfw.net.activitytest I/mydata: Main3Activity...onStop
03-13 11:16:18.555 8491-8491/ryrj.pzfw.net.activitytest I/mydata: Main3Activity...onDestroy
03-13 11:16:18.750 8491-8491/ryrj.pzfw.net.activitytest I/mydata: Main3Activity...onCreate
03-13 11:16:18.751 8491-8491/ryrj.pzfw.net.activitytest I/mydata: Main3Activity...onStart
03-13 11:16:18.751 8491-8491/ryrj.pzfw.net.activitytest I/mydata: Main3Activity...onRestoreInstanceState
03-13 11:16:18.751 8491-8491/ryrj.pzfw.net.activitytest I/mydata: Main3Activity...onResume
03-13 11:19:24.905 8491-8491/ryrj.pzfw.net.activitytest I/mydata: Main3Activity...onPause
03-13 11:19:24.925 8491-8491/ryrj.pzfw.net.activitytest I/mydata: Main3Activity...onResume

Activity执行了销毁流程,并且又执行了创建流程,但是多了两个方法回调:

    @Override
    protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //我们可以拿到outState将想要保存的数据存储
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    //我们可以从savedInstanceState中取出在outState中保存的数据
    }



我们可以看到在onPause之后,onSaveInstanceState方法会被回调,Android艺术开发与探索上它一定会在onStop之前被回调,但与onPause不确定,可能会在onPause之前或者onPause之后,而根据我的亲身测试已经对onPause方法理解,我觉得会在onPause之后回调。
 
 
onRestoreInstanceState会在onStart方法后会被回调。
 
 
并且注意: onRestoreInstance只会在被异常杀死后回调,而onSaveInstance方法会在认为Activity要暂停或死亡是回调,比如A启动B,A只是onStop,那么在BonResmue之后,AonStop之前也会回调的。
 
 
 
 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG,getClass().getSimpleName() + "...onCreate");
    }


而且我们平时的onCreate方法中的这个Bundle参数:
如果在onSaveInstance中存储过数据,那么这个Bundle就有值,并且可以取出存入的值。如果没有的话就为null
 
 
所以我们恢复数据可以在onRestoreInstance中也可以在onCreate中,不过在onCreate中需要判断不为null,并且android也推荐在onRestoreInstance中进行数据恢复,因为只有Activity是异常杀死,这个方法才会被回调,省去了无用的判断。
 
 
分析一下内存不足的情况下低优先级的Activity被杀死的情况:
高优先级:Activity处于前台,与用户交互中,而且根据我们的开发经验,Android不会去杀死一个正在前台和用户交互的Activity,哪怕卡死。
中优先级:Activity处于onPause状态,或者可见但是不可交互。
低优先级:Activity处于后台,处于暂停状态,也可以理解为执行了onStop方法的。
 
 
 
 
对了,如何避免Activity因为配置问题发生的销毁重建呢(例如横竖屏切换)?
可以在配置清单中为这个activity加入configChanges属性,相应的属性有很多,具体使用请网上查找,很多。
 
 
 <activity android:name=".Main3Activity"
            android:configChanges="orientation|screenSize">
 </activity>

这个让横竖屏切换不销毁重建的配置。
 
 
 
 
 
 
 
 
 
 
 
 

猜你喜欢

转载自blog.csdn.net/sinat_31311947/article/details/61914965