Android:探究活動的生命周期

1、介紹

Android的活動是可以層疊的,我們每啟動一個新的活動,就會覆蓋有原活動之上,點擊Back鍵之后會銷毀最上面的活動,下面的一個活動就會重新顯示出來。

2、 返回棧

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

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

棧是一種先進先出的數(shù)據(jù)結構;

工作流程:

在默認情況下,

每當啟動了一個新的活動,它會在返回棧中入棧,并處于棧頂?shù)奈恢茫?/p>

每當我們按下Back鍵或調(diào)用finish()方法去銷毀一個活動時,處于棧頂?shù)奈恢玫幕顒泳蜁鰲#@時前一個入棧的活動就會重新處于棧頂?shù)奈恢茫到y(tǒng)就會是顯示處于棧頂?shù)幕顒咏o用。

3、活動狀態(tài)(每個活動其生命周期最多可能會有4種狀態(tài))

3.1、運行狀態(tài)

當一個活動位于返回棧的棧頂時,活動就處于運行狀態(tài)。

3.2、暫停狀態(tài)

當一個活動不再處于棧頂位置,但仍然可見時,活動就進入了暫停狀態(tài)。

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

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

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

3.3、停止狀態(tài)

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

3.4、銷毀狀態(tài)

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

4、活動的生存期

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

onCreate()

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

onStart()

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

onResume()

這個方法在活動準備好和用戶進行交互的時候調(diào)用,此時的活動一定位于返回棧的棧頂,并且處于運行狀態(tài);

onPause()

這個方法在系統(tǒng)準備去啟動或者恢復另一個活動的時候調(diào)用;

(通常會在這個方法中將一)

onStop()

這個方法在活動完全不可見的時候調(diào)用;

onDestroy()

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

onRestart()

這個方法在活動由停止狀態(tài)變?yōu)檫\行狀態(tài)之前調(diào)用,就是活動被重新啟動的時候調(diào)用;

5、體驗活動的生命周期

準備工作

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

再分別創(chuà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"

? ? ? ? />

修改注冊表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">



添加兩個按鈕,一個用于啟動活動NormalActivity,一個用于啟動DialogActivity

主活動的布局如下:

? ? ? ? ? ? ? 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"

? ? ? ? />

活動修改代碼如下:

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);

? ? ? ? //設置按鈕的簽聽事件

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

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

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

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

? ? ? ? ? ? }

? ? ? ? });

? ? ? ? //設置按鈕的簽聽事件

? ? ? ? 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");

? ? }

}

進入時打印如下:

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

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

04-10 01:18:06.911 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動準備好和用戶進行交互的時候調(diào)用>> Onresume

點擊START NOTMAL ACTIVITY 按鈕時會打印 如下:

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

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

再點擊返回主活動頁面時打印 如下:

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

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

04-10 01:18:46.134 21015-21015/com.bignerdranch.android.activity_text W/MainActivity: 活動準備好和用戶進行交互的時候調(diào)用>> Onresume

點擊Start dialog activity 按鈕進打印如下:

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

再點擊返回主活動頁面時打印 如下:

04-10 17:22:46.798 3798-3798/com.bignerdranch.android.activity_text W/MainActivity: 活動準備好和用戶進行交互的時候調(diào)用>> Onresume

再點擊返回退出app時打印

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

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

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

遇到的問題

在運行過程中點擊Start dialog activity 按鈕彈出框的時候,會發(fā)生閃退

分析出原因為類繼承的問題,修改方法如下;

修改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

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,480評論 2 379

推薦閱讀更多精彩內(nèi)容