Android 開發之 Activity 狀態儲存 OnSaveInstanceState參數解析

來源:互聯網
上載者:User

標籤:android   saveinstance   

作者 : 韓曙亮

轉載請著名出處 : http://blog.csdn.net/shulianghan/article/details/38297083



一. 相關方法簡介



1. 狀態儲存方法樣本


package com.example.octopus_saveinstance;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);}}


2. 相關方法介紹 



(1) onCreate(Bundle savedInstanceState) 方法


Activity 建立時回調 : 該方法會自動傳入一個 Bundle 對象, 該 Bundle 對象就是上次被系統銷毀時在 onSaveInstanceState 或者 onRestoreInstanceState 中儲存的資料;

-- 注意 : 只有是系統自動回收的時候才會儲存 Bundle 對象資料;

-- Bundle 對象來源 : onCreate() 方法中的 Bundle 對象參數, 是在 onSaveInstance() 或者 onRestoreInstanceState() 方法中儲存的 Bundle 對象;

.



(2) onSaveInstanceState(Bundle outState) 方法


outState 參數作用

-- 資料儲存 : Activity 聲明周期結束的時候, 需要儲存 Activity 狀態的時候, 會將要儲存的資料使用索引值對的形式 儲存在 Bundle 對象中;

-- 恢複資料 : 在 Activity 的 onCreate()方法 建立 Activity 的時候會傳入一個 Bundle 對象, 這個 Bundle 對象就是這個 outState 參數;


調用時機 : Activity 容易被銷毀的時候調用, 注意是容易被銷毀, 也可能沒有銷毀就調用了;

-- 按下Home鍵 : Activity 進入了後台, 此時會調用該方法;

-- 按下電源鍵 : 螢幕關閉, Activity 進入後台;

-- 啟動其它 Activity : Activity 被壓入了任務棧的棧底;

-- 橫豎屏切換 : 會銷毀當前 Activity 並重新建立;


onSaveInstanceState方法調用注意事項

-- 使用者主動銷毀不會調用 : 當使用者點擊回退鍵 或者 調用了 finish() 方法, 不會調用該方法;

-- 調用時機不固定 : 該方法一定是在 onStop() 方法之前調用, 但是不確定是在 onPause() 方法之前 還是 之後調用;

-- 布局中組件狀態儲存 : 每個組件都 實現了 onSaveInstance() 方法, 在調用函數的時候, 會自動儲存組件的狀態, 注意, 只有有 id 的組件才會儲存;

-- 關於預設的 super.onSaveInstanceState(outState) : 該預設的方法是實現 組件狀態儲存的;



(3) onRestoreInstanceState(Bundle savedInstanceState) 方法


方法回調時機 : 在 Activity 被系統銷毀之後 恢複 Activity 時被調用, 只有銷毀了之後重建的時候才調用, 如果記憶體充足, 系統沒有銷毀這個 Activity, 就不需要調用;

-- Bundle 對象傳遞 : 該方法儲存的 Bundle 對象在 Activity 恢複的時候也會通過參數傳遞到 onCreate() 方法中;

-- 位於生命週期位置吧 : 該方法在 onResume() 方法之前儲存資訊; 



二 程式碼範例


Activity 主要代碼

package com.example.octopus_saveinstance;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);if(savedInstanceState != null)System.out.println("onCreate() : " + savedInstanceState.getString("octopus"));}@Overrideprotected void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);System.out.println("onRestoreInstanceState() : " + savedInstanceState.getString("octopus"));}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);outState.putString("octopus", "www.octopus.org.cn");System.out.println("onSaveInstanceState() : save date www.octopus.org.cn");}}

運行結果 : 在啟動並執行過程中 旋轉螢幕;

I/System.out( 8167): onSaveInstanceState() : save date www.octopus.org.cnI/System.out( 8167): onCreate() : www.octopus.org.cnI/System.out( 8167): onRestoreInstanceState() : www.octopus.org.cn


作者 : 韓曙亮

轉載請著名出處 : http://blog.csdn.net/shulianghan/article/details/38297083

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.