色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

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

Activity生命周期攻略 時間:2018-08-15      來源:未知

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

一.Activity簡介

作為Android四大組件之一,該組件為用戶提供了一個屏幕,用戶在這個屏幕上進行操作來完成一定的功能,也可以理解為是一個界面, Android系統中通過活動棧來對Activity進行管理,而Activity自身則通過其自己的生命周期來使自己被創建與銷毀,既然如此,就來我們來看看Activity都有哪些生命周期?

二.Activity生命周期詳解

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



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

Android系統中的Activity類定義了一系列的回調方法,當Activity的狀態發生改變時,相應的回調方法將會自動執行,當Activity啟動之后,隨著應用程序的運行,其自身會不斷的在各種狀態之間進行切換,相應的回調方法也將被執行,我們只需選擇性的重寫這些方法即可進行相應的業務處理,這些狀態之間的轉換就構成了Activity的生命周期。在Activity生命周期中,主要有以下幾種方法:

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

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

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

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

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

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

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

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

三.檢驗Activity生命周期情況

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

代碼如下:

第一界面的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="true"

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

android:textSize="30sp" />

<>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:onClick="click"

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

 

跳轉到第二界面的UI部分

 

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

 

第一界面的java代碼:

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!!!"); }

@Override

protected void onResume() {

// TODO Auto-generated method stub

super.onResume();

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

@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", "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!!!"); } }

下面我們通過Log打印來分析幾種生命周期方法的調用情況:

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

分析:從Log中我們可以看出Activity啟動后,先調用了onCreate方法,然后是onStart方法,后是onResume方法,獲得焦點,可以和用戶進行交互。

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

2.成功運行后,點擊Home鍵,調用結果如下:

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

執行步驟: First onPause→First onStop

3.再次運行該程序,調用結果如下:

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

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

4.點擊按鈕跳轉到第二個界面時,調用結果如下:

分析:當進行第二界面跳轉時,第一界面先被部分遮蓋,調用onPause,之后創建第二界面的流程和創建第一界面相同,先調用了onCreate方法,然后是onStart方法,后是onResume方法,成功創建之后第一界面被全部遮蓋,執行onStop方法。(也可以理解為第二界面緩緩的把第一界面進行遮蓋) 執行步驟:First onPause→Second onCreate→Second onStart→Second onResume→First onStop

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

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

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

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

修改代碼如下:

android:label="@string/app_name"

android:theme="@style/MyTheme" >

點擊按鈕跳轉第二界面,調用結果如下:

分析:跳轉到第二界面時,第一界面被部分遮蓋,調用onPause,第二界面被創建,和之前的流程相同,先調用了onCreate方法,然后是onStart方法,后是onResume方法,但是!當第二界面被創建完成時,第一界面也不會被全部遮蓋,不會調用onStop方法,因為主題為Dialog對話框,界面較小,遮蓋不住之前的第一界面。

執行步驟:First onPause→Second onCreate→Second onStart→Second onResume

接下來點擊Back鍵,返回到第一界面:

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

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

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

下一篇:帶你了解make menuconfig

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

回到頂部

主站蜘蛛池模板: 亚洲阿v天堂无码z2018 | 国产成人精品亚洲一区 | 久热这里只有精品99国产6 | 99久久国产宗和精品1上映 | 男人天堂社区 | 白丝女仆裸体被强趴内裤啪啪 | 不卡av中文字幕手机看 | 久久久乱码精品亚洲日韩mv | 国产专区一线二线三线码 | 小荡货腿张开让我cao爽视频 | 中日AV乱码一区二区三区乱码 | av在观线观看男人的天堂 | 狠狠综合久久久久尤物 | a级毛片免费观看在线播放 亚洲嫩妇 | 久久三级精品 | 又紧又大又爽精品一区二区 | 日本熟妇xxxx | 美女扒开腿让男人桶爽网站 | 五十路熟妇强烈无码 | 狠狠色噜噜狠狠狠狠777米奇 | 极品少妇被猛的白浆直喷白浆 | 2020国产激情视频在线观看 | 国产激情久久久久久熟女老人AV | 成年男人露jiji网站自慰 | 亚洲日韩AV无码中文字幕美国 | 成年人免费在线看惊悚片动作片 | 少妇爆乳无码专区网站 | 永久免费av无码国产网站 | 97久人人做人人妻人人玩精品 | FREEXXXX性中囯HD性 | 女邻居的大乳中文字幕 | 酒店大战丝袜高跟鞋人妻 | 中文字幕一线产区和二线区的区别 | 日韩A级无码免费视频 | 国产亚洲欧美日韩在线一区 | 香蕉久久精品日日躁夜夜躁夏 | 最近更新中文字幕视频 | 黄黄的网站在线观看 | 亚洲人成网线在线播放va | 伊人久久丁香色婷婷啪啪 | 欧美高清视频手机在在线 |