如果你的项目使用的是react native,比如APP MainActivity运行在后台或者手动kill进程之后,
这里需要注意的是AndroidManifest.xml文件中当前activity的启动模式就很重要了,不同的启动模式就会让上层RN出现不同的问题:
1.如果启动模式是 android:launchMode="standard" 标准启动模式,当应用重启时,那么会重新生成新的MainActivity,同时由于项目中react native 的入口是由MainActivity进入的,所以也会导致
react native的路由栈重新生成,之前页面仍可能存在,而且不会走生命周期中的销毁事件componentWillUnmount。假设此时当前页面PageB持有原生的一个异步Promise回调,而这个方法又是使用一个service,是不是就会出现意想不到的情况;
这时你可能会想,我用this.props.navigation.isFocused()方法来判断当前页面是否处于聚焦状态不就可以解决了?
不好意思,你可以去尝试,如果已经重新生成了新的路由栈, 而且当前我们在PageA,不在那个PageB,但是PageB的异步Then方法中用this.props.navigation.isFocused()来拦截,可以打印一下,你会发现返回的是true。。。拦不住。。
2.如果启动模式是 android:launchMode="singleTask"栈内复用模式,当应用重启时,如果当前Activity存在于栈中,则直接复用,它上面的Activity会销毁。Activity的onSaveInstanceState
去保存一些必要的值这个就不多说了。这种模式下,react native的页面就不会销毁,也不会重置路由,自然也不会出现一些上述可能出现的情况(之前项目一直都是singleTask模式,某一天被同事修改成了标准模式,我...)。
已启动的app,运行 如下代码:
adb shell am start -n 包(package)名/包名.活动(activity)名称 例如:
adb shell am start -n com.xxx.music/com.xxx.music.MainActivity
即可验证一下你的项目中,MainActivity不同启动模式导致的react native页面出现的一些问题。
个人遇到的一个问题,仅此记录一下。