Skip to content

ReactContextBaseJavaModule

罗坤 edited this page Apr 7, 2020 · 2 revisions

import com.facebook.react.bridge.ReactContextBaseJavaModule

getName

string 返回此视图管理类的名称。这将在JavaScript端NativeModules中引用。

  • ⚠️DO NOT USE "RCT"
    • 若名称前缀为"RCT",在JS端引用时请忽略,如 "RCTCameraModule"的引用方式为NativeModules.CameraModule
    • 因为React Native Android内部包使用RCT作为前缀。为了避免名称冲突,建议您在自己的类中使用RCT以外的三个字母的前缀。
    • 同理,IOS内部包则以"RK"为前缀。
    • 详见https://github.com/facebook/react-native/search?l=C%2B%2B&q=RCT
  @Override
  public String getName(){
    return "CustomModule";
  }

getConstants

Map<String, Object> 返回JavaScript可访问的特定常量的映射对象。支持JSON类型。 这些常量是可通过CustomModule.Your_Constant直接访问。

  @Override
  public Map<String, Object> getConstants() {
    final Map<String, Object> constants = new HashMap<>();
    constants.put("APPID", APPID);
    constants.put("Your_Constant", CONSTANT);

    return constants;
  }

getCurrentActivity

获取此上下文当前附加的Activity,如果未附加则返回null请勿长期保存通过此方法返回的对象,这将导致内存泄漏。

  • 例如: 永远不要将此方法返回的值存储在成员变量中。相反,在您实际需要currentActivity时再调用此方法,并确保检查null
if(getCurrentActivity() != null){
  getCurrentActivity().startActivity(intent)
}

//Context mContext = getCurrentActivity() //错误示范

getReactApplicationContext

子类可以使用此方法访问作为构造函数传递的catalyst上下文。

getReactApplicationContext().getPackageName();

hasConstants

boolean 对于大多数第三方包(packages)中,hasConstant几乎总是返回true。 默认情况下,如果您不知道你的包中是否有一些常量(constants),则可以通过返回true来判断。

initialize

创建CatalystInstance之后,将在{@link CatalystApplicationFragment#createCatalystInstance()}的末尾处调用此方法,以初始化 调用CatalystInstance或者JS modules的NativeModules

canOverrideExistingModule

boolean https://blog.bam.tech/developer-news/how-to-speed-up-the-opening-of-your-application-react-native-on-android-using-turbo-modules
如果要重写已注册的其他本机模块(例如核心(core)程序),则返回true。 默认情况下,所有模块均返回false

onCatalystInstanceDestroy

module释放资源,在{CatalystInstance#onHostDestroy}之前调用

BaseJavaModule

public abstract class ReactContextBaseJavaModule extends BaseJavaModule

Catalyst原生模块(native module)的基类,其实现是用Java编写的。为方便起见,提供了{@link #initialize}和{@link #onCatalystInstanceDestroy}的默认实现。子类覆盖这些方法无需调用{@code super},因为这些方法的实现为空。

当生命周期事件发生时调用相应适当的方法,可以将BaseJavaModules链接到Fragments的生命周期事件以及{@link CatalystInstance}的创建和销毁。

原生方法(Native Method)可以通过{@link ReactMethod}注释公开给JS。这些方法的参数只能使用有限数量的类型:

  1. 基础类型(boolean, int, float, double)
  2. {@link String}从JS字符串映射
  3. {@link ReadableArray}从JS数组映射
  4. {@link ReadableMap}从JS对象映射
  5. {@link Callback} 从JS function函数映射,只能放在ReactMethod方法的最后一位(也可以多位Callback,如成功回调和错误回调)参数
  6. {@link Promise} 和Callback一样,使用Promise语法来简化代码。Promise和Callback只能存在一个

所有带有{@link ReactMethod}注释的JS原生方法都必须返回{@code void}

请注意,不允许使用带有相同名称的{@link ReactMethod}注释的多个方法。(不能重载)

React Native 全局错误捕获

灵感来自react-native-exception-handler 优点:能catch到所有JS event error 缺点:不能catch到JSX UI manage/ Native module error,如<View> Text strings must be rendered within a <Text> component </View>

JavaScript层捕获(短路)错误信息

"react-native": "0.60.0", // 较早版本仍会crash,详见commit 2dadb9e

global.ErrorUtils.setGlobalHandler(function(e, isFatal){
  if (isFatal) {
    alert(
        'Unexpected error occurred',
        `
        Error: ${(isFatal) ? 'Fatal:' : ''} ${e.name} ${e.message}

        We will need to restart the app.
        `
    );
  } else {
    console.log(e); // So that we can see it in the ADB logs in case of Android if needed
  }
})
Clone this wiki locally