如何在MainActivity中使用ReactApplicationContext,让android 可以在原生任何一处向RN上层发送通知
例如我们app启动的Activity为MainActivity,而MainActivity这里需要继承ReactActivity,然后我们来点进去看下ReactActivity具有的方法,除了通用的activity的生命周期方法,
这里有一个方法:
protected final ReactNativeHost getReactNativeHost() {
return mDelegate.getReactNativeHost();
}
1.什么是ReactNativeHost呢?
它是RN项目在初始化Application的时候被用到,像是一个容器,用来管理ReactInstanceManager等,举例几个ReactNativeHost中常用到的方法:
getReactInstanceManager、getJSBundleFile、getPackages(后续有时间可单独介绍这些方法的作用)。
2.ReactInstanceManager是做什么的?
个人的理解是用来维系react native js上层与原生之间的一个桥梁,RN上层view的生命周期依赖于ReactInstanceManager(如有理解错误,欢迎指正)。
话不多说,我们可以在MainActivity的onCreate方法中直接上代码:
ReactInstanceManager mReactInstanceManager = getReactNativeHost().getReactInstanceManager();
if (null == mReactInstanceManager.getCurrentReactContext()) { // APP启动过程中,初始化ReactInstanceManager等需要时间,先获取一次上下文,如未获取到
mReactInstanceManager.addReactInstanceEventListener(new ReactInstanceManager.ReactInstanceEventListener() { //监听初始化是否完成
public void onReactContextInitialized(ReactContext validContext) {
ReactApplicationContext context = (ReactApplicationContext) validContext;
// do something
}
});
}else{
ReactApplicationContext context = mReactInstanceManager.getCurrentReactContext();
// do something
}
注意在Activity销毁时,记得调用removeReactInstanceEventListener方法remove监听,防止内存泄露。(这里只是提供方法,如实际项目中使用,仍有优化之处)
在ReactInstanceManager中,我们需要用到这个方法,可以看到在获取上下文时,
@VisibleForTesting
public @Nullable ReactContext getCurrentReactContext() {
synchronized (mReactContextLock) {
return mCurrentReactContext;
}
}
以上即为在MainActivity中使用ReactApplicationContext的方法,如有不足之处,欢迎指正和探讨,谢谢~~