这个Fragment没有任何界面,在onCreate生命周期中使用setRetainInstance(true)确保不会随载体销毁,从而确保数据的安全性。
创建完成后,实践一下使用过程,假设其使用者是Activity:
@Override
protected void onSaveInstanceState(Bundle outState) {
if (mBitmap != null) {
getSupportFragmentManager().beginTransaction()
.add(BitmapDataFragment.newInstance(mBitmap), BitmapDataFragment.TAG)
.commit();
outState.putBoolean(SENSE_IMAGE_KEY, true);
} else {
outState.putBoolean(SENSE_IMAGE_KEY, false);
}
super.onSaveInstanceState(outState);
}
在设备发生旋转时,检测当前界面中显示的某个Bitmap,如果确实有数据,则new出一个我们刚刚创建的Fragment,将Bitmap数据放置进去,然后将这个Fragment添加到FragmentManager中并指定tag,这样我们在恢复状态后就可以方便的找到它。
在恢复时候,Activity的生命周期走到了onCreate()中,在这里我们可以通过检测Bundle参数来确定是否有Bitmap数据待取:
if (savedInstanceState.getBoolean(SENSE_IMAGE_KEY)) {
BitmapDataFragment fragment = (BitmapDataFragment) getSupportFragmentManager()
.findFragmentByTag(BitmapDataFragment.TAG);
bitmap = fragment.getData();
getSupportFragmentManager().beginTransaction().remove(fragment).commit();
}
PS:在取出我们所需的Bitmap数据后不要忘记把作为数据容器的这个Fragment从FragmentManager中移除掉,释放其占用的系统内存。
四、Fragment的非中断保存
1.setRetaineInstance
首先,要明确什么叫“非中断保存”。熟悉Fragment的开发人员都知道,Fragment是依附于Activity的。当Activity销毁时,Fragment会随之销毁。而当Activity配置发生改变(如屏幕旋转)时候,旧的Activity会被销毁,然后重新生成一个新屏幕旋转状态下的Activity,自然而然的Fragment也会随之销毁后重新生成,而新生成的Fragment中的各个对象也与之前的那个Fragment不一样,伴随着他们的动作、事件也都不一样。所以,这时候如果想保持原来的Fragment中的一些对象,或者想保持他们的动作不被中断的话,就迫切的需要将原来的Fragment进行非中断式的保存。










