純粹是個人學(xué)習(xí)總結(jié),如有不對的地方請吐槽呜投。
Activity的簡單介紹
什么是Activity?
activity是用戶可與之交互的獨立的可以聚焦的東西;它可以為用戶提供的是一個簡單的Window淘正,用戶可用于堆放自己想要的UI效果。
Activity是一個線程或者進(jìn)程嗎臼闻?
不是鸿吆,Activity是存在于某個進(jìn)程中,不是每一個activity都對應(yīng)于一個新的進(jìn)程述呐,多個activity可以在同一個進(jìn)程里面惩淳,甚至多個應(yīng)用還可以在同一個進(jìn)程里面;當(dāng)然可以設(shè)置不同的LaunchMode讓一個activity起來的時候創(chuàng)建一個進(jìn)程乓搬,但它本身肯定不是線程或者進(jìn)程思犁,但它通常是這個進(jìn)程的主角;
Activity本身的執(zhí)行邏輯是怎么樣的进肯?
總結(jié)一下: Activity是Android提供的應(yīng)用程序架構(gòu)激蹲,它規(guī)定了一個應(yīng)用運行的框架,它的生老病死江掩;負(fù)責(zé)它的基礎(chǔ)設(shè)施的創(chuàng)建和銷毀学辱,以及各個activity之間的切換,狀態(tài)管理等环形; 有了這些規(guī)定策泣,每個應(yīng)用開發(fā)者,不需要關(guān)心進(jìn)程的創(chuàng)建抬吟,不需關(guān)心主循環(huán)萨咕,比如你不會在apk包里面看到main函數(shù),你也不會在apk包里面看到有關(guān)主循環(huán)的東西火本,你也不需要關(guān)心你的程序如何被暫停危队,如何被關(guān)閉等等,只需要按照它規(guī)定的接口寫钙畔,就萬事俱備茫陆;這些接口也很簡單,也就是onCreate刃鳄,onStart盅弛,onResume,onPause,onResume,onRestart,onStop,onDestory,這些接口也不是都需要實現(xiàn)的挪鹏,
Activity是Android應(yīng)用程序組件见秽,實現(xiàn)一個用戶交互窗口,我們可以實現(xiàn)布局填充屏幕讨盒,也可以實現(xiàn)懸浮窗口解取。一個app由很多個Actvitiy組合而成,它們之間用intent-filter區(qū)別主次關(guān)系返顺。
activity子類:
ListActivity禀苦、ActivityGroup、TabActivity遂鹊、PreferenceActivity振乏、FragmentActivity 、ListFragment秉扑、NativeActivity慧邮、ExpandableListActivity、LauncherActivity舟陆、AliasActivity误澳、PreferenceFragment、ActivityUnitTestCase秦躯,AppCompatActivity
activity父類:
activity》ContextThemeWrapper》ContextWrapper》Context》Object
Activity的四種狀態(tài)
Running狀態(tài):一個新的Activity啟動入棧后忆谓,它在屏幕最前端,處于棧的最頂端踱承,此時它處于可見并可和用戶交互的激活狀態(tài)倡缠。
Paused狀態(tài):當(dāng)Activity被另一個透明或者Dialog樣式的Activity覆蓋時的狀態(tài)。此時它依然與窗口管理器保持連接勾扭,系統(tǒng)繼續(xù)維護(hù)其內(nèi)部狀態(tài)毡琉,它仍然可見,但它已經(jīng)失去了焦點妙色,故不可與用戶交互。
Stopped狀態(tài):當(dāng)Activity不可見時慧耍,Activity處于Stopped狀態(tài)身辨。當(dāng)Activity處于此狀態(tài)時,一定要保存當(dāng)前數(shù)據(jù)和當(dāng)前的UI狀態(tài)芍碧,否則一旦Activity退出或關(guān)閉時煌珊,當(dāng)前的數(shù)據(jù)和UI狀態(tài)就丟失了。
Killed狀態(tài):Activity被殺掉以后或者被啟動以前泌豆,處于Killed狀態(tài)定庵。這是Activity已從Activity堆棧中移除,需要重新啟動才可以顯示和使用。
4種狀態(tài)中蔬浙,Running狀態(tài)和Paused狀態(tài)是可見的猪落,Stopped狀態(tài)和Killed狀態(tài)時不可見的。
activity四種啟動模式:
簡單說明(適用版):
1. standard
默認(rèn)啟動模式畴博,每次激活A(yù)ctivity時都會創(chuàng)建Activity笨忌,并放入任務(wù)棧中,永遠(yuǎn)不會調(diào)用onNewIntent()俱病。
2. singleTop
如果在任務(wù)的棧頂正好存在該Activity的實例官疲, 就重用該實例,并調(diào)用其onNewIntent()亮隙,否者就會創(chuàng)建新的實例并放入棧頂(即使棧中已經(jīng)存在該Activity實例途凫,只要不在棧頂,都會創(chuàng)建實例溢吻,而不會調(diào)用onNewIntent()维费,此時就跟standard模式一樣)。
3. singleTask
如果在棧中已經(jīng)有該Activity的實例煤裙,就重用該實例(會調(diào)用實例的onNewIntent())掩完。重用時,會讓該實例回到棧頂硼砰,因此在它上面的實例將會被移除棧且蓬。如果棧中不存在該實例,將會創(chuàng)建新的實例放入棧中(此時不會調(diào)用onNewIntent())题翰。
4. singleInstance
在一個新棧中創(chuàng)建該Activity實例恶阴,并讓多個應(yīng)用共享改棧中的該Activity實例。一旦改模式的Activity的實例存在于某個棧中豹障,任何應(yīng)用再激活改Activity時都會重用該棧中的實例冯事,其效果相當(dāng)于多個應(yīng)用程序共享一個應(yīng)用,不管誰激活該Activity都會進(jìn)入同一個應(yīng)用中血公。
詳細(xì)說明:
standard模式:
默認(rèn)模式昵仅,可以不用寫配置。在這個模式下累魔,都會默認(rèn)創(chuàng)建一個新的實例摔笤。因此,在這種模式下垦写,可以有多個相同的實例吕世,也允許多個相同Activity疊加。
singleTop模式:
可以有多個實例梯投,但是不允許多個相同Activity疊加命辖。即况毅,如果Activity在棧頂?shù)臅r候,啟動相同的Activity尔艇,不會創(chuàng)建新的實例尔许,而會調(diào)用其onNewIntent方法。
若我意圖打開的順序為B1->B2->B2漓帚,則實際打開的順序為B1->B2(后一次意圖打開B2母债,實際只調(diào)用了前一個的onNewIntent方法)
若我意圖打開的順序為B1->B2->B1->B2,則實際打開的順序與意圖的一致尝抖,為B1->B2->B1->B2毡们。
singleTask模式:
只有一個實例。在同一個應(yīng)用程序中啟動他的時候昧辽,若Activity不存在衙熔,則會在當(dāng)前task創(chuàng)建一個新的實例,若存在搅荞,則會把task中在其之上的其它Activity destory掉并調(diào)用它的onNewIntent方法红氯。
如果是在別的應(yīng)用程序中啟動它,則會新建一個task咕痛,并在該task中啟動這個Activity痢甘,singleTask允許別的Activity與其在一個task中共存,也就是說茉贡,如果我在這個singleTask的實例中再打開新的Activity塞栅,這個新的Activity還是會在singleTask的實例的task中。
singleInstance模式:
只有一個實例腔丧,并且這個實例獨立運行在一個task中放椰,這個task只有這個實例,不允許有別的Activity存在愉粤。
程序有三個ActivityD1,D2,D3砾医,三個Activity可互相啟動,其中D2為singleInstance模式衣厘。那么程序從D1開始運行如蚜,假設(shè)D1的taskId為200,那么從D1啟動D2時影暴,D2會新啟動一個task怖亭,即D2與D1不在一個task中運行。假設(shè)D2的taskId為201坤检,再從D2啟動D3時,D3的taskId為200期吓,也就是說它被壓到了D1啟動的任務(wù)棧中早歇。
若是在別的應(yīng)用程序打開D2倾芝,假設(shè)Other的taskId為200,打開D2箭跳,D2會新建一個task運行晨另,假設(shè)它的taskId為201,那么如果這時再從D2啟動D1或者D3谱姓,則又會再創(chuàng)建一個task借尿,因此,若操作步驟為other->D2->D1屉来,這過程就涉及到了3個task了路翻。