久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Activity生命(ming)周期攻略

Activity生(sheng)命周(zhou)期(qi)攻略 時間:2018-08-15      來源(yuan):未(wei)知(zhi)

正所(suo)謂,世間萬物皆有(you)生命(ming),作為(wei)(wei)Android四(si)大組件之一(yi)的Activity也具有(you)其自己不同的生命(ming)階段,為(wei)(wei)了(le)能(neng)夠更加深入的理解Activity,方便以后在開發項目中能(neng)夠如魚得(de)水,今天有(you)必要帶大家來一(yi)起探尋一(yi)下(xia)Activity生命(ming)周期的奧秘!

一.Activity簡介

作(zuo)為(wei)Android四(si)大組件(jian)之(zhi)一,該組件(jian)為(wei)用(yong)戶提供了(le)一個屏(ping)幕,用(yong)戶在(zai)這個屏(ping)幕上(shang)進行操(cao)作(zuo)來(lai)完成一定(ding)的(de)功能,也可以理解(jie)為(wei)是一個界面, Android系統中通(tong)過活動棧來(lai)對Activity進行管理,而Activity自(zi)身則(ze)通(tong)過其自(zi)己(ji)的(de)生命周期來(lai)使自(zi)己(ji)被創建(jian)與銷毀(hui),既然如此,就來(lai)我們來(lai)看看Activity都有(you)哪(na)些生命周期?

二.Activity生命周期詳(xiang)解

先來看看這張非常經典的生命周期流程圖:



大家一定(ding)對(dui)這(zhe)幅圖很(hen)熟悉吧,此前有許(xu)多關(guan)于(yu)Activity生命(ming)周期的文(wen)章,都是(shi)結合這(zhe)幅圖來進行講解,但(dan)是(shi)基本都是(shi)通(tong)過翻(fan)譯(yi)Android API,不是(shi)很(hen)好理解并且(qie)過于(yu)官方,希望大家可以通(tong)過我的總結,使得自己受益匪淺。

Android系統中(zhong)的(de)(de)Activity類定義(yi)了一(yi)系列的(de)(de)回調(diao)方(fang)(fang)(fang)法,當Activity的(de)(de)狀(zhuang)態發生改變(bian)時,相應(ying)(ying)的(de)(de)回調(diao)方(fang)(fang)(fang)法將會自(zi)動執行(xing),當Activity啟動之后,隨著應(ying)(ying)用程序的(de)(de)運行(xing),其自(zi)身(shen)會不(bu)斷的(de)(de)在各種狀(zhuang)態之間進行(xing)切換,相應(ying)(ying)的(de)(de)回調(diao)方(fang)(fang)(fang)法也將被(bei)執行(xing),我們只需選擇(ze)性的(de)(de)重寫這些方(fang)(fang)(fang)法即可進行(xing)相應(ying)(ying)的(de)(de)業務處理(li),這些狀(zhuang)態之間的(de)(de)轉(zhuan)換就構成了Activity的(de)(de)生命周(zhou)期(qi)。在Activity生命周(zhou)期(qi)中(zhong),主要有以下(xia)幾(ji)種方(fang)(fang)(fang)法:

onCreate():創建Activity時(shi)被回調,用(yong)作初始化(hua)(hua)信(xin)息,例如:通過(guo)setContentView()方法(fa)呈(cheng)現當前UI布局、初始化(hua)(hua)該項(xiang)目中(zhong)必要的(de)控件信(xin)息等(deng)。

onStart():啟(qi)動Activity時被(bei)回調,此(ci)時的Activity已經顯示,但(dan)是不能和用(yong)戶進行交互,只是可以(yi)看到。

onResume():當此方法被回(hui)調(diao)時,說明該Activity已經可以和用戶進行(xing)交互,獲(huo)得了焦點(例如:對按鈕進行(xing)監聽(ting)等)。

onPause():當此方(fang)法被(bei)回(hui)調時,表示(shi)Activity處于暫停狀態,也(ye)可以理解為該界(jie)面被(bei)部(bu)分遮蓋。一般情況下(xia)onStop()方(fang)法會(hui)緊接著被(bei)回(hui)調,但通過(guo)流(liu)程圖我們還可以看到一種(zhong)情況是onPause()方(fang)法執行(xing)后(hou)直接執行(xing)了onResume方(fang)法,這屬于比較罕見的現象(xiang)了,可以通過(guo)Activity跳(tiao)轉(zhuan)時把跳(tiao)轉(zhuan)到第二個(ge)界(jie)面主題設置(zhi)為Dialog對(dui)話框模式來實現,接下(xia)來會(hui)在代碼中為大家講解!

onStop(): 當此(ci)方法被回調(diao)時,表示(shi)Activity處于停止狀態,也可(ke)(ke)以理解為該界面被全部遮(zhe)蓋。此(ci)時的(de)Activity不(bu)可(ke)(ke)見,但是沒有被完全銷毀,仍在后臺中運行(xing)。

