Fragment状态保存(四)

Fragment中的状态保存和Activity中的状态保存一致。

Activity中非正常的窗口销毁,比如窗口到后台,由于内存不足,销毁,或者横竖屏切换,一般需要保存状态。当窗口发生配置变化时,会调以下两个方法。

@Override
protected void onSaveInstanceState(Bundle outState) {
   
    super.onSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
}

当配置发生变化时,onSavaInstanceState会被调用,我们可以用它的参数outState来保存数据和状态

当activity重建的时候,会调用onRestoreInstanceState,然后利用它的参数savedInstanceState将activity恢复到销毁前的状态。

onCreate中也可以用于数据恢复


Fragment中和Activity中类似,状态的保存和恢复分为view和成员变量


以下几种情况可能导致fragment被异常销毁;

  1. 按HOME键返回桌面时
  2. 按菜单键回到系统后台,并选择了其他应用时
  3. 按电源键时
  4. 屏幕方向切换时

view的保存和恢复,当窗口状态变化时,view会自动执行其内部的方法,进行自动保存状态,和恢复状态。前提是控件要有id,系统是根据id来保存恢复view状态的。

成员变量的保存和恢复,也是通过onSavaInstanceState来保存,但是Fragment中没有onRestoreInstanceState方法,一般在onActivityCreated方法中恢复。

@Override
public void onSaveInstanceState(Bundle outState) {

    outState.putString("name",texts);
    super.onSaveInstanceState(outState);
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    Log.d("first-fragment-------->","onActivityCreated()");
    if(savedInstanceState!=null)
    {
        String s=savedInstanceState.getString("name");
        texts=s;
    }
    textView.setText(texts);
    super.onActivityCreated(savedInstanceState);
}

Fragment状态保存还可以在Activity中通过FragmentManager.putFragment和Fragmentmanager.getFragment方法来实现

保存状态

@Override
protected void onSaveInstanceState(Bundle outState) {
    if(fragment!=null)
    {
        getFragmentManager().putFragment(outState,"fragment",fragment);
    }
    super.onSaveInstanceState(outState);
}
恢复状态

private FirstFragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(savedInstanceState!=null)
    {
        fragment=(FirstFragment)getFragmentManager().getFragment(savedInstanceState,"fragment");
        Log.d("-------------------->",fragment.texts);
    }

   
}

感觉关于对Fragment的状态保存和恢复理解还不是很深刻,有待继续学习。







你可能感兴趣的:(Android)