天天看點

儲存資料傳回後可以繼續編輯

一般來說, 調用onpause()和onstop()方法後的activity執行個體仍然存在于記憶體中, activity的所有資訊和狀态資料不會消失, 當activity重新回到前台之後, 所有的改變都會得到保留. 

但是當系統記憶體不足時, 調用onpause()和onstop()方法後的activity可能會被系統摧毀, 此時記憶體中就不會存有該activity的執行個體對象了. 如果之後這個activity重新回到前台, 之前所作的改變就會消失. 為了避免此種情況的發生, 開發者可以覆寫onsaveinstancestate()方法. onsaveinstancestate()方法接受一個bundle類型的參數, 開發者可以将狀态資料存儲到這個bundle對象中,

這樣即使activity被系統摧毀, 當使用者重新啟動這個activity而調用它的oncreate()方法時, 上述的bundle對象會作為實參傳遞給oncreate()方法, 開發者可以從bundle對象中取出儲存的資料, 然後利用這些資料将activity恢複到被摧毀之前的狀态.

儲存資料傳回後可以繼續編輯

<span style="font-size: small;">public class mainactivity extends activity {  

    public static final int second_activity = 0;  

    private string temp;  

    @override  

    public void oncreate(bundle savedinstancestate) {  

        super.oncreate(savedinstancestate);  

        // 從savedinstancestate中恢複資料, 如果沒有資料需要恢複savedinstancestate為null  

        if (savedinstancestate != null) {  

            temp = savedinstancestate.getstring("temp");  

            system.out.println("oncreate: temp = " + temp);  

        }  

    }  

    public void onresume() {  

        super.onresume();  

        temp = "xing";  

        system.out.println("onresume: temp = " + temp);  

        // 切換螢幕方向會導緻activity的摧毀和重建  

        if (getrequestedorientation() == activityinfo.screen_orientation_unspecified) {  

            setrequestedorientation(activityinfo.screen_orientation_landscape);  

            system.out.println("螢幕切換");  

    // 将資料儲存到outstate對象中, 該對象會在重建activity時傳遞給oncreate方法  

    protected void onsaveinstancestate(bundle outstate) {  

        super.onsaveinstancestate(outstate);  

        outstate.putstring("temp", temp);  

}</span>  

需要注意的是, onsaveinstancestate()方法并不是一定會被調用的, 因為有些場景是不需要儲存狀态資料的. 比如使用者按下back鍵退出activity時, 使用者顯然想要關閉這個activity, 此時是沒有必要儲存資料以供下次恢複的, 也就是onsaveinstancestate()方法不會被調用. 如果調用onsaveinstancestate()方法, 調用将發生在onpause()或onstop()方法之前. 

onsaveinstancestate()方法的預設實作

如果開發者沒有覆寫onsaveinstancestate()方法, 此方法的預設實作會自動儲存activity中的某些狀态資料, 比如activity中各種ui控件的狀态. android應用架構中定義的幾乎所有ui控件都恰當的實作了onsaveinstancestate()方法, 是以當activity被摧毀和重建時, 這些ui控件會自動儲存和恢複狀态資料. 比如edittext控件會自動儲存和恢複輸入的資料, 而checkbox控件會自動儲存和恢複選中狀态.

開發者隻需要為這些控件指定一個唯一的id(通過設定android:id屬性即可), 剩餘的事情就可以自動完成了. 如果沒有為控件指定id, 則這個控件就不會進行自動的資料儲存和恢複操作.

由上所述, 如果開發者需要覆寫onsaveinstancestate()方法, 一般會在第一行代碼中調用該方法的預設實作: super.onsaveinstancestate(outstate).

是否需要覆寫onsaveinstancestate()方法

既然該方法的預設實作可以自動的儲存ui控件的狀态資料, 那什麼時候需要覆寫該方法呢?

如果需要儲存額外的資料時, 就需要覆寫onsaveinstancestate()方法. 如需要儲存類中成員變量的值(見上例).

onsaveinstancestate()方法适合儲存什麼資料

由于onsaveinstancestate()方法方法不一定會被調用, 是以不适合在該方法中儲存持久化資料, 例如向資料庫中插入記錄等. 儲存持久化資料的操作應該放在onpause()中. onsaveinstancestate()方法隻适合儲存瞬态資料, 比如ui控件的狀态, 成員變量的值等.

上一篇: aFinal架構

繼續閱讀