在react native中会涉及到很多页面之间的参数传递问题。静态的参数传递通常利用组件的Props属性,在初始化组件时即可从父组件中将参数传递到子组件中。对于非父子关系的组件来说,无法直接传递参数,此时可能会用到react-navigation来传递;此外,若要将异步函数、不可预料的事件执行等得到的参数用于页面刷新时,前述的方法都不太奏效。

DeviceEventEmitter

react-native中采用了DeviceEventEmitter来实现对事件的监听,实现非父子关系的页面之间的通信。具体来说,我们可以在一个页面中通过DeviceEventEmitter来对特定名称的事件进行监听,此后每当其它位置发送该名称的事件,都会触发这个监听的响应并执行对应的函数。

DeviceEventEmitter优点在于一次注册多次响应,并且注册后的监听事件是全局性的。不仅如此,通过DeviceEventEmitter还可以与原生模块进行交互。

基本语法

导入DeviceEventEmitter

首先要引入DeviceEventEmitter,DeviceEventEmitter在原生库中,直接引入即可:

import { DeviceEventEmitter } from 'react-native';

注册监听事件

通常来说我们会在组件加载完成后开始监听事件:

componentDidMount(){
this.emitter = DeviceEventEmitter.addListener('eventName’, function);
};

addListener('eventName’, function);拥有两个参数,第一个参数是监听事件的名称,为字符串类型;第二个参数是触发监听事件后的回调函数。

发送监听事件

注册监听后,我们可以在任意位置直接使用DeviceEventEmitter.emit('eventName',params)来广播一个事件。该函数也有两个参数。第一个参数同样为事件名称;第二个参数为可选项,用于参数的传递。

卸载监听事件

当页面卸载时,卸载监听事件:

componentWillUnmount() {
this.emitter.remove()
}

与原生通信

只需要在原生模块中广播该事件即可。具体代码如下:

private void sendEvent(ReactContext reactContext,String eventName, @Nullable WritableMap params) {
reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName, params);
}

上述代码发送了一个名为eventName的包含params参数的事件,值得注意的是发送该事件的前提是react native环境已经加载完成,需要获取其上下文ReactContext。

示例——react native响应通知消息点击事件

react native无法直接监听广播事件,因此需要用到原生模块协助。此处通过两次监听事件,采用安卓原生广播+安卓与react native通信来实现react native对通知消息点击事件的响应。

获取通知内容

第一步采用通过安卓原生模块监听通知点击事件(参见安卓广播机制)并获取到通知携带的参数信息。

public static class NotificationReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("androidNotification")){//响应通知事件
String params = intent.getExtras().getString("params");
if(params != null){
sendEventToRn("RNnotification",params);//发送事件给RN
}
}
}
} public static void sendEventToRn(String eventName, @Nullable String params){
//这里的模块中context已经获取
context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit("notification", params);
}

'RNnotification','androidNotification'为静态注册的广播接收器。广播的发送需要在通知消息的设置处自定义。本项目中处理过程如下:

Intent intent =new Intent();
intent.setAction("androidNotification");
intent.putExtra("params",msg.getRaw().toString());
Activity currentActivity = MainActivity.getCurrentActivity();//这里获取的是当前activity
currentActivity.sendBroadcast(intent);

然后在react native中监听通知事件'RNnotification'

DeviceEventEmitter.addListener('notification',this.notification);
console.log('开始监听通知'); notification = (paramString) =>{
//...此处实现了根据参数导航到指定页面
}

大功告成。

