13.React Native调用Android原生代码;

本文详细介绍了如何在React Native应用中调用Android原生代码,包括创建原生模块、配置RN调用、以及如何在RN和Android间进行传值和类型转换,提供了一个调用Android原生Toast功能的示例。
摘要由CSDN通过智能技术生成

目录

 

1.为什么需要调用Android原生代码

2.如何调用Android原生代码

2.1Android原生代码配置(注册供RN调用方法)

2.1.1创建原生模块

2.1.2为原生模块指定RN调用的名字(必须实现该方法)

2.1.3定义JavaScript同步访问到的预定义值(非必须实现该方法)

2.1.4定义RN实际调用的方法

2.1.5添加模块到Package中

2.1.6注册模块

2.2RN配置(实际调用Android原生模块)

2.2.1封装RN内部访问的注册模块(ToastExample)

2.2.2RN调用Java原生的模块

3.如何与Android原生代码传值

3.1RN和Android传值的类型转换

3.1.1类型转换(Java与JS-React Native类型对应关系)

3.1.2JS给Java传递对象或数组值接收类型(主动传值给Java并接受回调)

3.1.3Android原生转动传值给RN


1.为什么需要调用Android原生代码

有时候 App 需要访问平台 API,但 React Native 可能还没有相应的模块包装;或者你需要复用一些 Java 代码,而不是用 Javascript 重新实现一遍;又或者你需要实现某些高性能的、多线程的代码,譬如图片处理、数据库、或者各种高级扩展等等。

我们把 React Native 设计为可以在其基础上编写真正的原生代码,并且可以访问平台所有的能力。这是一个相对高级的特性,我们并不认为它应当在日常开发的过程中经常出现,但具备这样的能力是很重要的。如果 React Native 还不支持某个你需要的原生特性,你应当可以自己实现该特性的封装。-我们需要的某部分功能RN未提供,就需要调用原生的功能;

2.如何调用Android原生代码

以RN调用Android原生的Toast通知为例说明调用过程;(其他Android原生功能调用流程类似)

2.1Android原生代码配置(注册供RN调用方法)

2.1.1创建原生模块

我们首先来创建一个原生模块。一个原生模块是一个继承了ReactContextBaseJavaModule的 Java 类,它可以实现一些 JavaScript 所需的功能。我们这里的目标是可以在 JavaScript 里写ToastExample.show('Awesome', ToastExample.SHORT);,来调起一个短暂的 Toast 通知。

创建一个新的 Java 类并命名为ToastModule.java,放置到android/app/src/main/java/com/your-app-name/目录下,其具体代码如下:

// ToastModule.java

package com.your-app-name;

import android.widget.Toast;

import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

import java.util.Map;
import java.util.HashMap;

public class ToastModule extends ReactContextBaseJavaModule {

  private static final String DURATION_SHORT_KEY = "SHORT";
  private static final String DURATION_LONG_KEY = "LONG";

  public ToastModule(ReactApplicationContext reactContext) {
    super(reactContext);
  }
}

2.1.2为原生模块指定RN调用的名字(必须实现该方法)

ReactContextBaseJavaModule要求派生类实现getName方法。这个函数用于返回一个字符串名字,这个名字在 JavaScript 端标记这个模块。这里我们把这个模块叫做ToastExample,这样就可以在 JavaScript 中通过NativeModules.ToastExample访问到这个模块。译注:RN 已经内置了一个名为 ToastAndroid 的模块,所以在练习时请勿使用 ToastAndroid 的名字,否则运行时会报错名字冲突!

@Override
  public String getName() {
    return "ToastExample";
  }

2.1.3定义JavaScript同步访问到的预定义值(非必须实现该方法)

一个可选的方法getContants返回了需要导出给 JavaScript 使用的常量。它并不一定需要实现,但在定义一些可以被 JavaScript 同步访问到的预定义的值时非常有用。

@Override
  public Map<Str
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值