fragment的retainInstance属性值默认为false,这表明其不会被保留。因此设备旋转时fragment会随托管activity一起被销毁并重建。
调用setRetainInstance(true)方法可保留fragment。已保留的fragment不会随activity一起被销毁,它会一直保留,并在需要时原封不动地转给新的activity。
对于已保留的fragment实例,其全部实例变量的值也会保持不变,因此可以继续放心使用。
1.工作原理
设备配置发生改变时,FragmentManager首先销毁队列中fragment的视图。紧接着,FragmentManager检查每个fragment的retainInstance属性值。如果属性值为false,FragmentManager会立即销毁该fragment实例。随后为了适应新的设备配置,新activity的新FragmentManager会创建一个新的fragment及其视图。
如果属性值为true。则该fragment的视图立即被销毁,但fragment本身不会被销毁。为了适应新的设备配置,新activity创建后,新FragmentManager会找到已保留的fragmen,并重新创建它的视图。
虽然已保留的fragment没有被销毁,但它已脱离消亡中的activity并处于保留状态。尽管此时的fragment还在,但已没有任何activity托管它。
必须同时满足以下两个条件,fragment才能进入保留状态:
- 已调用了fragment的setRetainInstance(true)方法;
- 因设备配置改变(通常为设备旋转),托管activity正在被销毁。
fragment只能保留非常短的时间,即从fragment脱离旧activity到重新附加给快速新建的activity之间的一段时间。