一、生命周期
onCreate():當(dāng)activity被創(chuàng)建時(shí)調(diào)用,在這里主要做一些初始化的操作衅澈,如設(shè)置布局、初始化視圖谬墙、綁定控件等等今布。
onStart():當(dāng)用戶變成用戶可見時(shí)調(diào)用,此時(shí)的activity還不可見拭抬。舉個(gè)例子說明一下這個(gè)函數(shù)的意義部默,當(dāng)你按下home鍵直接返回了主頁面,再進(jìn)入這個(gè)activity時(shí)造虎,會(huì)先調(diào)用onRestart()函數(shù)傅蹂,再調(diào)用它,而不會(huì)去調(diào)用onCreate()函數(shù)了。這個(gè)函數(shù)一般是注冊一些變量份蝴,這些變量只有activity類在前臺(tái)時(shí)才能被響應(yīng).
onResume():activity獲取焦點(diǎn)時(shí)調(diào)用犁功,此時(shí)activity返回棧頂,并處于運(yùn)行狀態(tài)婚夫。這里一般可以做一些刷新UI的操作浸卦,每當(dāng)activity調(diào)用到這里時(shí)就刷新一下控件。
Activity失去了焦點(diǎn):這個(gè)很多人不理解案糙,這個(gè)失去焦點(diǎn)的意思就是用戶不能對(duì)activity操作了限嫌,比如我們彈出來一個(gè)廣告或者升級(jí)提示,這時(shí)activity我們就不能操作了时捌,但是依舊能看見怒医,當(dāng)再次關(guān)閉這個(gè)彈窗時(shí),又獲取了焦點(diǎn)奢讨,就再次執(zhí)行onResume()方法裆熙。
onPause():說明白了失去焦點(diǎn)的原因,這個(gè)函數(shù)就很容易理解了禽笑。這個(gè)函數(shù)主要是界面失去了焦點(diǎn),通常在這個(gè)函數(shù)中是對(duì)一些變量做操作蛤奥,會(huì)釋放一些占CPU資源佳镜,或者保存一些關(guān)鍵的數(shù)據(jù).官方解釋:
? ? (1)當(dāng)activity進(jìn)入后臺(tái)并且該Activity并未銷毀時(shí),該方法會(huì)被調(diào)用
? ? (2)在Activity A中啟動(dòng)Activity B,如果B的活動(dòng)頁面覆蓋在了A上面凡桥,那么Activity A則會(huì)調(diào)用onPause().
? ? (3)onPause()方法對(duì)應(yīng)的方法是onResume,如果一個(gè)Activity調(diào)用了onPause()不活動(dòng)狀態(tài)時(shí)蟀伸,那么當(dāng)Activity進(jìn)入活動(dòng)狀態(tài)的時(shí)候必定會(huì)調(diào)用onResume().
onStop():界面不可見,在activity完全不可見時(shí)調(diào)用.官方解釋:
? ? (1)當(dāng)前的Activity不再呈現(xiàn)給用戶的時(shí)候缅刽,onStop()被調(diào)用啊掏。
? ? (2)如果onStop()方法被調(diào)用之后,那么該Activity就處于掛起狀態(tài)衰猛。那么在此時(shí)的情況下迟蜜,要么喚醒它(onRestart()),要么銷毀它(onDestroy())啡省。
? ? (3)在某些情況下娜睛,該方法可能不會(huì)被調(diào)用。比如系統(tǒng)內(nèi)存過低導(dǎo)致無法確保在onPause()方法在被調(diào)用之后該Activity繼續(xù)保持著運(yùn)行狀態(tài)卦睹。
onDestroy():activity銷毀
onRestart():當(dāng)用戶按Home鍵返回桌面畦戒,并重新進(jìn)入activity時(shí)被調(diào)用。
生命周期這一塊用幾個(gè)例子加深一下理解:
(1)Activity A啟動(dòng)了Activity B的時(shí)候结序,Activity A和Activity B的生命周期的運(yùn)行的方法排序是什么障斋?
? ?正常狀態(tài):?onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A)
? ? Dialog:onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B)
(2)當(dāng)處于Activity B時(shí),點(diǎn)擊返回鍵回到Activity A時(shí),Activity A 和 Activity B的生命周期的運(yùn)行的方法排序是什么垃环?
? ? 正常狀態(tài):onPause(B) -> onRestart(A) -> onStart(A) -> onResume(A) -> onStop(B) -> onDestroy(B)
? ? Dialog:onPause(B) -> onResume(A) -> onStop(B) -> onDestroy(B)
(3)當(dāng)處于Activity B時(shí)邀层,按下鎖屏按鈕,Activity A和Activity B的生命周期方法排序是什么晴裹?
? ??正常狀態(tài):onPause(B) -> onStop(B)被济,重新喚醒時(shí):onRestart(B) -> onStart(B) -> onResume(B)
? ? Dialog:onPause(B) -> onStop(B) -> onStop(A),重新喚醒時(shí):onRestart(B) -> onStart(B) -> onRestart(A) -> onStart(A) ->?? ??????onResume(B)
(4)如果設(shè)置Activity B的主題為Dialog風(fēng)格的話,那么(1)(2)(3)的結(jié)果分別是什么涧团?
二只磷、啟動(dòng)模式
? ??standard:默認(rèn)模式,可以不用寫配置泌绣。在這個(gè)模式下钮追,都會(huì)默認(rèn)創(chuàng)建一個(gè)新的實(shí)例。因此阿迈,在這種模式下元媚,可以有多個(gè)相同的實(shí)例,也允許多個(gè)相同的Activity疊加苗沧。
? ??singletask:開啟一個(gè)ActivityB的時(shí)候檢查任務(wù)棧里面是否有這個(gè)ActivityB的實(shí)例存在刊棕,如果存在的話,清空這個(gè)任務(wù)棧ActivityB上面的所有的Activity待逞,復(fù)用這個(gè)ActivityB甥角。
? ??singletop:如果發(fā)現(xiàn)任務(wù)棧的棧頂已經(jīng)存在這個(gè)Activity,再去開啟Activity的時(shí)候识樱,就不去重新創(chuàng)建新的Activity而是復(fù)用這個(gè)棧頂已經(jīng)存在的Activity嗤无。
singleinstance:開啟一個(gè)新的任務(wù)棧,任務(wù)棧里面只有一個(gè)Activity的實(shí)例存在怜庸,如果這個(gè)Activity被開啟当犯,把這個(gè)任務(wù)棧放在前面,如果開啟了新的別的Activity割疾,則別的Activity所在的任務(wù)棧會(huì)被放在前面嚎卫。極端的說,在整個(gè)手機(jī)的操作系統(tǒng)里面只會(huì)有一個(gè)實(shí)例存在宏榕。
三驰凛、創(chuàng)建流程
? ? (1)自定義類名,繼承Activity類(Activity和AppCompatActivity二選一担扑,后者提供了一些新的東西).
? ? (2)重寫onCreate()方法恰响,在該方法中調(diào)setContentView()設(shè)置要顯示的視圖.
? ? (3)在AndroidManifest.xml對(duì)Activity進(jìn)行配置
? ? 注意:onCreate()方法中的函數(shù),可以填兩個(gè)參數(shù)一個(gè)是Bundle savedInstanceState,另一個(gè)是PersistableBundle persistableState,如果要用第二個(gè)函數(shù)要在配置文件中為Activity設(shè)置一個(gè)屬性:
? ? ? ? ? ? android:persistableMode="persistAcrossReboots"
然后Activity就有了持久化的能力涌献,一般會(huì)搭配兩個(gè)方法使用:
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState);
前一個(gè)方法會(huì)在下述情形中被調(diào)用:
1.點(diǎn)擊home鍵回到主頁或長按后選擇運(yùn)行其他程序
2.按下電源鍵關(guān)閉屏幕
3.啟動(dòng)新的Activity
4.橫豎屏切換時(shí)胚宦,肯定會(huì)執(zhí)行,因?yàn)闄M豎屏切換的時(shí)候會(huì)先銷毀Act,然后再重新創(chuàng)建 重要原則:當(dāng)系統(tǒng)"未經(jīng)你許可"時(shí)銷毀了你的activity枢劝,則onSaveInstanceState會(huì)被系統(tǒng)調(diào)用井联, 這是系統(tǒng)的責(zé)任,因?yàn)樗仨氁峁┮粋€(gè)機(jī)會(huì)讓你保存你的數(shù)據(jù)(你可以保存也可以不保存)您旁。
說回這個(gè)Activity擁有了持久化的能力烙常,增加的這個(gè)PersistableBundle參數(shù)令這些方法 擁有了系統(tǒng)關(guān)機(jī)后重啟的數(shù)據(jù)恢復(fù)能力!鹤盒!而且不影響我們其他的序列化操作
四蚕脏、啟動(dòng)一個(gè)Activity的幾種方式
1.顯式啟動(dòng)
? ? (1)最常用的
? ? ? ? ? ? startActivity(new Intent(當(dāng)前Act.this,要啟動(dòng)的Act.class));
? ? ?(2)通過Intent的ComponentName:
? ? ? ? ? ??ComponentName cn = new ComponentName("當(dāng)前Act的全限定類名","啟動(dòng)Act的全限定類名") ;
? ? ? ? ? ? Intent intent = new Intent() ;
? ? ? ? ? ? intent.setComponent(cn) ;
????????????startActivity(intent) ;
? ? (3)初始化Intent時(shí)指定包名
????????????Intent intent = new Intent("android.intent.action.MAIN");
????????????intent.setClassName("當(dāng)前Act的全限定類名","啟動(dòng)Act的全限定類名");
????????????startActivity(intent);