[技术博客]react native事件监听、与原生通信——实现对通知消息的响应的更多相关文章

  1. [技术博客]React Native——HTML页面代码高亮&数学公式解析

    问题起源 原有博文显示时代码无法高亮,白底黑字的视觉效果不好. 原有博文中无法解析数学公式,导致页面会直接显示数学公式源码. 为了解决这两个问题,尝试了一些方法,最终利用开源类库实现了页面美化. (失 ...

  2. react入门----事件监听

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. react native 之 事件监听 和 回调函数

    同原生一样,react native 同样也有事件监听和回调函数这玩意. 场景很多,比如:A界面push到B界面,B界面再pop回A界面,可以给A界面传值或者告诉A刷新界面. 事件监听 事件监听类似于 ...

  4. React.js 小书 Lesson9 - 事件监听

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson9 转载请注明出处,保留原文链接和作者信息. 在 React.js 里面监听事件是很容易的事情 ...

  5. React 函数组件中对window添加事件监听resize导致回调不能获得Hooks最新状态的问题解决思路

    React 函数组件中对window添加事件监听resize导致回调不能获得Hooks最新状态的问题解决思路 这几天在忙着把自己做的项目中的类组件转化为功能相同的函数组件,首先先贴一份该组件类组件的关 ...

  6. WebView使用详解(二)——WebViewClient与常用事件监听

      登录|注册     关闭 启舰 当乌龟有了梦想……       目录视图 摘要视图 订阅 异步赠书:Kotlin领衔10本好书      免费直播:AI时代,机器学习如何入门?      程序员8 ...

  7. 技术博客——微信小程序的架构与原理

    技术博客--微信小程序的架构与原理 在两个月的微信小程序开发过程中,我曾走了不少弯路,也曾被很多现在看来十分可笑的问题所困扰.这些弯路与困扰,基本上都是由于当时对小程序的架构理解不够充分,对小程序的原 ...

  8. ******IT公司面试题汇总+优秀技术博客汇总

    滴滴面试题:滴滴打车数据库如何拆分 前端时间去滴滴面试,有一道题目是这样的,滴滴每天有100万的订单,如果让你去设计数据库,你会怎么去设计? 当时我的想法是根据用户id的最后一位对某个特殊的值取%操作 ...

  9. ExtJs内的datefield控件选择日期过后的事件监听select

    [摘要]: 选择时间过后我们为什么需要监听事件?一般有这样一种情况,那就是用于比较两个时间大小或者需要判断在哪个时间点上需要做什么样的操作.基于这样的种种情况,我们很有必要琢磨一下datefield控 ...

随机推荐

  1. Map List Set的区别

    Map List Map的主要区别如下: set List 是实现了Collection接口的子接口:Map本身就是一个接口: list数据存放时有序的,允许有重复元素:set数据存放时无序的,不允许 ...

  2. JSP+SpringMVC框架使用WebUploader插件实现注册时候头像图片的异步上传功能

    一.去官网下载webuploader文件上传插件 https://fex.baidu.com/webuploader/ 下载好后把它放到Javaweb项目的文件夹中(我放到了webcontent下面的 ...

  3. Android Ant Build 遇到的问题

    Ant的具体使用这里就不详细说明了,这里记录下自己使用Ant批量打包apk的时候遇到的问题. 1. build 出现 crunch等字样的错误 <span style="color: ...

  4. ThreadLocal概述、以及存在的坑

    ThreadLocal: 线程的一个本地化对象.当多线程中的对象使用ThreadLocal维护变量是,ThreadLocal为每个使用该变量的线程分配一个独立的变量副本. threadlocal通常定 ...

  5. nginx配置ssl证书流程及常见问题

    背景:         项目开发中用到了微信小程序,但是服务器配置URL必须是HTTPS,所以需要通过配置nginx的SSL模块来支持HTTPS访问,也就是说,要做一个网站域名为 dmsdbj.com ...

  6. docker中使用阿里云的apt源安装各种实用工具

    今天想在docker中安装vim工具,还有其他的软件等等,如果你直接执行apt-get install vim是没有用的,会显示: root@7d43d83fd3a8:/etc/nginx# apt- ...

  7. NumPy简单入门教程

    # NumPy简单入门教程 NumPy是Python中的一个运算速度非常快的一个数学库,它非常重视数组.它允许你在Python中进行向量和矩阵计算,并且由于许多底层函数实际上是用C编写的,因此你可以体 ...

  8. PAT 乙级 1003.我要通过! C++/Java

    1003 我要通过! (20 分) 题目来源 “答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则 ...

  9. 【PyTorch v1.1.0文档研习】60分钟快速上手

    阅读文档:使用 PyTorch 进行深度学习:60分钟快速入门. 本教程的目标是: 总体上理解 PyTorch 的张量库和神经网络 训练一个小的神经网络来进行图像分类 PyTorch 是个啥? 这是基 ...

  10. Java精通并发-Lock与synchronized关键字在底层的区别及实例分析

    在上两次中已经将Lock这个接口的整个官方说明进行了阅读,这次来了解一下它的一个非常重要的实现类: 啥叫“可重入”呢?其实是指一个线程已经拿到了锁,然后该线程还能再次获取这把锁,接下来在了解它之前先用 ...