onRestart():當(dang)(dang)此(ci)方法被(bei)回(hui)調時,表示Activity正在重新啟動,這種情況一(yi)般是用戶打開(kai)了一(yi)個(ge)(ge)新的Activity時,當(dang)(dang)前的Activity就會被(bei)全(quan)部遮蓋(onPause和(he)onStop被(bei)執行了),接著又返(fan)(fan)回(hui)到(dao)當(dang)(dang)前Activity頁(ye)面時。也就是說從一(yi)個(ge)(ge)界(jie)面返(fan)(fan)回(hui)到(dao)之前的界(jie)面。

onDestroy():當此方(fang)法被回(hui)調時,表示該Activity正在被銷毀,生(sheng)命到此結束。一(yi)般我們可以在此方(fang)法中做(zuo)一(yi)些(xie)回(hui)收工作和終(zhong)的資源釋放。

實踐(jian)是檢驗(yan)真理的(de)唯一標準!接下來(lai)我們通(tong)過一個Demo來(lai)驗(yan)證上面流程(cheng)中的(de)幾種比較重要的(de)情況(kuang),同時來(lai)觀察生(sheng)命(ming)周期(qi)方法的(de)回調時機。

三(san).檢驗(yan)Activity生命周期(qi)情況

需求:實現(xian)兩個頁面間的跳轉,并且在各自Activity中重寫以上七(qi)種生(sheng)(sheng)命(ming)周期回(hui)調方(fang)法,在每個方(fang)法中通過Log.i在日志中打印(yin)輸出,終來判斷生(sheng)(sheng)命(ming)周期方(fang)法的回(hui)調時(shi)機。

代碼如下:

第一界面的UI部分

xmlns:tools="//schemas.android.com/tools"

android:layout_width="match_parent"

 android:layout_height="match_parent"

tools:context="com.example.test0104_life.MainActivity" >

<>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerHorizontal=&quot;true"

android:text="這是第一頁(ye)面"

android:textSize="30sp" />

<>

android:layout_width="wrap_content"

android:layout_height="wrap_content&quot;

android:layout_centerInParent="true"

android:onClick="click"

android:text="點擊跳轉" />

 

跳轉到第(di)二界(jie)面(mian)的(de)UI部(bu)分

 

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:layout_height="wrap_content"

android:layout_width="wrap_content"

android:text="這是第二頁面"

android:textSize="30sp"

android:layout_centerHorizontal="true" />

 

第一(yi)界面(mian)的java代(dai)碼:

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Log.i("tag", "First onCreat is called!!!"); }

public void click(View v) {

Intent i = new Intent(this, SecondActivity.class);

startActivity(i); }

@Override

protected void onStart() {

// TODO Auto-generated method stub

super.onStart();

Log.i("tag", "First onStart is called!!!&quot;); }

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

Log.i("tag", "First onResume is called!!!&quot;); }

@Override

protected void onPause() {

// TODO Auto-generated method stub

super.onPause();

Log.i("tag", "First onPause is called!!!"); }

@Override

protected void onStop() {

// TODO Auto-generated method stub

super.onStop();

Log.i("tag", &quot;First onStop is called!!!"); }

@Override

protected void onRestart() {

// TODO Auto-generated method stub

super.onRestart();

Log.i("tag", "First onRestart is called!!!"); }

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

Log.i("tag", "First onDestroy is called!!!"); } }

第二界面的java代碼:

public class SecondActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.second_activty);

 Log.i("tag", "Second onCreate is called!!!"); }

@Override

protected void onStart() {

// TODO Auto-generated method stub

super.onStart();

Log.i("tag", "Second onStart is called!!!"); }

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

Log.i("tag", "Second onResume is called!!!"); }

@Override

protected void onPause() {

// TODO Auto-generated method stub

super.onPause();

Log.i("tag", "Second onPause is called!!!");

}

 

@Override

protected void onStop() {

// TODO Auto-generated method stub

super.onStop();

Log.i("tag", "Second onStop is called!!!"); }

@Override

protected void onRestart() {

// TODO Auto-generated method stub

super.onRestart();

Log.i("tag", "Second onRestart is called!!!"); }

@Override

