小记Activity生命周期3(完结篇)

2017-11-29  本文已影响0人  bridegg

前言

前一片文章主要讲了启动模式,但是在本篇文章开始之前要补充一些东西,原理很简单,就是打开新的activity时,AMS会通知ActivityStack去把位于栈顶的activity先onPause。然后开启新的Activity。所以本篇文章会接着讲一些生命周期的相关事宜。

正文

生命周期的几种执行顺序
1、正常启动-关闭:onCreate->onStart->onResume->onPause->onStop->onDesrtoy
2、正常启动-跳转:onCreate->onStart->onResume->onPause->onStop
3、正常启动-跳转-关闭新页面回来:onCreate->onStart->onResume->onPause->onStop->onRestart->onStart->onResume
4、正常启动-异常关闭:onCreate->onStart->onResume->onPause->onStop->onCreate->onStart->onResume
好的,现在我们写几个简单的例子,测试一番,首先附上代码

AActivity


public class AActivity extends Activity {
    public final String TAG="A_ACTIVITY";
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.life_a);
        Log.e(TAG,"onCreate");

    }
    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG,"onStart");

    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e(TAG,"onRestart");

    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG,"onResume");

    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(TAG,"onPause");

    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(TAG,"onStop");

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(TAG,"onDestroy");

    }
    public void toBActivity(View v){
        startActivity(new Intent(this,BActivity.class));
    }

BActivity


public class BActivity extends Activity {
    public final String TAG="B_ACTIVITY";
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.e(TAG,"onCreate");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.e(TAG,"onStart");

    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e(TAG,"onRestart");

    }


    @Override
    protected void onResume() {
        super.onResume();
        Log.e(TAG,"onResume");

    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e(TAG,"onPause");

    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.e(TAG,"onStop");

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e(TAG,"onDestroy");

    }

}

然后验证第一种log

启动ativity

打开如上图所示,然后关闭


关闭activity

正常启动-关闭:onCreate->onStart->onResume->onPause->onStop->onDesrtoy验证完毕

然后验证第二种
先打开Activity


打开Activity

然后跳转到BActtivity

跳转到BActtivity

这里发现,AAcitivy的onStop是在BActivity执行完OnCreate和onStart-onResume后才执行
官方对onPause和onStop说明如下

说明
官方说onPause最好执行一些数据保存,动画停止的操作,而且一定要快,因为下一个页面要等这个方法执行完毕后才会创建。
而stop只说明了当用户完全看不见该页面的时候执行。
所以一些耗时操作千万不要在onPause里执行,一些界面效果不要在onStop里执行。
然后我们回到AActivity
回到AActivity
好的,到此证明了
2、正常启动-跳转:onCreate->onStart->onResume->onPause->onStop
3、正常启动-跳转-关闭新页面回来:onCreate->onStart->onResume->onPause->onStop->onRestart->onStart->onResume
为正确,但是大家也看到了,返回页面操作同打开页面一样,先执行BActivity的onPause,然后执行AActivity的onRestart等等,当onResume执行完毕后,才会执行onStop,onDestroy。
这也就是有时候弄一些APP级别的静态变量,放在onDestroy执行,但是onResume永远拿不到值的原因。
综上所示A跳转B然后返回A的完整生命周期如下
(A)onCreate->(A)onStart->(A)onResume->【跳转】(A)onPause->(B)onCreate->(B)onStart->(B)onResume->(A)onStop【关闭BActivity】(B)onPause->(A)onRestart->(A)onStart->(A)onResume->(B)onStop->(B)onDesrtoy【关闭AActivity】(A)onPause->(A)onStop->(A)onDesrtoy

最后异常处理,常用异常生命周期大致分为四种
1,用户黑屏
2,用户Home
3,系统清理
4,横竖屏切换

1用户黑屏
代码还用上面的代码,只需要按下电源键,然后在回到主界面


电源键

2用户Home


用户Home

然后点击icon回来


image.png

3模拟系统杀死(这里接不截图直接文字说明结果)
1、使用DDMS模拟的话,如果按home先执行home流程然后app终止,如果在当前页,直接不执行onPause瞬间app终止
2、使用系统自带清理系统执行onPause后app终止
3、使用Monitors的Terminate同1
4、使用adb shell am kill 同1

然后打开app时,均执行onCreate->onStart->onResume

4切换屏幕

image.png
切换屏幕默认不配置任何东西时,会走两套生命周期先会销毁之前竖屏的activity,然后创建横屏activity
当然,有时候我们并不希望切换屏幕,那就使用screenOrientation属性在AndroidManManidest中设置android:screenOrientation="portrait" 具体属性很多可以点此查看
也有时候需要旋转屏幕,但是不希望重启生命周期,那我们设置
android:configChanges="orientation|screenSize"
其中orientation为屏幕方向转变
screenSize为屏幕尺寸改变
更多属性可以点击这里查看

结语

通过三篇小文章记录了生命周期的三个小点
1、onCreate的两个方法的用法,当activity销毁时什么时候保存我们想要的数据
2、onCreate的执行原理,为什么android系统会执行activity的生命周期
3、生命周期的执行顺序
若有遗漏欢迎大家补充

上一篇下一篇

猜你喜欢

热点阅读