Android-Activity臨時數據的保存


Activity臨時數據的保存是非常重要的,例如:一款小說APP應用,讀者使用這款APP看到了223頁,用戶也沒有去記看了多少頁;

突然去接了個電話,或者開啟的應用程序太多了,可能會導致這款APP應用程序的Activity被系統殺死回收了,當用戶打完電話 再次打開這款APP的時候,又從第一頁開始了,這樣體驗非常不好,所以需要去保存Activity的臨時數據

 


 

在Activity中 onSaveInstanceState(Bundle outState)方法用Bundle保存數據,可以在onCreate(Bundle savedInstanceState)方法用Bundle恢復數據,注意要判斷Bundle是否為空

package liudeli.activity.temp_data;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import liudeli.activity.R;

public class TempDataActivity extends Activity {

    private final String TAG = TempDataActivity.class.getSimpleName();

    /**
     * 定義頁數變量
     */
    private int page;

    /**
     * 此方法不僅僅可以初始化數據
     * 還可以恢復保存的臨時數據
     * @param savedInstanceState onSaveInstanceState方法 保存的臨時數據就存放在Bundle里面
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_temp_data);

        // 為什么要null判斷,因為沒有保存臨時數據的時候,Bundle是null
        // 所以第一次初始化一定是null
        if (null != savedInstanceState) {
            page = savedInstanceState.getInt("page");
            Log.d(TAG, "onCreate 上次看到了" + page + "頁");
        }

        Log.d(TAG, "onCreate");
    }

    /**
     * 例如:當系統內存不足的時候,切換其他游戲應用程序 在玩游戲,有可能當前的Activity會被回收殺死
     *      一旦出現回收殺死Activity就會調用此方法,然后在此方法保存臨時數據
     * @param outState
     */
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        // 用戶看到223頁
        page = 223;
        outState.putInt("page", page);
    }

    /**
     * 恢復保存的臨時數據
     * @param savedInstanceState onSaveInstanceState方法 保存的臨時數據就存放在Bundle里面
     */
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        // 這個方法不需要判斷savedInstanceState null,因為不可能為null,只有保存過數據,再次打開Activity才會調用此方法
        page = savedInstanceState.getInt("page");
        Log.d(TAG, "onRestoreInstanceState 上次看到了" + page + "頁");
    }



    /******* 下面是一系列生命周期方法,用來觀察,Activity被系統殺死,又重寫啟動的Log打印 ******/

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy");
    }
}

 

 

如何才能讓這個Activity被系統殺死回收呢?

答:如果要測試的話,可以用模擬器 橫豎屏切換一下,Activity就被殺死,然后自動重新啟動Activity

 

以上圖 橫豎屏切換后,系統會默認會把Activity殺死回收,所以執行以下方法:

  12-12 08:11:50.441 3347-3347/liudeli.activity D/TempDataActivity: onPause
  12-12 08:11:50.441 3347-3347/liudeli.activity D/TempDataActivity: onStop
  12-12 08:11:50.441 3347-3347/liudeli.activity D/TempDataActivity: onDestroy

  系統會自動啟動這個Activity,請看下面的Log
  12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onCreate 上次看到了223頁
  12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onCreate
  12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onStart
  12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onRestoreInstanceState 上次看到了223頁
  12-12 08:11:50.460 3347-3347/liudeli.activity D/TempDataActivity: onResume


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM