Android:探究活動(dòng)的生命周期

1、介紹

Android的活動(dòng)是可以層疊的,我們每啟動(dòng)一個(gè)新的活動(dòng),就會(huì)覆蓋有原活動(dòng)之上,點(diǎn)擊Back鍵之后會(huì)銷毀最上面的活動(dòng),下面的一個(gè)活動(dòng)就會(huì)重新顯示出來。

2、 返回棧

Android使用(Task)來管理活動(dòng);

一個(gè)任務(wù)就是一組存放在棧里的的活動(dòng)集合,這個(gè)棧也稱之為返回棧(back Stack);

棧是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu);

工作流程:

在默認(rèn)情況下,

每當(dāng)啟動(dòng)了一個(gè)新的活動(dòng),它會(huì)在返回棧中入棧,并處于棧頂?shù)奈恢茫?/p>

每當(dāng)我們按下Back鍵或調(diào)用finish()方法去銷毀一個(gè)活動(dòng)時(shí),處于棧頂?shù)奈恢玫幕顒?dòng)就會(huì)出棧,這時(shí)前一個(gè)入棧的活動(dòng)就會(huì)重新處于棧頂?shù)奈恢?,系統(tǒng)就會(huì)是顯示處于棧頂?shù)幕顒?dòng)給用。

3、活動(dòng)狀態(tài)(每個(gè)活動(dòng)其生命周期最多可能會(huì)有4種狀態(tài))

3.1、運(yùn)行狀態(tài)

當(dāng)一個(gè)活動(dòng)位于返回棧的棧頂時(shí),活動(dòng)就處于運(yùn)行狀態(tài)。

3.2、暫停狀態(tài)

當(dāng)一個(gè)活動(dòng)不再處于棧頂位置,但仍然可見時(shí),活動(dòng)就進(jìn)入了暫停狀態(tài)。

示例:并不是每一個(gè)活動(dòng)都會(huì)占滿整個(gè)屏幕,比如對(duì)話框形式的活動(dòng)就只會(huì)占用屏幕中間的部分區(qū)域,你仍然可以看到后面的活動(dòng);

處于暫停狀態(tài)的活動(dòng)仍然是完全存活著的;

只有在內(nèi)存極低的情況下才會(huì)考慮回收這種活動(dòng);

3.3、停止?fàn)顟B(tài)

當(dāng)一個(gè)活動(dòng)不再處于棧頂位置,并且完成不可見的時(shí)候,就進(jìn)入了停止?fàn)顟B(tài)。系統(tǒng)會(huì)為這種活動(dòng)保存相應(yīng)的狀態(tài)和成員變量(但是當(dāng)其他地方需要內(nèi)存時(shí),處于停止活動(dòng)下的活動(dòng)有可能會(huì)被系統(tǒng)回收。)

3.4、銷毀狀態(tài)

當(dāng)一個(gè)活動(dòng)從返回棧中移除后變成了銷毀狀態(tài)。系統(tǒng)會(huì)傾向回收這種狀態(tài)的活動(dòng),以保證手機(jī)內(nèi)存的充足。

4、活動(dòng)的生存期

Activity中定義了7個(gè)回調(diào)方法,覆蓋了生命周期的每一個(gè)環(huán)節(jié);

onCreate()

每個(gè)活動(dòng)基本都會(huì)重寫這個(gè)方法,它會(huì)在活動(dòng)第一次創(chuàng)建的時(shí)候調(diào)用;這個(gè)方法會(huì)完成活動(dòng)的初始化操作,比如:加載布局、綁定事件;

onStart()

這個(gè)方法在活動(dòng)由不可見變?yōu)榭梢姷臅r(shí)候調(diào)用;

onResume()

這個(gè)方法在活動(dòng)準(zhǔn)備好和用戶進(jìn)行交互的時(shí)候調(diào)用,此時(shí)的活動(dòng)一定位于返回棧的棧頂,并且處于運(yùn)行狀態(tài);

onPause()

這個(gè)方法在系統(tǒng)準(zhǔn)備去啟動(dòng)或者恢復(fù)另一個(gè)活動(dòng)的時(shí)候調(diào)用;

(通常會(huì)在這個(gè)方法中將一)

onStop()

