Android基礎(chǔ):Activity回顧(生命周期、啟動(dòng)模式)

2017年的第一篇博客、今天開始整理以下Android所學(xué)到的東西,這次整理Android基礎(chǔ)篇。

四大組件最常用的莫過于Activity。本文講從activity生命周期和啟動(dòng)模式

一、Activity的生命周期

activity生命周期.png

以上是來自官方的生命周期圖、看再多的博客都不如理解這樣圖來的快。

Activity主要有以下幾種執(zhí)行流程:

1、一般狀態(tài):Activity啟動(dòng)完成后點(diǎn)返回按鈕活調(diào)用finish方法

啟動(dòng) ----> onCreate----> onStart----> onResume
---- 運(yùn)行狀態(tài) ----
銷毀 ----> onPause----> onStop----> onDestroy---->end!

2、遮蓋情況:Activity啟動(dòng)---->被遮蓋(可見)----> 返回Activity

場景:從A啟動(dòng)一個(gè)dialog
---- 運(yùn)行狀態(tài) ----
彈出Dialog: ----> onPause
Dialog消失: ----> onResume

3、跳轉(zhuǎn)情況:Activity啟動(dòng)---->被遮蓋(不可見)----> 返回Activity

場景:1、從A界面跳轉(zhuǎn)到B界面 2、按下home按鍵
---- 運(yùn)行狀態(tài) ----
** A跳轉(zhuǎn)到B:**
---->A onPause-
---->B onCreate---->B onStart---->B onResume
---->A onStop
** B銷毀回A:** ---->A onRestart---->A onStart---->A onResume

4、異常情況:

當(dāng)activity調(diào)用onStop 存在于后臺(tái),此時(shí)activity處于Stopped狀態(tài)、優(yōu)先級(jí)別較低
當(dāng)系統(tǒng)內(nèi)存不足時(shí)候可能直接銷毀 Activity
注:這種情況Activity不會(huì)執(zhí)行onDestroy方法

主要方法解釋:

public class MainActivity extends Activity {
    //(創(chuàng)建)(第一次創(chuàng)建/系統(tǒng)回收了重新創(chuàng)建時(shí))調(diào)用。
    public void onCreate() 
    //(可見)Activity被激活,即將可見的時(shí)候調(diào)用
    public void onStart()
    //(獲取焦點(diǎn))Activity獲取焦點(diǎn)時(shí)候調(diào)用
    public void onResume()
    //(遮蓋可見)Activity被暫停活動(dòng),此狀態(tài)Activity已經(jīng)失去用戶焦點(diǎn),無法進(jìn)行交互但是任然可見。
    public void onPause()
    //(覆蓋不可見)Activity被完全停止,無法和用戶交互并且不可見。
    public void onStop()
    //(銷毀)Actiivty被銷毀了,并從Activity棧中壓出。
    public void onDestroy()
    //(重現(xiàn))Activity被重新激活,一般出現(xiàn)在重新回到前臺(tái)時(shí)調(diào)用。
    public void onRestart()
}

注:當(dāng)Activity執(zhí)行onResume獲取焦點(diǎn)之后,才開始測量繪制布局。
這也是為什么在onCreate、onStart和onResum方法中調(diào)用View.getMeasuredWidth獲取View大大小等于0的原因。

二、四種啟動(dòng)模式

  • standard-默認(rèn)模式
    1. 不論Activity實(shí)例存不存在,每次啟動(dòng)都會(huì)創(chuàng)建該活動(dòng)的一個(gè)新的實(shí)例
    2. 誰啟動(dòng)了該模式的Activity,該Activity就屬于啟動(dòng)它的Activity的任務(wù)棧中
  • singleTop-棧頂復(fù)用模式
    singleTop模式分3種情況:

    1. 當(dāng)前棧中已有該Activity的實(shí)例并且該實(shí)例位于棧頂時(shí),不會(huì)新建實(shí)例,而是復(fù)用棧頂?shù)膶?shí)例,并且會(huì)將Intent對(duì)象傳入,回調(diào)onNewIntent方法(注意:不會(huì)執(zhí)行 onCreate----> onStart----> onResume任何方法)
    2. 當(dāng)前棧中已有該Activity的實(shí)例但是該實(shí)例不在棧頂時(shí),其行為和standard啟動(dòng)模式一樣,依然會(huì)創(chuàng)建一個(gè)新的實(shí)例
    3. 當(dāng)前棧中不存在該Activity的實(shí)例時(shí),其行為同standard啟動(dòng)模式、會(huì)創(chuàng)建一個(gè)實(shí)例
  • singleTask-棧內(nèi)復(fù)用模式
    singleTask啟動(dòng)模式啟動(dòng)Activity時(shí),首先會(huì)根據(jù)taskAffinity去尋找當(dāng)前是否存在一個(gè)對(duì)應(yīng)名字的任務(wù)棧

    1. 如果不存在,則會(huì)創(chuàng)建一個(gè)新的Task,并創(chuàng)建新的Activity實(shí)例入棧到新創(chuàng)建的Task中去
    2. 如果存在,則得到該任務(wù)棧,查找該任務(wù)棧中是否存在該Activity實(shí)例
      • 如果存在實(shí)例,則將它上面的Activity實(shí)例都出棧,然后回調(diào)啟動(dòng)的Activity實(shí)例的onNewIntent方法
      • 如果不存在該實(shí)例,則新建Activity,并入棧

** 此外,我們可以將兩個(gè)不同App中的Activity設(shè)置為相同的taskAffinity,這樣雖然在不同的應(yīng)用中,但是Activity會(huì)被分配到同一個(gè)Task中去。**

  • singleInstance-全局唯一模式
    會(huì)單獨(dú)開一個(gè)任務(wù)棧單獨(dú)存放這個(gè)activity,這個(gè)任務(wù)棧只會(huì)在程序退出后消除。
    擁有singleTask的所有特性之外,此模式Activity只能單獨(dú)地位于一個(gè)新的任務(wù)棧中
    也就是,Activity啟動(dòng)之后,就會(huì)獨(dú)自在一個(gè)新的任務(wù)棧中,下次肯定不會(huì)重新創(chuàng)建該Activity,除非被系統(tǒng)殺死

注意:
1、standard、singleTop啟動(dòng)實(shí)例后會(huì)加入到默認(rèn)的Task中(默認(rèn)應(yīng)用的包名),即使你指定了taskAffinity屬性不會(huì)啟動(dòng)新的Task;
2、singleTask、singleInstance模式指定了taskAffinity屬性是會(huì)啟動(dòng)新的Task
3、盡量避免指定taskAffinity、和使用singleInstance模式、因?yàn)閯?chuàng)建新的Task耗性能不說坑還比較多
參考鏈接:徹底弄懂Activity四大啟動(dòng)模式

最后編輯于
?著作權(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),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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