ReactNative For Android 之五:自定义module

ReactNative For Android 之五:自定义module

  • 一.创建自定义module类
  • 二.创建自定义的Package
  • 三.JS中调用
  • 四.回调方法和native主动发送消息
    • 1.回调方法
    • 2.native主动发送消息

系列文章:
ReactNative For Android 之一:环境搭建
ReactNative For Android 之二:基本组件和API
ReactNative For Android 之三:工程结构
ReactNative For Android 之四:自定义组件
ReactNative For Android 之五:自定义module
ReactNative For Android 之六:组件生命周期

JS是如何调用到native的特性的,可以通过定义自定义Module和自定义的Component来定义模块和组件在JS中使用,这里以模仿ToastAndroid的组件的功能ToastAndroid.show(msg,ToastAndroid.SHORT)来写一个自定义的Module.

一.创建自定义module类

ReactNative For Android 之五:自定义module_第1张图片
ReactNative For Android 之五:自定义module_第2张图片

  1. 首先建立一个类,要继承ReactContextBaseJavaModule类

  2. 重写getName方法,返回的是字符串,这个值是在JS中引用时的名字

  3. 重写getConstants方法,返回一个Map对象,装的是需要用到的属性和对应的值

  4. 自定义一个方法,用@ReactMethod来标注注解,就是指该方法是可在js中调用的方法,传入的参数类型会映射到相应的js类型,如上图例子的show方法,在js中调用该方法时,传入两个参数,即可实现Toast方法

二.创建自定义的Package

ReactNative For Android 之五:自定义module_第3张图片
还记得在MainActivity的onCreate方法里的初始化React环境的语句么,在这里有addPackage方法来加载所需要的react的package,MainReactPackage是原有的,我们也可以add自定义的,package里可以指定加载自定义的各种module,component等—所以需要自定义一个package,装入我们所有自定义的东西,并将package添加到环境中即可使用自定义的东西了:
ReactNative For Android 之五:自定义module_第4张图片

  1. 创建一个类,实现ReactPackage接口,实现自定义的package

  2. 重写了三个方法,都返回list集合,分别装有我们自定义的module,view(自定义component)的对象即可,比如createNativeModules里我们返回了自定义的ToastModule的对象的集合

  3. 在onCreate里addPackage这个类的对象即可

三.JS中调用

ReactNative For Android 之五:自定义module_第5张图片

  1. 需要引入NativeModules对象,所有自定义的module都在这里

  2. 还记得刚刚自定义module里的getName么,返回的就是该module的名字,所以这里用NativeModules.ToastModule就可以引用出该module,赋值给一个叫ToastModule的变量

  3. 使用刚才用ReactMethod标注的方法时很简单,就直接用ToastModule.show(msg,ToastModule.SHORT/LONG)即可,其中第二个参数就是当初getConstants里传入的那些值

四.回调方法和native主动发送消息

1.回调方法

ReactNative For Android 之五:自定义module_第6张图片
回调方法很简单,就是native的自定义方法的参数为callback类型即可,然后用callback.invoke(args)就可以调用,args为传回到js去的参数
在这里插入图片描述
使用起来也是调用module的方法名,传入一个func类型的参数即可实现

2.native主动发送消息

在这里插入图片描述
在这里插入图片描述

  1. 发送的参数装在一个WritableMap里(以键值对的形式)

  2. navtive调用时,只需使用ReactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName,params);即可发送一个事件,eventName为自定义的一个事件名字,在js注册时用到

  3. js中,首先引入DeviceEventEmitter,使用其addListener(刚定义的eventName,回调方法)即可注册到该eventName发送的消息,并在回调方法的参数里拿到刚发送时设置参数map

  4. 原理类似广播监听

你可能感兴趣的:(知识积累,android相关,ReactNative)