1. 程式人生 > ><Android基礎>(三) Activity Part 2

<Android基礎>(三) Activity Part 2

不可 不可靠 spa 進行 ima 應用程序 屬性 second android

1.活動生命周期

1)返回棧

2)活動狀態

3)活動的生存期

2.活動的啟動模式

1)standard

2)singleTop

3)singleTask

4)singleInstance

3.活動的優化設計

1)設計知道當前的運行活動

2)隨時隨地退出程序

3)程序的啟動優化

2.4 活動的生命周期

2.4.1 返回棧

Android系統使用任務(Task)來管理活動,一個任務就是一組存放在棧裏的活動的集合,這個棧也被稱作返回棧(Back Stack)。棧為先進後出的數據結構。

啟動一個新活動,它再返回棧中入棧,並處於棧頂的位置。每當按下Back鍵或調用finish()方法去銷毀一個活動時,處於棧頂的活動會出棧,這時前一個入棧的活動就會重新處於棧頂的位置。系統總會顯示處於棧頂的活動給用戶。

技術分享圖片

(圖片來源於網絡)

2.4.2 活動狀態

1.運行狀態:當一個活動處於棧頂時,這時活動就處於運行狀態。

2.暫停狀態:當一個活動不再處於棧頂,但仍然可見(比如對話框形式的活動只會占有部分區域),這時就進入了暫停狀態。

3.停止狀態:當一個活動不在處於棧頂,並且完全不可見的時候,就進入了停止狀態。系統仍會為這種活動保存相應的狀態和成員變量,但並不可靠。

4.銷毀狀態:當一個活動從返回棧中移除後就變成了銷毀狀態。

2.4.3 活動的生存期

1.Activity類中定義了7個回調方法,覆蓋了活動生命周期的每一個環節。

onCreate( )。在活動第一次被創建的時候調用。在該方法中完成活動的初始化操作。如:加載布局、綁定事件等。

onStart( )。在活動由不可見變為可見的時候調用。

onResume( )。在活動準備好和用戶進行交互的時候調用。此時活動一定位於返回棧的棧頂,並且處於運行狀態。

onPause( )。在系統準備去啟動或恢復另一個活動時調用。

onStop( )。在活動完全看不見的時候調用。它和onPause( )方法的主要區別在於,如果啟動一個對話框式的活動,onPause( )就會執行,而onStop( )不會執行。

onDestroy( )。在活動被銷毀之前調用,之後活動的狀態將變為銷毀狀態。

onRestart( )。在活動由停止狀態變為運行狀態之前調用,也就是活動被重新啟動了。

2.

三種生存周期

完整生存期。

活動在onCreate( )和onDestroy( )方法之間所經歷的就是完整生存期。

可見生存期。

活動在onStart( )和onStop( )方法之間所經歷的就是可見生存期。

前臺生存期。

活動在onResume( )和onPause( )方法之間所經歷的就是前臺生存期。

Android官方提供的活動生存周期圖。

技術分享圖片

(圖片來源於網絡)

2.4.5 避免活動回收數據消失

當一個活動進入了停止狀態,是有可能被系統回收的。

Activity中提供了onSaveInstanceState( )方法,保證在活動被回收之前一定會被調用。

onSaveInstanceState( )方法會攜帶一個Bundle類型的參數,Bundle提供了一系列的方法用於保存數據。如:putString( )方法保存字符串,putInt( )方法用於保存整型數字……

每個保存方法傳入兩個參數,第一個參數是鍵,用於後面從Bundle中取值,第二個參數是真正要保存的內容。

(創建新活動MainActivity, NormalActivity, DialogActivity)

1.MainActvity重寫方法onSaveInstanceState( )

技術分享圖片

2.修改MainActivity的onCreate( )方法

技術分享圖片

2.5 活動的啟動模式

standard、singleTop、singleTask和singleInstance

通過在AndroidManifest.xml中通過給<activity>標簽指定android:launchMode屬性來選擇啟動模式。

2.5.1 standard

