摘要:的控制又來控制一個棧和其狀態(tài)。但是當(dāng)變化發(fā)生的時候,將會有一個回調(diào)函數(shù)被執(zhí)行。。前一個仍然保留在返回棧當(dāng)中,但會處于停止?fàn)顟B(tài)。
接下來根據(jù)自己的平時的學(xué)習(xí)和自己最近要讀的兩本書《android開發(fā)藝術(shù)探索》和《android群英傳》來梳理記錄下自己的學(xué)習(xí)過程和對于遇到問題如何處理解決,還有將會陸續(xù)下一些有關(guān)關(guān)于如何將Java代碼寫的更優(yōu)雅的,結(jié)合自己讀過的書來做個記錄整理型的系列博客。這兩本書主要是關(guān)于android底層的實現(xiàn)的講得比較多,對于項目的實戰(zhàn)開發(fā),看了一下,《app研發(fā)錄》挺不錯的。對于開始架構(gòu)的設(shè)計上講得很不錯。
接下來是個人在Activity學(xué)習(xí)中,記錄下來的一些知識和個人的一些理解,同時附帶了自己的學(xué)習(xí)實例源碼。
涉及到activity的生命周期要提的是activity的七個生命周期回調(diào)函數(shù),首先看一下其各自的執(zhí)行順序。用戶參與下的Activity所進行的正常生命周期.
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("MAIN", "onCreate"); } @Override protected void onRestart() { super.onRestart(); Log.i("MAIN","onRestart"); } @Override protected void onStart() { super.onStart(); Log.i("MAIN", "onStart"); } @Override protected void onResume() { super.onResume(); Log.i("MAIN","onResume"); } @Override protected void onPause() { super.onPause(); Log.i("MAIN","onPause"); } @Override protected void onStop() { super.onStop(); Log.i("MAIN","onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.i("MAIN","onDestroy"); } }
測試結(jié)果
啟動
onCreate->onStart->onResume
屏幕熄滅
onPause->onStop
屏幕點亮
onStart->onResume
按下HOME鍵
onPause->onStop
按下返回鍵
onPause->onStop->onDestroy
各個生命周期特征
onCreate:當(dāng)打開一個新的Activity時執(zhí)行,可以用來加載布局或者是加載一些數(shù)據(jù)。 onStart:這個時候,Activity已經(jīng)可見,只是處在后臺,無法與用戶交互。 onReStart:在執(zhí)行了onStop之后,在此回到該Activity時,會執(zhí)行,可以用來進行一些恢復(fù)性操作。 onResume:此時activity已經(jīng)可見,而且可以和用戶進行交互。 onPause:表示activity正在停止,可進行一些動畫停止之類的操作處理。不可過于耗時。 onStop:activity即將停止,可以進行一些稍微耗時的操作。 onDestroy:這個時候,Activity被銷毀,可以進行一些回收工作和最終的資源釋放。
Activity跳轉(zhuǎn)時,兩個activity的生命周期如何變化,通過一個Activity向另一個Activity進行跳轉(zhuǎn),生命周期的變化時。
onCreate->onStart->onResume->onPause->onCreate->onStart->onResume->onStop
粗體部分為第二個Activity的活動周期,可以看出,當(dāng)?shù)谝粋€onPause執(zhí)行完之后,第二個activity便開始啟動,因此為了讓第二個activity啟動的速度加快,我們必須要將第一個activity中的onPause方法執(zhí)行的任務(wù)要盡量的少。activity的控制又AMS(Activity Manager Service)來控制一個activity棧和其狀態(tài)。
由于系統(tǒng)原因,導(dǎo)致的activity被創(chuàng)建銷毀
資源相關(guān)的系統(tǒng)配置導(dǎo)致的activity被殺死,典型的例子就是在橫豎屏切換的時候,系統(tǒng)提供了一個恢復(fù)機制,提供了兩個回調(diào)函數(shù)。onSaveInstanceState(),onRestoreInstanceState(),第一個函數(shù)在onPause之后會被執(zhí)行,而且是每次都會被執(zhí)行,但是對于onRestoreInstanceState()只有在activity被重新創(chuàng)建之后,才會在onStart之后執(zhí)行,所以在app開啟到屏幕方向切換的過程中生命周期的變化為:
onCreate->onStart->onResume->onPause->onSaveInstanceState->onStop->onDestroy->onCreate->onStart->onRestoreInstanceState->onResume
在橫豎過程中,前一個activity被銷毀,又重新創(chuàng)建一個。
在橫豎的變化中,不難發(fā)現(xiàn)的是,我們即使沒有對其中的控件做任何處理,其仍然可以在狀態(tài)切換之后,保持之前的狀態(tài),這個是如何實現(xiàn)的呢?在Activity被意外終結(jié)時,首先會去調(diào)用onSaveInstanceState()來保存數(shù)據(jù),然后其會委托Window去保存數(shù)據(jù),然后Window在委托其上層容器,ViewGroup,然后其通知哥哥子元素來保存各自的數(shù)據(jù),到此view的數(shù)據(jù)保存完成。
資源相關(guān)配置有很多,比如屏幕大小發(fā)生變化,SIM卡發(fā)生變化,字體大小發(fā)生變化,這些變化都可能會導(dǎo)致出現(xiàn)activity重啟,為了解決這個問題要采取的方式是,設(shè)置activity 的configChanges屬性,然后添加相應(yīng)的條件之后,就不會導(dǎo)致因為相關(guān)的配置的變化出現(xiàn)activity重啟的現(xiàn)象。但是當(dāng)變化發(fā)生的時候,將會有一個回調(diào)函數(shù)被執(zhí)行。onConfigurationChanged()。
在講啟動規(guī)則之前,先要說幾個概念。
任務(wù)棧:每一個應(yīng)用在打開的時候,都會創(chuàng)建一個或者多個任務(wù)棧,里面是activity,每個activity有一個屬性為taskAffinity,該屬性用來制定其要處在的任務(wù)棧的名稱標(biāo)示,默認(rèn)情況下,activity會繼承application,而application則會以包名作為其標(biāo)示。所以在監(jiān)聽一個應(yīng)用是否被打開的時候,可以監(jiān)聽其任務(wù)棧的名稱來判斷一個應(yīng)用是否當(dāng)前被打開。
standard:該種模式下,無論當(dāng)前的activity是否已經(jīng)存在,都會重新啟動一個,處在啟動方的棧中,所以不可以在application的context下啟動。
singleTop:該種模式下,如果當(dāng)前任務(wù)棧中所要啟動的activity位于棧頂,則不會重新啟動,否則重新啟動一個activity,采用該種方式,則會先暫停一下,調(diào)用onNewIntent,然后再調(diào)用onResume。
singleTask:該中模式下,會先去尋找其對應(yīng)的任務(wù)棧,然后在其任務(wù)棧中,尋找是否存在該實例,如果不存在,則創(chuàng)建實例,如果存在,則將其置為棧頂,如果又在其上的,則將其清除,如果不存在任務(wù)棧,則創(chuàng)建一個任務(wù)棧,然后創(chuàng)建實例。
singleInstance:多帶帶存放在一個棧中,當(dāng)該模式啟動的activity被創(chuàng)建后會多帶帶處在一個棧中,然后該棧不會創(chuàng)建新的activity。
對于啟動模式的設(shè)定,可以在xml文件中設(shè)置,同時也可以在啟動的時候,通過addFlags的方式進行設(shè)定,兩種方式的優(yōu)先級為動態(tài)設(shè)置的優(yōu)先級高。
我們可以通過在activity中的IntentFilter標(biāo)簽中設(shè)置相應(yīng)的過濾信息來唯一的標(biāo)示確認(rèn)一個activity,過濾信息有action,category,data,在我們平日里使用手機的時候,進行分享的時候,或者是選擇某個應(yīng)用打開某個文件的時候,都會出現(xiàn)一個應(yīng)用列表來供我們選擇,這個時候,其實是通過intent來打開某個activity的時候,匹配到的一些,過濾信息的匹配元素在匹配上擁有不同的規(guī)則。
action:一個intent中可以有多個action,但是只要其中一個和activity的相同,就可以匹配成功
data:過濾規(guī)則中的一個或多個和activity相同,才可以進行匹配。在設(shè)置的時候,通過setType和setData只能設(shè)置一個,因此需要通過setDataAndType,才可以同時對type和data進行,data由data和type。
category:可以不設(shè)置,但是如果設(shè)置了,其中的每一個都要和activity中對相匹配。
任務(wù)是一個Activity的集合,它使用棧的方式來管理其中的Activity,這個棧又被稱為返回棧(back stack),棧中Activity的順序就是按照它們被打開的順序依次存放的。
手機的Home界面是大多數(shù)任務(wù)開始的地方,當(dāng)用戶在Home界面上點擊了一個應(yīng)用的圖標(biāo)時,這個應(yīng)用的任務(wù)就會被轉(zhuǎn)移到前臺。如果這個應(yīng)用目前并沒有任何一個任務(wù)的話(說明這個應(yīng)用最近沒有被啟動過),系統(tǒng)就會去創(chuàng)建一個新的任務(wù),并且將該應(yīng)用的主Activity放入到返回棧當(dāng)中。
當(dāng)一個Activity啟動了另外一個Activity的時候,新的Activity就會被放置到返回棧的棧頂并將獲得焦點。前一個Activity仍然保留在返回棧當(dāng)中,但會處于停止?fàn)顟B(tài)。當(dāng)用戶按下Back鍵的時候,棧中最頂端的Activity會被移除掉,然后前一個Activity則會得重新回到最頂端的位置。返回棧中的Activity的順序永遠(yuǎn)都不會發(fā)生改變,我們只能向棧頂添加Activity,或者將棧頂?shù)腁ctivity移除掉。因此,返回棧是一個典型的后進先出(last in, first out)的數(shù)據(jù)結(jié)構(gòu)。
任務(wù)除了可以被轉(zhuǎn)移到前臺之外,當(dāng)然也是可以被轉(zhuǎn)移到后臺的。當(dāng)用戶開啟了一個新的任務(wù),或者點擊Home鍵回到主屏幕的時候,之前任務(wù)就會被轉(zhuǎn)移到后臺了。當(dāng)任務(wù)處于后臺狀態(tài)的時候,返回棧中所有的Activity都會進入停止?fàn)顟B(tài),但這些Activity在棧中的順序都會原封不動地保留著。
接下來將會寫一些關(guān)于Android中IPC相關(guān)的文章。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/65478.html
閱讀 3727·2021-11-25 09:43
閱讀 2607·2021-11-18 13:11
閱讀 2227·2019-08-30 15:55
閱讀 3278·2019-08-26 11:58
閱讀 2833·2019-08-26 10:47
閱讀 2237·2019-08-26 10:20
閱讀 1279·2019-08-23 17:59
閱讀 3014·2019-08-23 15:54