這個(gè)方法在活動(dòng)完全不可見的時(shí)候調(diào)用;

onDestroy()

在活動(dòng)被銷毀之前調(diào)用,之后活動(dòng)的狀態(tài)變?yōu)殇N毀狀態(tài);

onRestart()

這個(gè)方法在活動(dòng)由停止?fàn)顟B(tài)變?yōu)檫\(yùn)行狀態(tài)之前調(diào)用,就是活動(dòng)被重新啟動(dòng)的時(shí)候調(diào)用;

5、體驗(yàn)活動(dòng)的生命周期

準(zhǔn)備工作

新建一個(gè)項(xiàng)目,允許自動(dòng)創(chuàng)建活動(dòng)和布局,并設(shè)置主活動(dòng);

再分別創(chuàng)建兩人子活動(dòng)NormalActivity(布局命名:normal_layout)和DialogActivity(布局命名:dialog_layout);

normal_layout.xml 修改成內(nèi)容如下:


? ? ? ? ? ? ? android:orientation="vertical"

? ? ? ? ? ? ? android:layout_width="match_parent"

? ? ? ? ? ? ? android:layout_height="match_parent">


? ? ? ? android:layout_width="match_parent"

? ? ? ? android:layout_height="wrap_content"

? ? ? ? android:text="this is a mormal activity"

? ? ? ? />

dialog_layout.xml 修改成內(nèi)容如下:


? ? ? ? ? ? ? android:orientation="vertical"

? ? ? ? ? ? ? android:layout_width="match_parent"

? ? ? ? ? ? ? android:layout_height="match_parent"

? ? ? ? ? ? ? >


? ? ? ? android:layout_height="match_parent"

? ? ? ? android:layout_width="wrap_content"

? ? ? ? android:text="This is a dialog activity"

? ? ? ? />

修改注冊(cè)表AndroidManifest.xml如下:

? ? ? ? ? package="com.bignerdranch.android.activity_text">


? ? ? ? android:allowBackup="true"

? ? ? ? android:icon="@mipmap/ic_launcher"

? ? ? ? android:label="@string/app_name"

? ? ? ? android:roundIcon="@mipmap/ic_launcher_round"

? ? ? ? android:supportsRtl="true"

? ? ? ? android:theme="@style/AppTheme">










? ? ? ? ? ? android:theme="@andrid:style/Theme.Dialog">



添加兩個(gè)按鈕,一個(gè)用于啟動(dòng)活動(dòng)NormalActivity,一個(gè)用于啟動(dòng)DialogActivity

主活動(dòng)的布局如下:

? ? ? ? ? ? ? android:orientation="vertical"

? ? ? ? ? ? ? android:layout_width="match_parent"

? ? ? ? ? ? ? android:layout_height="match_parent">


? ? ? ? android:id="@+id/start_normal_activity"

? ? ? ? android:layout_width="match_parent"

? ? ? ? android:layout_height="wrap_content"

? ? ? ? android:text="Start normal activity"/>


? ? ? ? android:id="@+id/start_dialog_activity"

? ? ? ? android:layout_width="match_parent"

? ? ? ? android:layout_height="wrap_content"

? ? ? ? android:text="Start dialog activity"

? ? ? ? />

