ReactContextBaseJavaModule(原生模块)里 getCurrentActivity 偶尔会出现返回null的情况(react-natvie上也有几个issues)。导致js调用原生的功能失效,rn里的一些模块没法工作。翻阅rn的源码,原来currentActivity是通过ReactContext传递的。
public void onHostResume(@Nullable Activity activity) {
UiThreadUtil.assertOnUiThread();
mCurrentActivity = new WeakReference(activity);
for (LifecycleEventListener listener : mLifecycleEventListeners) {
listener.onHostResume();
}
}
public void onNewIntent(@Nullable Activity activity, Intent intent) {
UiThreadUtil.assertOnUiThread();
mCurrentActivity = new WeakReference(activity);
for (ActivityEventListener listener : mActivityEventListeners) {
listener.onNewIntent(intent);
}
}
而ReactContext又是通过ReactInstanceManager的onHostResume、onNewIntent等传递,这两个方法对应到Activity的生命周期onResume、onNewIntent。为什么会出现getCurrentActivity返回null,因为ReactInstanceManager的创建时机如果不是在activity onCreate方法里,它在activity 的onResume时可能忽略掉onHostResume调用。
protected void onResume() {
super.onResume();
if(mReactInstanceManager!=null) {
mReactInstanceManager.onHostResume(VipReactActivity.this, VipReactActivity.this);
}
}
解决办法是:在遇到ReactInstanceManager不是在activity onCreate里创建的,在ReactInstanceManager创建后手动调一下ReactInstanceManager.onHostResume.
BTW: rn这里用WeakReference来hold住当前activity值得商讨,WeakReference在android ART的回收策略和dalvik是完全不一样的,很容易就被回收掉。