Androidノート:onSaveInstanceStateとonRestoreInstanceStateまとめ

3402 ワード

一、メソッド呼び出し時間
  • onSaveInstancesStateはUI状態を保存するために使用され、Activityが殺す前に、onStopまたはonPauseの前にトリガーされるのが一般的である.
  • onRestoreInstanceStateは、onResumeの前にトリガされて状態を回復する.
  • Activityが殺され、onCreateが呼び出され、onRestoreInstancesStateはonResumeの前に前回保存した情報を復元します.
  • Activityは殺されず、onCreateは呼び出されませんが、onRestoreInstanceStateは呼び出され、onResumeの前に前回保存した情報を復元します.

  • 二、方法シーンの使用
  • onSaveInstanceState()は、Activityがシステムkillによって削除された場合にのみ呼び出されます.したがって、通常、onSaveInstanceState()は一時的な状態を保存するのに適しており、onPause()はデータの永続化保存に適しています.
  • onSaveInstanceState()メソッドは、UIコントロールの状態、メンバー変数の値などの過渡データを保存するのに適しており、永続化データを保存するのではなく、ユーザーが現在のactivityを離れたときにonPause()に保存する(データベースやファイルに保存するなど)必要があります.ここまで言うと、onPause()では比較的時間のかかるデータを保存するのに適していないので、この点は理解しておきたい.
  • onSaveInstanceState()メソッドが呼び出されるとは限らないため、データベースへのレコードの挿入など、永続化データの保存には不向きである.永続化データを保存する操作はonPause()に置くべきです.永続値の場合はonPause()に保存されます.大量であれば、UIスレッドをブロックしないで別のスレッドを開きましょう. 

  • 三、使用方法
    1.onSaveInstanceStateメソッドにbundleを保存するには:
        @Override
        protected void onSaveInstanceState(Bundle outState)
        {
            super.onSaveInstanceState(outState);
            mMapView.onSaveInstanceState(outState);
            
            saveState(outState);
        }
        
        @Override
        protected void onRestoreInstanceState(Bundle InState)
        {
            super.onRestoreInstanceState(InState);
            mMapView.onSaveInstanceState(InState);
            
            restoreState(InState);
        }
        /**
         *        , activity  kill ,               
         * 
         * @param outState
         */
        private void saveState(Bundle outState)
        {
            outState.putParcelable(HBContant.KEY_STATE_ESTATEINFO_JSON, mJson);
            outState.putParcelable(HBContant.KEY_STATE_ESTATEINFO_GALLERY, mGalleryJson);
            outState.putParcelable(HBContant.KEY_STATE_ESTATEINFO_FLASH, mFlashJson);
            outState.putParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_VIDEO, mVideoList);
            outState.putParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_NEWS, mNewsList);
            outState.putParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_HOUSELIST, mEstateHouseList);
        }
        
        private void restoreState(Bundle inState)
        {
        }

    2.保存したbundleをoncreateまたはonRestoreInstanceStateメソッドで読み込みます.
            if (savedInstanceState == null)
            {
                //    
                loadTask();
            }
            else
            {
                //      kill   ,      
                mJson = savedInstanceState.getParcelable(HBContant.KEY_STATE_ESTATEINFO_JSON);
                mGalleryJson = savedInstanceState.getParcelable(HBContant.KEY_STATE_ESTATEINFO_GALLERY);
                mFlashJson = savedInstanceState.getParcelable(HBContant.KEY_STATE_ESTATEINFO_FLASH);
                mVideoList = savedInstanceState.getParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_VIDEO);
                mNewsList = savedInstanceState.getParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_NEWS);
                mEstateHouseList = savedInstanceState.getParcelableArrayList(HBContant.KEY_STATE_ESTATEINFO_HOUSELIST);
                
                
                if(mJson != null && mGalleryJson != null && mFlashJson != null && mVideoList != null && mEstateHouseList != null)
                {
                    loadComplete();
                }
                else
                {
                    loadTask();
                }
            }