活動(dòng)修改代碼如下:

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 MainActivity extends AppCompatActivity {

? ? public static final String TAG = "MainActivity";

? ? @Override

? ? protected void onCreate(Bundle savedInstanceState) {

? ? ? ? Log.w(TAG,"onCreate");

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.activity_main);

? ? ? ? Button startNormalActivity = (Button) findViewById(R.id.start_normal_activity);

? ? ? ? Button startDialogActivity = (Button) findViewById(R.id.start_dialog_activity);

? ? ? ? //設(shè)置按鈕的簽聽事件

? ? ? ? startNormalActivity.setOnClickListener(new View.OnClickListener(){

? ? ? ? ? ? public void onClick(View v){

? ? ? ? ? ? ? ? Intent intent = new Intent(MainActivity.this,NormalActivity.class);

? ? ? ? ? ? ? ? startActivity(intent);

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? //設(shè)置按鈕的簽聽事件

? ? ? ? startDialogActivity.setOnClickListener(new View.OnClickListener(){

? ? ? ? ? ? public void onClick(View v){

? ? ? ? ? ? ? ? Intent intent = new Intent(MainActivity.this,DialoActivity.class);

? ? ? ? ? ? ? ? startActivity(intent);

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? }

? ? protected void onStart(){

? ? ? ? super.onStart();

? ? ? ? Log.w(TAG,"onStart");

? ? }

? ? protected? void onResume(){

? ? ? ? super.onResume();

? ? ? ? Log.w(TAG,"Onresume");

? ? }

? ? protected? void onPause(){

? ? ? ? super.onPause();

? ? ? ? Log.w(TAG,"onpause");

? ? }

? ? protected? void onStop(){

? ? ? ? super.onStop();

? ? ? ? Log.w(TAG,"onstop");

? ? }

? ? protected void onDestroy(){

? ? ? ? super.onDestroy();

? ? ? ? Log.w(TAG,"onDestroy");

? ? }

? ? protected void onRestart(){

? ? ? ? super.onRestart();

? ? ? ? Log.w(TAG,"onRestart");

? ? }

}

進(jìn)入時(shí)打印如下:

04-10 01:18:06.875 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動(dòng)第一次創(chuàng)建的時(shí)候調(diào)用>> onCreate

04-10 01:18:06.908 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動(dòng)由不可見變?yōu)榭梢姷臅r(shí)候調(diào)用>> onStart

04-10 01:18:06.911 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動(dòng)準(zhǔn)備好和用戶進(jìn)行交互的時(shí)候調(diào)用>> Onresume

點(diǎn)擊START NOTMAL ACTIVITY 按鈕時(shí)會(huì)打印 如下:

04-10 01:18:27.265 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 系統(tǒng)準(zhǔn)備去啟動(dòng)或者恢復(fù)另一個(gè)活動(dòng)的時(shí)候調(diào)用>> onpause

04-10 01:18:27.589 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動(dòng)完全不可見的時(shí)候調(diào)用>> onstop

再點(diǎn)擊返回主活動(dòng)頁(yè)面時(shí)打印 如下:

04-10 01:18:46.132 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動(dòng)由停止?fàn)顟B(tài)變?yōu)檫\(yùn)行狀態(tài)之前調(diào)用>> onRestart

04-10 01:18:46.133 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動(dòng)由不可見變?yōu)榭梢姷臅r(shí)候調(diào)用>> onStart

04-10 01:18:46.134 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動(dòng)準(zhǔn)備好和用戶進(jìn)行交互的時(shí)候調(diào)用>> Onresume

點(diǎn)擊Start dialog activity 按鈕進(jìn)打印如下:

04-10 17:22:18.739 3798-3798/com.bignerdranch.android.activity_text W/MainActivity: 系統(tǒng)準(zhǔn)備去啟動(dòng)或者恢復(fù)另一個(gè)活動(dòng)的時(shí)候調(diào)用>> onpause

再點(diǎn)擊返回主活動(dòng)頁(yè)面時(shí)打印 如下:

04-10 17:22:46.798 3798-3798/com.bignerdranch.android.activity_text W/MainActivity: 活動(dòng)準(zhǔn)備好和用戶進(jìn)行交互的時(shí)候調(diào)用>> Onresume

再點(diǎn)擊返回退出app時(shí)打印

04-10 01:20:35.510 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 系統(tǒng)準(zhǔn)備去啟動(dòng)或者恢復(fù)另一個(gè)活動(dòng)的時(shí)候調(diào)用>> onpause

04-10 01:20:36.031 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動(dòng)完全不可見的時(shí)候調(diào)用>> onstop

? ? 活動(dòng)被銷毀之前調(diào)用>> onDestroy

遇到的問題

在運(yùn)行過程中點(diǎn)擊Start dialog activity 按鈕彈出框的時(shí)候,會(huì)發(fā)生閃退

分析出原因?yàn)轭惱^承的問題,修改方法如下;

修改DialoActivity.class中DialoActivity為繼承Activity類,代碼如下:

package com.bignerdranch.android.activity_text;

import android.app.Activity;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

public class DialoActivity extends Activity {

? ? @Override

? ? protected void onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? setContentView(R.layout.dialog_layout);

? ? }

}


zhangyongfeng"s blogs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容