EP 21 Activityの非正常な動作でのデータ保存と復元

4813 ワード

Activityの非正常な動作でのデータ保存とリカバリ


onSaveInstanceState


今日、同じくCPActivityをインドネシアの財布に移植したときにデータ保存の問題に遭遇しましたが、ここで簡単に理解しました.
たとえば、Activityが現在停止されているか、長期にわたって使用されていない(ユーザーが離れているなど)場合や、ゲームがバックグラウンドに押されている場合、フロントActivityはバックグラウンドプロセスのリカバリメモリをオフにする必要があるため、システムがバックグラウンドプロセスのリカバリメモリをオフにする必要があるため、Activityが破棄される可能性があります.このような「非正常なアプリケーション動作」が終了した場合、破棄されたActivityインスタンスは、ユーザーがActivityを再開したときに復元されます.onSaveInstanceState()というコールバックメソッドがあり、Activityが停止し始めるとシステムが呼び出されます.このコールバックメソッドを使用して何もしないと、BundleにActivityレイアウトが保存されます.たとえば、EditTextに文字を入力した場合、Activityが復元されるとこれらの文字も復元されます.他のものを保存したい場合は、Bundleに追加することもできます.
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
//...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

リカバリ時には、次の2つの方法を選択できます.
  • onCreate()
  • onRestoreInstanceState()

  • onCreate()を使用する場合は、savedInstanceStateが空であるかどうかを判断する必要があります.たとえば、上記のゲームの例では、ユーザーの得点と等級を回復します.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); // Always call the superclass first
    
        // Check whether we're recreating a previously destroyed instance
        if (savedInstanceState != null) {
            // Restore value of members from saved state
            mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
            mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
        } else {
            // Probably initialize members with default values for a new instance
        }
        //...
    }
    

    より具体的には、JDRactivityでは、送信されたbundleが空であればuidataを初期化し、そうでなければbundleに保存されているuidataを取得します.
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (savedInstanceState == null) {
                mUIData = initUIData();
            } else {
                savedInstanceState.setClassLoader(getClass().getClassLoader());
                mUIData = (UIData) savedInstanceState.getSerializable(UIDATA);
                postRestoreUIData(savedInstanceState);
            }
    
    // ...
    //...
        }
    
    
    onRestoreInstanceState()というコールバック方法も使用できます.この方法はonStartの後、onCreateの前にあります.この場合savedInstanceStateが空であるか否かを判断する必要はありません.空でない場合にのみシステムがこれを呼び出すからです.
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        // Always call the superclass so it can restore the view hierarchy
        super.onRestoreInstanceState(savedInstanceState);
    
        // Restore state members from saved instance
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    }
    

    persistAcrossReboots


    シャットダウン後のデータ保存を実現する興味深い新しい特性があります.API 21の後、Manifestに参加する場合:
    android:persistableMode="persistAcrossReboots"
    

    次に、次の3つの方法に、このような新しいBundleが追加されました.
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
    
    public void onRestoreInstanceState(Bundle savedInstanceState, PersistableBundle persistentState)
    
    public void onCreate(Bundle savedInstanceState, PersistableBundle persistentState)
    

    このBundleはシャットダウン後のデータを保存するために使用されます(私は推測しましたが、検証したことがありません).
    Reference: [1]https://developer.android.com/training/basics/activity-lifecycle/recreating.html [2]https://developer.android.com/guide/components/activities.html [3]http://blog.csdn.net/lincyang/article/details/45287599
    転載先:https://juejin.im/post/5a3131596fb9a044fa19dcca