Skip to content

ReactContext

罗坤 edited this page Mar 9, 2020 · 3 revisions

声明上下文:

  • ReactContextBaseJavaModule
  import com.facebook.react.bridge.ReactApplicationContext;

  ReactApplicationContext context = getReactApplicationContext()
  • SimpleViewManager/ViewGroupManager
  import com.facebook.react.uimanager.ThemedReactContext;

  @Override
  public CustomView createViewInstance(ThemedReactContext context) {}

ThemedReactContext主要负责监听/取消监听生命周期事件,同时覆盖ReactContext中的监听事件。

  • View/GroupView
import com.facebook.react.bridge.ReactContext;

ReactContext reactContext = (ReactContext)getContext();

void initializeWithInstance

为此上下文设置并初始化CatalystInstance,且只会初始化一次。

getJSModule

return <T extends JavaScriptModule> 返回与此上下文关联的CatalystInstance的指定JavaScriptModule的句柄.

案例:通过getJSModule借用RCTDeviceEventEmitteremit方法将原生事件消息发送给JS端

  • java
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.modules.core.DeviceEventManagerModule;

mReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
              .emit("YOUR_EVENTNAME",msg)
  • JavaScript DeviceEventEmitter用法
import { DeviceEventEmitter } from 'react-native';

DeviceEventEmitter.addListener('YOUR_EVENTNAME', (msg) => {
   console.log(msg)
 });
  • JavaScript NativeEventEmitter用法
    建议使用NativeEventEmitter而非DeviceEventEmitter, 因为后者无法避免不同NativeModuleseventName时的状况(only ios)
import { NativeModules } from 'react-native';
const NativeEventEmitter = require('NativeEventEmitter');
const { YourNativeModule } = NativeModules;

this._eventEmitter = new NativeEventEmitter(YourNativeModule);
this._eventEmitter.addListener("YOUR_EVENTNAME",(msg) => {
   console.log(msg)
})

boolean hasNativeModule

判断是否存在与此ReactContext关联的指定模块接口的实例。

getNativeModule

return <T extends NativeModule> 返回与此ReactContext关联的指定模块接口的实例。

  • 例如: 在module中为viewmanager添加指定tag事件
@ReactMethod
    public void getSignatureBitmap(final int viewTag, final Promise promise){

        final ReactApplicationContext context = getReactApplicationContext();
        UIManagerModule uiManager = context.getNativeModule(UIManagerModule.class);
        uiManager.addUIBlock(new UIBlock() {
            @Override
            public void execute(NativeViewHierarchyManager nativeViewHierarchyManager) {
                final SignaturePadView signaturePad;

                try {
                    signaturePad = (SignaturePadView) nativeViewHierarchyManager.resolveView(viewTag);
                    promise.resolve(bitmapToString(signaturePad.getSignatureBitmap()));
                } catch (Exception e) {
                    e.printStackTrace();
                    promise.reject(e.getMessage());
                }
            }
        });
    }

void addLifecycleEventListener

LifecycleEventListener用于接收Activity生命活动的监听器。 当多个活动(YourActivity extends ReactActivity)共享一个React实例时,只有最新的生命周期才会转发给监听器,请考虑以下情形:

  • 从ReactActivity A导航到ReactActivity B时将触发两个事件: A#onHostPauseB#onHostResume。 来自ReactActivity A的所有后续生命周期事件(例如onHostDestroy)都将被忽略
  • 从ReactActivity B导航回ReactActivity A时将触发相同的事件:B#onHostPauseA#onHostResume。 来自ReactActivity B的所有后续事件(例如onHostDestroy)都将被忽略。
  • 从ReactActivity A导航到<T extends ReactActivity> 主屏幕时将触发两个事件:onHostPauseonHostDestroy
  • 从ReactActivity A导航到<T extends ReactActivity> B将触发一个事件:onHostPause。 稍后,如果ReactActivity A被销毁(例如由于资源争用(resource contention)),则会触发onHostDestroy

onHostResume

当主活动(host Activity)收到resume event时(例如Activity#onResume)或者主活动已经resumed并调用初始化(ReactContextBaseJavaModule#initialize)好的native module时触发。 始终针对最新活动进行调用。

onHostPause

当主活动收到pause event时调用。 始终针对最新活动进行调用。

onHostDestroy

当主活动收到destroy event时调用(例如Activity#onDestory)时调用。 仅在销毁最后一个ReactActivity时调用。

final LifecycleEventListener listener = new LifecycleEventListener() {
  @Override
  public void onHostResume() {

  }

  @Override
  public void onHostPause() {

  }

  @Override
  public void onHostDestroy() {

  }
};
RCTContext.addLifecycleEventListener(listener);

void removeLifecycleEventListener

取消LifecycleEventListener监听事件

void addActivityEventListener

ActivityEventListener用于接收Activity Event的监听器接口(interface)。如果您对此接口都不感兴趣的话可以考虑使用BaseActivityEventListener类。

onActivityResult

当主(活动/服务)收到Activity#onActivityResult调用时调用。

onNewIntent

当新的意图(new Intent())传递给活动时调用。

final ActivityEventListener listener = new ActivityEventListener() {
  @Override
  public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {

  }

  @Override
  public void onNewIntent(Intent intent) {

  }
};

RCTContext.addActivityEventListener(listener)

void removeActivityEventListener

取消ActivityEventListener监听事件

boolean startActivityForResult

Activity#startActivityForResult(Intent,int)相同,只是将调用重定向到当前活动。返回活动是否已开始,因为如果在上下文处于正确状态之前调用了活动,则活动可能会失败。

Activity getCurrentActivity

获取此上下文当前附加到的活动,如果未附加,则获取{@code null}。 请勿长期使用此方法返回的对象,因为这将导致内存泄漏。

getJavaScriptContextHolder

return JavaScriptContextHolder 获取指向与此实例关联的JavaScriptCore上下文的C指针(很长)。 采用以下模式可确保在使用JS上下文时不会将其清除:

JavaScriptContextHolder jsContext = reactContext.getJavaScriptContextHolder()
synchronized(jsContext) { nativeThingNeedingJsContext(jsContext.get()); }
Clone this wiki locally