standard是活動的默認啟動方式,在不進行顯示指定的情況下,所有活動都會自動使用該啟動模式。在standard啟動模式下,每當啟動一個新的活動,它就會在返回棧中入棧,並處於棧頂的位置。

每次啟動都會創建該活動的一個新的實例。有時活動已經在棧頂了,再次啟動時還要創建一個新的活動實例。

2.5.2 singleTop

當活動的啟動模式指定為singleTop,在啟動活動時如果發現返回棧的棧頂已是該活動,則認為可以直接使用它,不用再創建新的活動實例。

Eg:

FirstActivity使用singleTop模式啟動。

FirstActivity—>SecondActivity—>FirstActivity 仍會產生兩個FirstActivity實例。

此時在FirstActivity按下Back鍵,返回SecondActivity,再按Back鍵返回第一個創建的FirstActivity,最後按下Back鍵才會退出。

2.5.3 singleTask

當活動模式指定為singleTask,每次啟動該活動時系統首先會再返回棧中檢查是否存在該活動的實例,如果發現已經存在則直接使用該實例,並把在這個活動之上的所有活動統統出棧,如果沒有則創建新實例。

2.5.4 singleInstance

指定為singleInstance模式的活動會啟用一個新的返回棧來管理活動。

假設程序中有一個活動是允許其他程序調用的,讓其他程序和該程序可以共享這個活動的實例。在singleInstance模式下會有一個單獨的返回棧來管理該活動,不管是哪個應用程序來訪問這個活動,都共用的同一個返回棧。

FirstActivity、SecondActitvity、ThirdActivity,其中SecondActivity使用singleInstance模式進行啟動。

FirstActivity—>SecondActivity—>ThirdActivity

按下Back鍵進行返回,ThirdActivity直接返回了FirstActivity,再按下Back鍵返回SecondActivity,再按下Back鍵退出程序。FirstActivity和ThirdActivity在同一個返回棧,SecondActicity在單獨的一個返回棧裏。

2.6 活動的優化設計

2.6.1 設計知道當前是哪一個活動

新建一個Java類BaseActivity,讓其繼承AppCompatActivity類,在BaseActivity中重寫onCreat( )方法。

技術分享圖片

在onCreat( )方法中獲取了當前實例的類名,並通過Log打印了出來。

再次運行程序,就可以發現logcat中打印出了當前運行活動的名稱。

2.6.2 隨時隨地退出程序

1.用一個專門的集合類對所有的活動進行管理。

技術分享圖片

設計一個類ActivityCollector,用List來暫存活動,提供addActivity()方法來向List中添加活動那個,removeActivity()方法來從List中移除活動,最後提供一個finishAll()方法來將List中的活動全部銷毀掉。

2.修改BaseActivity中的代碼

技術分享圖片

在onCreate()方法中調用了ActivityCollector的addActivity()方法,表明當前正在創建的活動增加到活動管理器裏。在BaseActivity中重寫onDestroy()方法,表明將一個馬上銷毀的活動從活動管理器中移除。

現在不論想在任何活動退出,只需要調用ActivityColletor.finishAll()方法即可。

Eg:

技術分享圖片

在ThirdActivity中的Button 3設置finishAll(),按下Button 3,即銷毀所有活動。

加一句android.os.Process.killProcess(android.os.Process.myPid());可以殺掉當前進程的代碼,以保證程序完全退出。

killProcess()方法只能用於殺掉當前程序的進程,不能用該方法去殺掉其他程序。

2.6.3 啟動活動的最佳寫法

假如SecondActivity中需要用到兩個很重要的字符串參數,在啟動SecondActivity的時候必須要傳遞過來。

1.常規寫法:

技術分享圖片

2.優化寫法

修改SecondActivity中的代碼

技術分享圖片

在actionStart()方法中完成Intent的構建,所有需要的數據通過actionStart()方法的參數傳遞過來,然後存儲在Intent中,最後調用startActivity()方法啟動SecondActivity。

在FirstActivity中修改代碼:

技術分享圖片

SecondActivity所需要的數據在方法參數中全部體現出來了,只需要一行代碼即可啟動SecondActivity。

<Android基礎>(三) Activity Part 2