NativeScript 3.4应用启动时访问Android Activity对象问题
哥们,我太懂你升级到NS 3.4后踩的这个坑了——之前在启动页的navigatingTo方法里调用application.android.foregroundActivity.getResources()好好的,结果升级后启动阶段直接拿不到foregroundActivity,全是undefined对吧?别慌,给你几个靠谱的替代方案:
优先用全局 Context 获取 Resources
其实在 NativeScript 里,application.android.context是全局可用的,而且在应用启动阶段就已经初始化完成了,完全可以替代foregroundActivity来获取资源。代码示例:const resources = application.android.context.getResources(); // 接下来就可以用 resources 做你需要的操作,比如获取字符串、尺寸等这个方法最稳定,不需要依赖Activity的初始化状态,是启动阶段获取资源的首选。
监听应用的 launch 事件
如果你的资源操作不需要在navigatingTo里立刻执行,可以把逻辑放到应用的launchEvent回调里。这个事件会在应用完全启动、foregroundActivity已经就绪后触发,代码示例:application.on(application.launchEvent, () => { const resources = application.android.foregroundActivity.getResources(); // 在这里处理资源相关逻辑 });这种方式能保证你拿到的
foregroundActivity一定是有效的,适合那些不需要在页面跳转瞬间执行的操作。延迟执行(兜底方案)
如果必须要在navigatingTo里处理,可以尝试延迟一小段时间,等Activity初始化完成后再调用。比如用setTimeout:navigatingTo() { setTimeout(() => { if (application.android.foregroundActivity) { const resources = application.android.foregroundActivity.getResources(); // 执行你的资源操作 } }, 100); // 时间可以根据实际情况调整,一般100ms足够覆盖启动初始化 }不过这个是兜底方案,尽量优先用前两种,毕竟延迟执行可能会带来微小的体验延迟。
补充一句:NS 3.4之后调整了应用启动的流程,foregroundActivity需要等应用启动到特定阶段才会被赋值,所以启动阶段直接拿自然会是undefined,用全局Context是最稳妥的解决方式。
内容的提问来源于stack exchange,提问作者dashman

