如何對Android開發四大組件中的Activity添加容錯處理

如何對Android開發四大組件中的Activity添加容錯處理。Android的四大組件Activity、Service、Broadcast Receiver、Content Provider是一個android應用開發人員必須瞭解的基本知識,其中Activity是用的比較多的,Activity的生命周期基本都很瞭解,程序在正常運行的時候Activity的生命周期是可以按照你的預期走下去,但是如果應用發生瞭異常應該怎麼處理呢?比如在系統內存比較緊張的情況,你的應用被系統回收瞭怎麼辦?也許有些人說將自己的應用設置為system app不就可以瞭嗎,或許這樣是可以的,但是在極端的情況下system app也是會被系統殺死的,所以一個好的應用不僅應該在保證你的程序在正常情況下時能夠良好的運行,也應該為你的應用添加相應的容錯處理。

Android系統本身對Activity就有一些容錯處理,這裡就針對onSaveInstanceState()、onRestoreInstanceState()兩個方法進行說明。

一、基本作用:

Activity的 onSaveInstanceState() 和 onRestoreInstanceState()並不是生命周期方法,它們不同於 onCreate()、onPause()等生命周期方法,它們並不一定會被觸發。當應用遇到意外情況由系統銷毀一個Activity時,onSaveInstanceState() 會被調用。但是當用戶主動去銷毀一個Activity時,比如在應用中按返回鍵,onSaveInstanceState()就不會被調用。因為在這種情況下,Android系統認為用戶的行為不需要保存Activity的狀態。通常onSaveInstanceState()隻適合用於保存一些臨時性的狀態,而onPause()適合用於數據的持久化保存。

在activity被殺掉之前調用保存每個實例的狀態,以保證該狀態可以在onCreate(Bundle)或者onRestoreInstanceState(Bundle) (傳入的Bundle參數是由onSaveInstanceState封裝好的)中恢復。這個方法在一個activity被殺死前調用,當該activity在將來某個時刻回來時可以恢復其先前狀態。

例如,如果activity B啟用後位於activity A的前端,在某個時刻activity A因為系統回收資源的問題要被殺掉,A通過onSaveInstanceState將有機會保存其用戶界面狀態,使得將來用戶返回到activity A時能通過onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢復界面的狀態。

關於onSaveInstanceState (),是在函數裡面保存一些View有用的數據到一個Parcelable對象並返回。在Activity的onSaveInstanceState(Bundle outState)中調用View的onSaveInstanceState (),返回Parcelable對象,接著用Bundle的putParcelable方法保存在Bundle savedInstanceState中。當系統調用Activity的的onRestoreInstanceState(Bundle savedInstanceState)時,同過Bundle的getParcelable方法得到Parcelable對象,然後把該Parcelable對象傳給View的onRestoreInstanceState (Parcelable state)。在的View的onRestoreInstanceState中從Parcelable讀取保存的數據以便View使用。

二、onSaveInstanceState()函數的調用時機

根據Android的官方文檔中的描述為:當某個activity“容易”被系統銷毀的時候調用。註意這句話中的雙引號,“容易”被銷毀,這句話很可能被誤解為當系統銷毀我的activity時才會被調用,其實不是這樣的,它的意思就是說該activity還沒有被銷毀,而僅僅是一種可能性。那麼onSaveInstanceState()被調用的時機有哪些呢?總結如下:

(1)從activity A中啟動一個新的activity B時。

(2)長按HOME鍵,選擇運行其他的程序時。

(3)按下電源按鍵關閉屏幕顯示時。

(4)屏幕方向切換時,例如從豎屏切換到橫屏時。

(5)當用戶按下HOME鍵時。

總而言之一句話就是:在系統未經你的許可就有要銷毀在後臺運行的你的activity的可能性時,onSaveInstanceState()函數就會被調用。如果activity確實被銷毀瞭,那麼onSaveInstanceState()函數會在onPause或者onStop之前調用。

三、onRestoreInstanceState()函數的調用時機

onRestoreInstanceState()被調用的前提是,activity A“確實”被系統銷毀瞭,而如果僅僅是停留在有這種可能性的情況下,則該方法不會被調用。如果onRestoreInstanceState()函數被調用瞭,那麼它是在onStart與onResume之間調用。這裡 有一點要註意就是:onRestoreInstanceState()和onSaveInstanceState()並不是一定會成對的調用。 例如用戶按下HOME鍵回到主界面,在系統認為你有可能在未經你的允許下要銷毀activity,這時onSaveInstanceState()函數被調用,這時用戶又返回到activity,這種情況下activity 一般不會因為內存的原因被系統銷毀,所以onRestoreInstanceState()不會被調用。

onRestoreInstanceState()函數與onSaveInstanceState ()函數的調用關系總結為:調用onSaveInstanceState ()函數一定會調用onRestoreInstanceState()函數,但是調用onRestoreInstanceState()函數,不定會調用onSaveInstanceState ()。

四、onSaveInstanceState()中父類函數的調用

如果你的activity是繼承FragmentActivity,並且管理瞭很多fragment,如果你的activity未經你的允許銷毀瞭activity,這個時候會調用onSaveInstanceState()函數,其中函數中會有super.onSaveInstanceState()這樣一段調用父類函數的一個語句,如果執行瞭這段語句有時會導致你的多個fragment重疊的情況,因為默認時系統會調用父類函數去保存視圖圖層,這樣有時會導致fragment重疊問題,所以需要將super.onSaveInstanceState()這句話刪掉。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *