ReactContextBaseJavaModule getCurrentActivity 返回空问题

原创
2017/03/01 14:19
阅读数 3K

    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是完全不一样的,很容易就被回收掉。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部