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