protected void onDestroy() {

// TODO Auto-generated method stub

super.onDestroy();

Log.i("tag", "Second onDestroy is called!!!&quot;); } }

下面我(wo)們通(tong)過(guo)Log打印(yin)來分析幾(ji)種生命周期方法的調用情況(kuang):

1.當我們成功(gong)運行Demo時,第一個界面被創建,調用結果(guo)如(ru)下:

分析:從Log中(zhong)我(wo)們(men)可(ke)以(yi)看出Activity啟動(dong)后,先(xian)調(diao)用(yong)(yong)了onCreate方(fang)法(fa)(fa),然后是onStart方(fang)法(fa)(fa),后是onResume方(fang)法(fa)(fa),獲得焦點,可(ke)以(yi)和用(yong)(yong)戶(hu)進(jin)行(xing)交(jiao)互。

執行(xing)步驟(zou): First onCreate→First onStart→First onResume

2.成功(gong)運行后(hou),點(dian)擊Home鍵,調用結果(guo)如(ru)下:

 分析:點擊Home鍵,該程序(xu)在(zai)后臺運行,沒有被(bei)徹底銷(xiao)毀,不需調(diao)用(yong)onDestroy方(fang)法,所以(yi),先調(diao)用(yong)onPause方(fang)法,界面被(bei)部分遮蓋,之后再調(diao)用(yong)onStop方(fang)法,界面被(bei)全(quan)部遮蓋。

執行步(bu)驟(zou): First onPause→First onStop

3.再次運行該程序,調(diao)用結果如(ru)下(xia):

分析:因為該程序(xu)一直在后(hou)臺運行(xing),所以再次啟動(dong)該程序(xu)時,直接調用onRestart方法,重新(xin)啟動(dong),之后(hou)執(zhi)行(xing)onStart方法,后(hou)是onResume方法

執行步驟:First onRestart→First onStart→First onResume

4.點擊按鈕跳(tiao)轉到(dao)第二(er)個界面(mian)時,調(diao)用結果如下:

分析:當(dang)進(jin)行(xing)第(di)(di)二界(jie)(jie)(jie)面(mian)跳轉時,第(di)(di)一界(jie)(jie)(jie)面(mian)先被(bei)部(bu)分遮蓋(gai),調(diao)用onPause,之(zhi)后創建第(di)(di)二界(jie)(jie)(jie)面(mian)的(de)流程和創建第(di)(di)一界(jie)(jie)(jie)面(mian)相同,先調(diao)用了onCreate方法,然后是onStart方法,后是onResume方法,成(cheng)功創建之(zhi)后第(di)(di)一界(jie)(jie)(jie)面(mian)被(bei)全(quan)部(bu)遮蓋(gai),執行(xing)onStop方法。(也可以(yi)理解為第(di)(di)二界(jie)(jie)(jie)面(mian)緩(huan)緩(huan)的(de)把第(di)(di)一界(jie)(jie)(jie)面(mian)進(jin)行(xing)遮蓋(gai)) 執行(xing)步驟(zou):First onPause→Second onCreate→Second onStart→Second onResume→First onStop

5.點(dian)擊Back鍵,返回到第一(yi)界面,調用結果如下(xia):

分(fen)(fen)析(xi):返回到第(di)一界面時,第(di)二界面先被(bei)部分(fen)(fen)遮蓋,之前沒(mei)有被(bei)銷(xiao)毀(hui)的第(di)一界面重新啟動,調用onRestart方(fang)法,然(ran)后是onStart方(fang)法,后是onResume方(fang)法,獲得焦點,再次的可以和用戶進(jin)行交互。之后第(di)二界面才被(bei)全部遮蓋,并且終(zhong)被(bei)徹底(di)銷(xiao)毀(hui),執(zhi)行onDestroy方(fang)法。

執行步驟:Second onPause→First onRestart→First onStart→First onResume→Second onStop→Second OnDestroy

6.此前我們提到(dao)過,流程圖還可以看(kan)到(dao)一種(zhong)情(qing)況是onPause方(fang)法執行后直接執行了onResume方(fang)法。我們將其(qi)第二個界面主題設置為Dialog對話框模(mo)式。

修改代碼(ma)如下:

android:label="@string/app_name"

android:theme="@style/MyTheme" >

點(dian)擊按(an)鈕跳轉第(di)二界面,調用結(jie)果(guo)如下:

分析:跳(tiao)轉到第二界(jie)面時,第一界(jie)面被(bei)(bei)部分遮蓋(gai),調用onPause,第二界(jie)面被(bei)(bei)創建(jian),和之前(qian)的流程相同(tong),先調用了onCreate方(fang)法(fa),然后(hou)是(shi)(shi)onStart方(fang)法(fa),后(hou)是(shi)(shi)onResume方(fang)法(fa),但是(shi)(shi)!當第二界(jie)面被(bei)(bei)創建(jian)完成時,第一界(jie)面也不(bu)會被(bei)(bei)全(quan)部遮蓋(gai),不(bu)會調用onStop方(fang)法(fa),因為主(zhu)題(ti)為Dialog對(dui)話(hua)框,界(jie)面較小,遮蓋(gai)不(bu)住之前(qian)的第一界(jie)面。

執行步(bu)驟(zou):First onPause→Second onCreate→Second onStart→Second onResume

接下(xia)來點(dian)擊(ji)Back鍵,返回到第(di)一界面:

分(fen)析:由于(yu)此前的第一界面沒有(you)被全部(bu)遮蓋,所以直接調用onResume方法,再次(ci)獲得焦點,并(bing)且與用戶進行交互。

執行步驟:Second onPause→Firat onResume→Second onStop→Second onDestroy

上一篇:數模轉換(芯片PCF8591)

下一篇:帶你了解make menuconfig

熱點文章推(tui)薦
華(hua)清(qing)學員就業榜(bang)單
高薪(xin)學(xue)員經驗分享
熱點(dian)新聞推薦
前臺(tai)專線:010-82525158 企業(ye)培訓洽談專線:010-82525379 院校合(he)作洽(qia)談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部