MvvmCross 8.0下Resolve<IMvxAndroidCurrentTopActivity>返回Activity为空,与7.0有何改动?
问题原因
- MvvmCross 8.0重构了Android端Activity生命周期跟踪逻辑,默认不再自动注册
MvxAndroidActivityLifecycleCallbacks回调,如果未在自定义MvxAndroidSetup或Application类中手动完成回调注册,框架就无法跟踪当前顶层Activity,最终导致IMvxAndroidCurrentTopActivity解析结果为null。 - 若在Application
OnCreate等应用启动早期阶段调用该解析方法,此时还没有任何Activity完成初始化并挂载到框架的生命周期跟踪栈,也会返回null。7.0版本中框架会提前持有一个临时Activity引用避免该问题,但8.0为了规避内存泄漏风险移除了该逻辑。 - 如果DialogService是在后台线程、Activity正在执行
OnDestroy生命周期的场景下触发解析,8.0会立即清除已销毁Activity的引用,不会像7.0一样保留短时间缓存,也会返回null。
MvvmCross 8.0 相对7.0的相关改动
- 重构了Android平台Activity跟踪实现,
IMvxAndroidCurrentTopActivity不再依赖全局静态缓存,改为完全基于生命周期回调的实时跟踪,彻底解决了旧版该服务持有Activity实例引发的内存泄漏问题。 - 默认取消了Activity生命周期回调的自动注册逻辑,需要开发者手动完成注册,可在
MvxAndroidSetup的InitializePlatformServices方法中执行注册,也可以在Application的OnCreate方法中添加如下代码:
RegisterActivityLifecycleCallbacks(new MvxAndroidActivityLifecycleCallbacks());
- 调整了
IMvxAndroidCurrentTopActivity的IoC注册时机,从框架启动阶段延后到首个Activity初始化完成之后,启动阶段解析会直接返回null。 - 移除了
IMvxAndroidCurrentTopActivity的降级回退逻辑,无活跃顶层Activity时直接返回null,不再返回栈中最近的已销毁Activity实例。
内容的提问来源于stack exchange,提问作者Stefano Paparesta
相关产品推荐
相关产品推荐

