react-native和原生android的交互

embedded/2024/9/24 13:44:20/
  1. 连接react-native和原生android

    1. 可以参考我上一篇博客:react-native连接android原生模块-CSDN博客
    2. 这篇博客需要参考我的上一篇博客,下面的CalendarModule对象也是在上一篇博客里。
  2. 方式一:在android的方法直接return数据

    1. 在原生模块直接return相对应的数据,在android编写方法。
      @Override
      public Map<String, Object> getConstants() {final Map<String, Object> constants = new HashMap<>();constants.put("DEFAULT_EVENT_NAME", "New Event");return constants;
      }
    2. 这个方法编写在 CalendarModule 里面。

    3. 在react-native中加入getConstants,在CalendarModule.getConstant的方法写出。

      import {NativeModules} from 'react-native';
      const {CalendarModule} = NativeModules;const {DEFAULT_EVENT_NAME} = CalendarModule.getConstants();
      console.log(DEFAULT_EVENT_NAME); // New Event
    4. 效果图:

  3. 方式二:传入回调函数

    1. 原生模块还支持一种独特的参数类型:回调函数。回调函数用于将数据从 Java/Kotlin 异步传递到 JavaScript,同时也可用于从原生端异步执行 JavaScript 代码。
    2. 使用方法是react-native中编写方法 createCalendarEvent,传入回调方法。
      CalendarModule.createCalendarEvent('testName','testLocation',(error, eventId) => {if (error) {console.error(`Error found! ${error}`);}console.log(`event id ${eventId} returned`);},
      );
    3. android端编写触发回调。
      @ReactMethod(isBlockingSynchronousMethod = true)
      public void createCalendarEvent(String name, String location, Callback callBack) {Integer eventId = 123;callBack.invoke(null, eventId);
      }
    4. 触发的效果。
  4. 方式三:使用Promises

    1.  原生模块也可以实现Promise,使用它可以简化你的javascript代码,尤其是在使用ES2016的async/await语法时。当原生模块方法的最后一个参数为Promise时,对应的方法将返回一个JS Promise对象。
    2. android中加入方法,然后在Promise调用方法 resolve。
      @ReactMethod(isBlockingSynchronousMethod = true)
      public void createCalendarEvent(String name, String location, Promise promise) {try {Integer eventId = 123;promise.resolve(eventId);} catch(Exception e) {promise.reject("Create Event Error", e);}
      }
  5. 方式四:向 JavaScript 发送事件

    1. android编写:
      ...
      import com.facebook.react.modules.core.DeviceEventManagerModule;
      import com.facebook.react.bridge.WritableMap;
      import com.facebook.react.bridge.Arguments;
      ...
      private void sendEvent(ReactContext reactContext,String eventName,@Nullable WritableMap params) {reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, params);
      }private int listenerCount = 0;@ReactMethod
      public void addListener(String eventName) {if (listenerCount == 0) {// Set up any upstream listeners or background tasks as necessary}listenerCount += 1;
      }@ReactMethod
      public void removeListeners(Integer count) {listenerCount -= count;if (listenerCount == 0) {// Remove upstream listeners, stop unnecessary background tasks}
      }
      ...
      WritableMap params = Arguments.createMap();
      params.putString("eventProperty", "someValue");
      ...
      sendEvent(reactContext, "EventReminder", params);
    2. react-native的代码:
      import {NativeEventEmitter, NativeModules} from 'react-native';
      ...
      useEffect(() => {const eventEmitter = new NativeEventEmitter(NativeModules.ToastExample);let eventListener = eventEmitter.addListener('EventReminder', event => {console.log(event.eventProperty) // "someValue"});// Removes the listener once unmountedreturn () => {eventListener.remove();};}, []);
       

http://www.ppmy.cn/embedded/116114.html

相关文章

【命令操作】Windonws端口被占用,查找占用端口的进程id,以及使用id杀死进程

Windonws端口被占用&#xff0c;查找占用端口的进程id,以及使用id杀死进程 Windonws端口被占用 查询端口 netstat -ano查询指定端口-获得占用端口的进程ID netstat -ano | findstr "端囗号"如查询8888端口 netstat -ano | findstr "8888"命令截图 命令…

使用 Docker 容器化 .NET 应用:从进阶到高深

使用 Docker 容器化 .NET 应用&#xff1a;从进阶到高深 容器化已经成为现代应用开发和部署的重要一环&#xff0c;它极大地简化了应用的跨环境部署过程。而 Docker 作为容器技术的主流工具&#xff0c;与 .NET 应用结合可以提供稳定、可扩展的运行环境。本篇博客将深入探讨如…

黑客是如何绕过ssh登录目标站点

黑客绕过SSH登录目标站点的手法多种多样&#xff0c;其中一些技术不仅复杂且极具隐蔽性&#xff0c;严重威胁着网络安全。SSH&#xff08;安全外壳协议&#xff09;作为一种广泛使用的远程登录协议&#xff0c;虽然本身具备一定的安全特性&#xff0c;但仍然是黑客攻击的重要目…

编译内核lspcu 工具源码 util-linux

1. 获取源码 wget https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.34/util-linux-2.34.tar.xz 2. 解压 tar xvf util-linux-2.34.tar.gz cd util-linux-2.34 本次实验环境&#xff1a;使用云主机 1.查看Lscpu , dmesg ,lsblk 等版本 我们看到这些指令都是…

学习使用Docker

学习使用Docker 目录 学习使用Docker安装环境创建镜像创建镜像指令查看镜像指令导出镜像指令 部署portainer阿里云服务器部署docker和Portainer 安装环境 windows下安装docker desktop 创建镜像 特定tomcat版本war包镜像 # FROM openjdk:8-jdk FROM dockerproxy.net/librar…

【深度】为GPT-5而生的「草莓」模型!从快思考—慢思考到Self-play RL的强化学习框架

原创 超 超的闲思世界 2024年09月11日 19:17 北京 9月11日消息&#xff0c;据外媒The Information昨晚报道&#xff0c;OpenAI的新模型「草莓」&#xff08;Strawberry&#xff09;&#xff0c;将在未来两周内作为ChatGPT服务的一部分发布。 「草莓」项目是OpenAI盛传已久的…

文档矫正算法:DocTr++

文档弯曲矫正&#xff08;Document Image Rectification&#xff09;的主要作用是在图像处理领域中&#xff0c;对由于拍摄、扫描或打印过程中产生的弯曲、扭曲文档进行校正&#xff0c;使其恢复为平整、易读的形态。 一. 论文和代码 论文地址&#xff1a;https://arxiv.org/…

[leetcode刷题]面试经典150题之5多数元素元素(简单)【附Boyer-Moore 投票算法(摩尔投票法)】

很有意思的一个题&#xff0c;想了半天没想出来&#xff0c;最后发现两行代码就做出来了。写完后学习到还可以用Boyer-Moore 投票算法&#xff0c;能减小空间复杂度&#xff0c;我把它写在后面&#xff0c;可以进一步学习。 题目 多数元素 给定一个大小为 n 的数组 nums &am…