由于Activity可能会被回收,通常来说有效的监听目标Activity返回的结果是通过onActivityResult或者Activity主动发送广播,这种系统提供的rpc方式,如果通过给Activity设置回调,Activity的业务逻辑完成之后调用回调的这种方式去解决的话,当Activity重建时,我们之前设置的回调是无法恢复的,这个时候看处理逻辑,没判空就会发生空指针异常,要么回调就没法调用了,功能也不正确。
同样的道理,Activity和Fragment之间交互,也不应该通过传递回调的方式进行,除非Activity本身就是那个回调实现。
理论是美好的,现实中可能已经有大量的代码不符合这个规范,从而导致线上应用崩溃或者逻辑不符合预期,这个时候,短期的解决办法是我们在onCreate方法中如下复写
override fun onCreate(savedInstanceState: Bundle?) {
/** 本Activity不支持销毁重建 */
super.onCreate(null)
}
禁止Activity和Fragment重建,因为重建问题而导致的线上崩溃就此被暂时解决,后续正确的处理则是更改代码逻辑,Fragment需要依赖Activity的逻辑,可以使用Activity去实现该接口,或者Activity的ViewModel实现该接口,避免之间传递回调,若项目中有较多直接传递回调的场合,改动起来比较困难,可以使用一个全局单例来管理这些回调,全局单例的回调在Activity销毁时仍然存在,只有当系统内存不足的时候才会回收(这种情况下全局单例就不生效了),不过现在安卓设备大多内存比较充足,这种情况对比Activity的回收的情况来说,相对来说比较少,所以这种方法也可以在实际中使用