1. 程式人生 > >android activity 應該知道的一切

android activity 應該知道的一切

1 概述

activity在android中是基礎,但是activity的運用中有許多的知識和細節,不代表所有的東西,我們都已經瞭解。這裡我對activity的重要知識做出詳解。

2 生命週期

(1) 正常情況

生命週期是最基本的東西,不廢話直接上圖:

這裡寫圖片描述

這裡寫圖片描述

這是谷歌官方的圖,上面兩張圖很好的說明了activity的流程以及各種狀態之間的轉換關係。

activity是從什麼時候開始可見的,從官方的文件中看,有如下話語:

這裡寫圖片描述

這句話說得很清楚,當onStart被呼叫的時候,activity處於可見狀態。
不過,此時activity並不能與使用者互動,需要在onresume呼叫後才可以互動,所以。

其他的生命週期方法大家都比較清楚,還值得一說的是onPause方法,當我們在一個activity中啟動另一個的時候,他們之間的生命週期順序是怎麼樣的,要理解這一點,文件中的這段話尤為重要:

這裡寫圖片描述

這裡說明了,第一個activity會先執行onpause方法,隨後新啟動的activity會依次執行onCreate,onstart,onresume,隨後,當第一個activity變得不再可見的時候,才會執行它的onstop。這兩個activity之間的關係尤為重要。大家謹記。

(2) 異常情況

在文件的儲存狀態一節中,我們看到有如下圖:

這裡寫圖片描述

可以看到,這裡表明了在某些異常情況下,activity可能被回收,情況種類如下。

(a) 資源系統配置

例如橫豎屏變化的時候,activity可能被銷燬掉重建,或者裝置語言發生變化,或者鍵盤發生變化,如果不希望重啟activity,可以在configChanges中配置對應的選項,那麼activity將不會重新建立,取而代之的是回撥onConfigurationChanged方法。

(b ) 系統資源記憶體不足

這種情況下,系統會回收低優先順序的activity,保證系統的正常執行。

優先順序如下

前臺activity優先順序最高

可見的activity次之

最低的是不可見的activity

出現上訴兩種情況,需要在onSaveInstanceState和onRestoreInstanceState中儲存和恢復資料。在官方文件中可以看到,onSaveInstanceState將會在onStop之前呼叫,有時候也可能在onPause之前呼叫。

3 啟動模式

activity的啟動模式有4種,分別為

standard
標準模式,也是預設的模式,每次啟動一個activity都會建立一個新的activity的例項。例如B啟動了A,那麼A就會進入B的棧中。如果用Application來啟動一個activity就會報錯,因為Application並沒有一個activity的棧,此時需要加入FLAG_ACTIVITY_NEW_TASK標誌位,來新開啟一個棧,此時的activity實際上是以singleTask啟動的。
singleTop
棧頂複用模式,如果B啟動A,A就在棧頂,那麼A將不會被建立一個新的例項,而是直接呼叫onNewIntent,然後呼叫onResume。如果不再棧頂,那麼依然會重新建立一個例項。
singleTask
棧內複用,意思是,一個棧內,只會有一個例項。同樣的,系統會呼叫onNewIntent方法。呼叫這個Activity的時候,會判斷是否有其需要的棧,如果沒有,那麼建立棧並建立例項壓入棧中,如果有棧沒有例項,那麼建立例項壓入棧中,如果有棧有例項,那麼將例項調到棧頂,並清除掉棧中位於例項上面的activity。
singleInstance
單例模式,activity只有一個例項,並且單獨在一個task中,且這個task只有它一個activity。

如果判斷activity需要的任務棧呢,根據TaskAffinity屬性,預設情況下,這個屬性和包名相同,但是也可以人為指定。一般來說和singleTask或者allowTaskReparenting配合使用。除了singleTask以外,在standard以及singleTop中並不會新開task,而在singleInstance中會新開一個單獨的task,所以設定與否都沒有意義。

allowTaskReparenting標識是否允許activity調整到它原本就想要的task中。例如A應用打開了B應用中的頁面c,那麼c就進入了A的棧中,當我們從點選home然後從桌面點選B後,B的任務棧就建立了,此時系統發現c想要的任務棧B建立了,如果allowTaskReparenting為true,那麼c將會被移動到B中來。

4 Flags

activity的flag可以在intent中設定,這裡介紹幾個常用的。

FLAG_ACTIVITY_NEW_TASK
指定singleTask模式啟動

FLAG_ACTIVITY_SINGLE_TOP
指定singleTop啟動

FLAG_ACTIVITY_CLEAR_TOP
一般和singleTask一起出現,此時位於被啟動的activity棧上面的將activity被清除。如果是standard模式下使用這個標誌,那麼該棧中的這個activity以及他上面的都會被清除,然後重新建立一個例項。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
設定了這個標誌的activity不會出現在歷史activity列表中。

activity暫時講解到這裡,後面的文章,會講解intentFilter的詳細情況