优点:
1. Android开发常用到单例的一大原因是,它们比fragment或activity活得更久,如在设备旋转或者fragment和activity间跳转的场景下,单例不会受到影响,而旧的fragment或activity已经不存在了.
2. 单例能方便的存储控制模型层对象.
缺点:
1. 虽然活的更久,但是并不代表可以永存,我们切换至其他应用,又逢android回收内存,单例连同那些实例变量就不复存在了
2. 单例还不利于单元测试.
1. CrimeActivity中封装了一个newInstanceIntent(context, UUID)方法,CrimeListFragment中调用
2. 可以直接在CremeFragment中,用getIntent得到里面的UUID数据,但是这样破坏了Fragment的封装性,CrimeFragment不再是可复用的构建单元,因为它现在由某个特定的activity托管
3. 较好的写法应是在crime ID存储在属于CrimeFragment的某个地方,而不是保存在CrimeActivity的私有空间里.这样,无需依赖于CrimeActivity的intent内指定的extra的存在,CrimeFragment就能获取自己所需的extra数据.属于fragment的”某个地方实际就是它的argument bundle”
4. Activity和fragment不需要也无法同时相互保持独立性,activity必须了解fragment的内部结构,比如知道它内部有个newInstance(UUID)方法,这很正常,托管activity应该知道这些细节,以便托管fragment,但fragment不一定要知道其托管activity的细节问题
为什么选择覆盖onResume()方法来刷新列表项显示,而不用onStart()方法?
1. 如果前面的activity是透明的,或者对话框
Fragment argument的使用还有有点复杂,为什么不直接在CrimeFragment,里创建一个实例变量呢?
创建实例变量的方式并不可靠,因为,操作系统重建fragment时,设备配置发生改变时,用户暂时离开当前应用时,甚至操作系统按需回收内存时,任何实例变量不复存在了,尤其是内存不够,杀掉应用的情况,可以说你无人能挡.
因此,可以说,fragment argument就是为应对上述场景而生
还有另一个应对上述场景,就是实例状态保存机制,onsaveInstanceState(Bundle)方法,
然而,这种解决方案维护成本高,若干年后,再回头修改老代码,只需一眼就知道,crime id是以argument保存和传递使用,而很可能忘记在onSaveInstanceState(Bundle)方法里保存下来