Android Activity生命周期及启动模式

学习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,都不会创建新的实例,直到系统将这个特殊的任务栈回收。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容