activity中的onPause()和onSaveInstanceState()解析

    當用戶在開啓一個新activity時,當前的activity可能在內存中處於中止狀態也可能因爲新activity須要更多內存而被系統殺掉了,但不論怎樣,當用戶在新activity上按返回鍵時,他但願看到的是原先的activity的界面。原先的activity若是是被從新建立,那麼它要恢復到用戶最後看到它的樣子。那麼咱們怎麼作呢?其實也不難,跟據上一節所述,在onPause()或onStop()或onDestyroy()中保存必要的數據就好了。可是如今google又冒出一個新的東西:onSaveInstanceState(),觀其名可知其意:它是專門用來保存實例狀態的,這個「實例」不是指的activity對象,而是它所在的進程,由於activity的銷燬是由於它所在的進程被殺而形成的。onSaveInstanceState()是在系統感受須要殺死activity時調用的,它被傳入一個參數:Bundle,這個Bundle能夠被認爲是個map,字典之類的東西,用」鍵-值」來保存數據。android

    如今又叫人蛋疼了:不是能夠在onPause()中保存數據嗎?爲何又搞出這樣一個傢伙來?它們之間是省木關係呢?原來onSaveInstanceState()的主要目的是保存activity的狀態有關的數據,當系統在殺死activity時,若是它但願activity下次出現的樣子跟如今徹底同樣,那麼它就調用這個onSaveInstanceState(),不然就不調用。因此要明白這一點:onSaveInstanceState()並非永遠都會調用。好比,當用戶在一個activity上按返回時,就不會調用,由於用戶此時明確知道這個activity是要被銷燬的,並不指望下次它的樣子跟如今同樣(固然開發者可使它保持臨死時的表情,你非要這樣作,系統也沒辦法),因此就不用調用onSaveInstanceState()。如今應該明白了:在onPause(),onStop()以及onDestroy()中須要保存的是那些須要永久化是數據,而不是保存用於恢復狀態的數據,狀態數據有專門的方法:onSaveInstanceState()。數據保存在一個Bundle中,Bundle被系統永久化。當再調用activity的onCreate()時,原先保存的bundle就被傳入,以恢復上一次臨死時的模樣,若是上次死時沒有保存Bundle,則爲null。網絡

      還沒完呢,若是你沒有實現本身的onSaveInstanceState(),可是activity上控件的樣子可能依然能被保存並恢復。原來activity類已實現了onSaveInstanceState(),在onSaveInstanceState()的默認實現中,會調用全部控件的相關方法,把控件們的狀態都保存下來,好比EditText中輸入的文字,CheckBox是否被選中等等。然而不是全部的控件都能被保存,這取決於你是否在layout文件中爲控件賦了一個名字(android:id)。有名的就存,無名的無論。測試

      既然有現成的可用,那麼咱們到底還要不要本身實現onSaveInstanceState()?這得看狀況了,若是你本身的派生類中有變量影響到UI,或你程序的行爲,固然就要把這個變量也保存了,那麼就須要本身實現,不然就不須要,但大多數狀況確定須要本身實現一下下了。對了,別忘了在你的實現中調用父類的onSaveInstanceState()。google

注:因爲onSaveInstanceState()並非每次銷燬時都會調用,因此不要在其中保存那些須要永久化的數據,執行保存那些數據的最好地方是:onPause()中。spa

    測試你程序的狀態恢復能力的最好方法是:旋轉屏幕,每當屏幕的方向改變時,當前的activity就會被系統銷燬,而後從新建立(應該是進程被關閉!――不會吧?效率不高哦)。對象

    (以上內容收集與網絡)進程

相關文章
相關標籤/搜索