Android中activity儲存資料和狀態在哪個方法實現

來源:互聯網
上載者:User

標籤:

       以前只知道在Activity銷毀之前,要把資料儲存在 onSaveInstanceState(Bundle)方法中,後來學習了別人的微博,學到了很多細節問題,所以整理了一下,希望能幫到大家。

      如果看官方文檔會發現:對於activity的銷毀,有下面這麼一個表:

        

      "Killable"表示當前activity是否可以被殺死,意思是說當上面標記為Killable的方法返回之後,activity就可能隨時被殺死。從表中不難看出在onPause方法調用完之前,activity都是不能夠被殺死的,而onStop()和onDestroy()都是可以被殺死的。

      但是圖中又標出了一個黃色的標記:HONEYCOMB。官方文章原文是這樣說的:Starting with Honeycomb, an application is not in the killable state until itsonStop() has returned. 

從Honeycomb(Android 3.0)開始,應用只有等到onStop()方法返回之後,才可以被殺死,也就是說在執行完onStop()方法之前,應用都不可能被殺死。you should usethe onPause() method to write any persistent data (such as user edits) to storage.你應該在onPause()方法中去儲存那些持久性的資料,比如使用者的輸入等。

 

       the method onSaveInstanceState(Bundle) is called before placing the activity in such a background state, allowing you to save away any dynamic instance state in your activity into the given Bundle, to be later received in onCreate(Bundle) if the activity needs to be re-created.

       onSaveInstanceState(Bundle)將在activity轉入“background state後台狀態”之前被調用,能讓我們儲存一些activity的動態狀態值到Bundle對象中,以便在之後調onCreate(Bundle)方法時用到。 

 

這裡提到一個“background state後台狀態”,我們來看看activity的幾種狀態:

  前台狀態

  • 通俗的說就是可以看到,且可以操作(有焦點)的狀態

  • 可視狀態

  • 即可以看得見(沒有被完全遮擋),但是沒有焦點,不可以觸摸操作;比如躲在對話方塊後面的activity 

  • 後台狀態

  • 已經看不到了,系統可以將這個進程殺死來回收記憶體。如果在這種狀態下activity被系統殺死了,那麼在使用者重新開啟這個activity的時候,它的onCreate方法會使用之前onSaveInstanceState(Bundle)儲存的狀態資料,來讓自己恢複到之前的狀態 

  • 空進程狀態

  • 一個沒有持有任何activity和任何應用組件的進程,比如Services或者廣播接受者,當記憶體不足的時候,它們將會被先殺死並回收。

     

    也就是說onSaveInstanceState(Bundle)會在activity轉入後台狀態之前被調用,也就是onStop()方法之前,onPause方法之後被調用;我們都知道在預設情況下,在旋屏之後,activity會重新經曆一次生命週期,下面的log就是在點擊旋屏之後的執行順序: 

  •  

  •  

    這樣看起來,那種要儲存的永久性性資料,應該在onPause下完成,而activity的一些狀態值,比如組件寬高之類的,應該在onSaveInstanceState中儲存在Bundle中去。 

    但是要注意的是,官方文檔最後又給出了一個警告: 

     Note that it is important to save persistent data in onPause() instead of onSaveInstanceState(Bundle) because the latter is not part of the lifecycle callbacks, so will not be called in every situation as described in its documentation. 

    由於onSaveInstanceState(Bundle)方法不是activity生命週期中的回調方法之一,所以在activity被殺死的時候,它是不能保證百分百的被執行的,所以在這個方法也不一定是完全靠譜的。

     

    生命週期圖:

  • 轉載請註明出處:http://blog.csdn.net/cyp331203/article/details/44985087

Android中activity儲存資料和狀態在哪個方法實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.