美文网首页
Android Activity生命周期及启动模式

Android Activity生命周期及启动模式

作者: 乘胥垣 | 来源:发表于2019-01-14 20:47 被阅读0次

    学习Android开发的小伙伴可能“四大组件”是接触Android开发时经常出现的名词之一,四大组件的使用也是入门Android开发必备的基础技能之一,这篇文章采用代码示例的方法尝试分析四大组件的基本使用以及各个组件的基本原理。

    那么,Android的四大组件究竟是哪四大组件呢?四大组件包括:Activity,Service,BroadCastReceiver,ContentProvider。本篇文章将分析Activity的生命周期及其启动模式

    生命周期:

    Activity有以下几个生命周期方法,他们分别代表什么含义,我们在每个生命周期方法中究竟应该完成什么样的准备工作:

    onCreate:表示Activity正在被创建,这是Activity生命周期的第一个方法,我们可以在这个方法中做一些初始化的工作,比如setContentView去加载布局文件,绑定控件,初始化Activity所需数据等。

    onStart:表示Activity正在被启动,这个时候Activity已经可见,但是还没有显示到前台,无法与用户进行交互,可以理解为界面已经显示了,但是我们还看不到。

    onResume:表示Activity已经可见,已经显示到前台了,并可以与用户进行交互。

    onPause:表示Activity正在停止,在这个生命周期中,我们可以做一些保存数据、停止动画等工作,不能做比较耗时的工作。

    onStop:表示Activity即将停止,我们可以做一些资源回收工作,同样不能太耗时

    onDestroy:表示Activity即将背销毁,这里是Activity生命周期的最后一个方法,我们可以做一些资源释放工作。

    onRestart:表示Activity正在被重新启动,当前Activity从不可见状态变为可见状态,这个方法在什么时候会被调用呢?当你在一个Activity中按下Home键切换到桌面或是打开一个新的Activity(打开新的Activity是否调用onRestart方法与Activity的启动模式有关,暂可不表,文章后面会有介绍)时,系统会调用Activity的onPause、onStop生命周期方法,当你回到这个Activity时,如果这个Activity没有被系统回收,就会调用onRestart方法

    Activity的生命周期如下图所示:

    image

    下面我会用代码说明Activity各种情境下的生命周期:

    以下是MainActivity的代码

    
    package com.danc.dancactivitystudy;
    
    import android.content.Intent;
    
    import android.support.v7.app.AppCompatActivity;
    
    import android.os.Bundle;
    
    import android.util.Log;
    
    import android.view.View;
    
    import android.widget.Button;
    
    public class MainActivityextends AppCompatActivity {
    
        private static final StringTAG ="danKeeper";
    
        private ButtonmBtnJump;
    
        @Override
    
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
    
            Log.d(TAG, "MainActivity onCreate() be called");
    
            setContentView(R.layout.activity_main);
    
            mBtnJump = findViewById(R.id.btn_jump);
    
            mBtnJump.setOnClickListener(new View.OnClickListener() {
    
            @Override
    
            public void onClick(View view) {
    
                  startActivity(new Intent(MainActivity.this, SecondActivity.class));
    
             }
    
    });
    
        }
    
    @Override
    
        protected void onStart() {
    
            Log.d(TAG, "MainActivity onStart() be called");
    
            super.onStart();
    
        }
    
    @Override
    
        protected void onResume() {
    
            Log.d(TAG, "MainActivity onResume() be called");
    
            super.onResume();
    
        }
    
    @Override
    
        protected void onPause() {
    
            Log.d(TAG, "MainActivity onPause() be called");
    
            super.onPause();
    
        }
    
    @Override
    
        protected void onStop() {
    
            Log.d(TAG, "MainActivity onStop() be called");
    
            super.onStop();
    
        }
    
    @Override
    
        protected void onDestroy() {
    
            Log.d(TAG, "MainActivity onDestroy() be called");
    
            super.onDestroy();
    
        }
    
    @Override
    
        protected void onRestart() {
    
            Log.d(TAG, "MainActivity onRestart() be called");
    
            super.onRestart();
    
        }
    
    }
    
    

    以下是SecondActivity的代码

    
    package com.danc.dancactivitystudy;
    
    import android.support.v7.app.AppCompatActivity;
    
    import android.os.Bundle;
    
    import android.util.Log;
    
    public class SecondActivityextends AppCompatActivity {
    
    private static final StringTAG ="danKeeper";
    
        @Override
    
        protected void onCreate(Bundle savedInstanceState) {
    
            Log.d(TAG, "SecondActivity onCreate() be called");
    
            super.onCreate(savedInstanceState);
    
            setContentView(R.layout.activity_second);
    
        }
    
    @Override
    
        protected void onStart() {
    
            Log.d(TAG, "SecondActivity onStart() be called");
    
            super.onStart();
    
        }
    
    @Override
    
        protected void onResume() {
    
            Log.d(TAG, "SecondActivity onResume() be called");
    
            super.onResume();
    
        }
    
    @Override
    
        protected void onPause() {
    
            Log.d(TAG, "SecondActivity onPause() be called");
    
            super.onPause();
    
        }
    
    @Override
    
        protected void onStop() {
    
            Log.d(TAG, "SecondActivity onStop() be called");
    
            super.onStop();
    
        }
    
    @Override
    
        protected void onDestroy() {
    
            Log.d(TAG, "SecondActivity onDestroy() be called");
    
            super.onDestroy();
    
        }
    
    @Override
    
        protected void onRestart() {
    
            Log.d(TAG, "SecondActivity onRestart() be called");
    
            super.onRestart();
    
        }
    
    }
    
    

    (一)启动MainActivity

    日志如下

    
    MainActivity onCreate() be called
    
    MainActivity onStart() be called
    
    MainActivity onResume() be called
    
    

    说明这个情况下MainActivity的生命周期是:

    onCreate > onStart > onResume

    (二)跳转至SecondActivity

    日志如下

    
    MainActivity onCreate() be called
    
    MainActivity onStart() be called
    
    MainActivity onResume() be called
    
    MainActivity onPause() be called
    
    SecondActivity onCreate() be called
    
    SecondActivity onStart() be called
    
    SecondActivity onResume() be called
    
    MainActivity onStop() be called
    
    

    说明这个情况下的生命周期是:

    onCreate > onStart > onResume > onPause > SecondActivity onCreate > SecondActivity onStart > SecondActivity onResume > onStop

    也就是说页面跳转时是先执行MainActivity的onPause生命周期,然后开始执行SecondActivity的生命周期,当SecondActivity页面可见之后,MainActivity执行onStop生命周期

    (三)返回键返回第一个Activity

    日志如下

    
    SecondActivity onPause() be called
    
    MainActivity onRestart() be called
    
    MainActivity onStart() be called
    
    MainActivity onResume() be called
    
    SecondActivity onStop() be called
    
    SecondActivity onDestroy() be called
    
    

    说明这个情况下的生命周期是:

    SecondActivity onPause > onRestart > onStart > onResume > SecondActivity onStop > SecondActivity onDestroy

    这里我们可以看到走到了onRestart生命周期,这是由于跳转到SecondActivity时MainActivity并没有被销毁,也就是没有走到onDestroy生命周期,所以当返回上一页面也就是返回MainActivity时会走到MainActivity的onRestart生命周期。这里会有一个特殊情况,如果SecondActivity采用了透明主题,跳转至SecondActivity时并不会走到onStop生命周期,同样的,返回时也不会走到onStart生命周期,生命周期变为:
    onCreate > onStart > onResume > onPause > SecondActivity onCreate > SecondActivity onStart > SecondActivity onResume > SecondActivity onPause > onResume > SecondActivity onStop > SecondActivity onDestroy

    启动模式:

    我们知道,默认情况下,启动同一个Activity时系统会创建多个实例并把它们放到任务栈中,当我们按下返回键时,会一一展示我们刚刚打开的Activity,每按一次返回键栈顶的Activity就会出栈,直到栈空为止。那么问题来了,为什么创建一个Activity时就要将一个新的实例入栈呢?为什么不从栈中看看是否有这个Activity的实例呢?Android设计的时候就提供了四种Activity的启动模式来供开发者选择,每种启动模式都有他们的特性以及使用场景。

    standard:

    标准模式,这也是系统的默认启动模式。每次新启动一个Activity时都会实例化该Activity对象,不管任务栈中是否已经有这个Activity的实例。

    singleTop:

    栈顶复用模式。新启动一个Activity时会检查任务栈顶是否是该Activity的实例,如果是,就不会重新创建这个Activity,同时onIntent方法会被回调,如果不是,就会添加一个新的该Activity实例到栈顶。举个例子,假如现在任务栈从栈顶到栈底分别为ABCD四个Activity,如果这时跳转至A,如果A的启动模式为singleTop,那么任务栈的结构就是ABCD,如果是stantard,那么任务栈的结构就是AABCD。

    singleTask;

    栈内复用模式。这是一种单实例模式,只要Actiivty在一个任务栈存在,那么启动这个Activity都不会创建新的实例,而是将任务栈中Activity调到栈顶,调用它的onNewIntent方法,如果任务栈中不存在这个Activity的实例,则会创建Activity的实例并入栈。比如任务栈S1中有ABC三个Activity,此时我要进入D,如果D需要的任务栈是S2,那么系统会先创建S2任务栈,并将D入栈,栈结构为S1:ABC,S2:D,如果D需要的任务栈就是S1,那么系统会创建一个D的实例并入栈,那么此时S1中就是DABC,此时我们在跳转到B中,那么S1任务栈中就会变为BC。

    singleInstance:

    singleInstance除了具有singleTask所有特性之外,singleInstance启动模式下的Activity只 能单独位于一个任务栈中,换句话说,当要启动A时,只要所有任务栈中没有A的实例,系统就会为A创建一个任务栈,这个任务栈中只会存在A,后续要进入A,都不会创建新的实例,直到系统将这个特殊的任务栈回收。


    相关文章

      网友评论

          本文标题:Android Activity生命周期及启动模式

          本文链接:https://www.haomeiwen.com/subject/btfsdqtx.html