FragmentManager后台保存机制
众所周知Android系统会在内存吃紧的时候释放后台应用,但是这样的释放有别于主动退出,例如按下回退键或者调用finish。
这两者的一个很大的区别就是onSaveInstanceState
这个生命周期函数会不会被调用。
背景
讲到这个就不得不讲一下设计者的初衷。移动应用对内存的管理比桌面应用要严苛得多,因此设计者在应用程序的各个阶段都会加一些hook帮助开发者在管理好自己的App,使其不会占用过多资源,同时又能够让用户得到更好的体验。
onSaveInstanceState
在onPause
之后和onStop
之前调用,它的目的就是在内存吃紧的时候就算系统不得不销毁Activity,但是提供一个方法给开发者保存当前的数据,以便用户再次打开时可以将之前的内容重新呈现出来。
为什么不用onPause?
onPause确实也会在系统内存吃紧的时候调用,但是它也同时会在其他时候调用,例如App失去焦点或者App退入后台。通常在这个时候我们应当释放掉一些资源,但是不应当每次都去保存一下状态,因为这个生命周期发生得太频繁了。
应用
开发过的大部分App一般不会用到这个生命周期,直到有一天收到了大量的Fragment already added
异常。
我们使用的MainActivity
是继承于AppCompatActivity
,它加载了一个MainFragment
是程序的主导航界面。
onCreate Before
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, patient