2017年的第一篇博客、今天開始整理以下Android所學(xué)到的東西告匠,這次整理Android基礎(chǔ)篇离唬。
四大組件最常用的莫過于Activity输莺。本文講從activity生命周期和啟動(dòng)模式
一裸诽、Activity的生命周期
以上是來自官方的生命周期圖丈冬、看再多的博客都不如理解這樣圖來的快甘畅。
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
場(chǎng)景:從A啟動(dòng)一個(gè)dialog
---- 運(yùn)行狀態(tài) ----
彈出Dialog: ----> onPause
Dialog消失: ----> onResume
3泄朴、跳轉(zhuǎn)情況:Activity啟動(dòng)---->被遮蓋(不可見)----> 返回Activity
場(chǎng)景: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)之后苹威,才開始測(cè)量繪制布局。
這也是為什么在onCreate掷酗、onStart和onResum方法中調(diào)用View.getMeasuredWidth獲取View大大小等于0的原因泻轰。
二糕殉、四種啟動(dòng)模式
-
standard-默認(rèn)模式
- 不論Activity實(shí)例存不存在殖告,每次啟動(dòng)都會(huì)創(chuàng)建該活動(dòng)的一個(gè)新的實(shí)例
- 誰啟動(dòng)了該模式的Activity黄绩,該Activity就屬于啟動(dòng)它的Activity的任務(wù)棧中
-
singleTop-棧頂復(fù)用模式
singleTop模式分3種情況:- 當(dāng)前棧中已有該Activity的實(shí)例并且該實(shí)例位于棧頂時(shí)爽丹,不會(huì)新建實(shí)例辛蚊,而是復(fù)用棧頂?shù)膶?shí)例袋马,并且會(huì)將Intent對(duì)象傳入秸应,回調(diào)onNewIntent方法(注意:不會(huì)執(zhí)行 onCreate----> onStart----> onResume任何方法)
- 當(dāng)前棧中已有該Activity的實(shí)例但是該實(shí)例不在棧頂時(shí)软啼,其行為和standard啟動(dòng)模式一樣祸挪,依然會(huì)創(chuàng)建一個(gè)新的實(shí)例
- 當(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ù)棧- 如果不存在帆调,則會(huì)創(chuàng)建一個(gè)新的Task番刊,并創(chuàng)建新的Activity實(shí)例入棧到新創(chuàng)建的Task中去
- 如果存在,則得到該任務(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)模式