《React-Native系列》RN与native交互与数据传递
RN怎么与native交互的呢?
下面我们通过一个简单的Demo来实现:RN页面调起Native页面,Native页面选择电话本数据,将数据回传给RN展示。
首先是 Native侧
1、MainActivity
- package com.rnandroid01;
- import android.content.Intent;
- import android.database.Cursor;
- import android.net.Uri;
- import android.provider.ContactsContract;
- import com.facebook.react.ReactActivity;
- public class MainActivity extends ReactActivity {
- /**
- * Returns the name of the main component registered from JavaScript.
- * This is used to schedule rendering of the component.
- */
- @Override
- protected String getMainComponentName() {
- return "RNAndroid01";
- }
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if(requestCode!=200 || resultCode!=RESULT_OK) return;
- Uri contactData = data.getData();
- Cursor cursor = managedQuery(contactData, null, null, null, null);
- cursor.moveToFirst();
- String num = getContactPhone(cursor);
- //下面的话 就是将num发送给rn侧 需要调用nativeModule对象里面的方法
- MainApplication.getMyReactPackage().myNativeModule.sendMsgToRn(num);
- }
- //这个是Native代码,与RN其实没什么关系
- private String getContactPhone(Cursor cursor) {
- // TODO Auto-generated method stub
- int phoneColumn = cursor
- .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);
- int phoneNum = cursor.getInt(phoneColumn);
- String result = "";
- if (phoneNum > 0) {
- // 获得联系人的ID号
- int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
- String contactId = cursor.getString(idColumn);
- // 获得联系人电话的cursor
- Cursor phone = getContentResolver().query(
- ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
- null,
- ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "="
- + contactId, null, null);
- if (phone.moveToFirst()) {
- for (; !phone.isAfterLast(); phone.moveToNext()) {
- int index = phone
- .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
- int typeindex = phone
- .getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
- int phone_type = phone.getInt(typeindex);
- String phoneNumber = phone.getString(index);
- result = phoneNumber;
- }
- if (!phone.isClosed()) {
- phone.close();
- }
- }
- }
- return result;
- }
- }
2、MainApplication
- package com.rnandroid01;
- import android.app.Application;
- import android.util.Log;
- import com.facebook.react.ReactApplication;
- import com.facebook.react.ReactInstanceManager;
- import com.facebook.react.ReactNativeHost;
- import com.facebook.react.ReactPackage;
- import com.facebook.react.shell.MainReactPackage;
- import java.util.Arrays;
- import java.util.List;
- public class MainApplication extends Application implements ReactApplication {
- private static final MyReactPackage myReactPackage=new MyReactPackage();
- public static MyReactPackage getMyReactPackage() {
- return myReactPackage;
- }
- private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {
- @Override
- protected boolean getUseDeveloperSupport() {
- return BuildConfig.DEBUG;
- }
- @Override
- protected List<ReactPackage> getPackages() {
- return Arrays.<ReactPackage>asList(
- new MainReactPackage(),
- myReactPackage
- );
- }
- };
- @Override
- public ReactNativeHost getReactNativeHost() {
- return mReactNativeHost;
- }
- }
3、MyReactPackage
- package com.rnandroid01;
- import com.facebook.react.ReactPackage;
- import com.facebook.react.bridge.JavaScriptModule;
- import com.facebook.react.bridge.NativeModule;
- import com.facebook.react.bridge.ReactApplicationContext;
- import com.facebook.react.uimanager.ViewManager;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
- public class MyReactPackage implements ReactPackage {
- public MyNativeModule myNativeModule;
- @Override
- public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
- List<NativeModule> modules=new ArrayList<>();
- myNativeModule=new MyNativeModule(reactContext);
- modules.add(myNativeModule);
- return modules;
- }
- @Override
- public List<Class<? extends JavaScriptModule>> createJSModules() {
- return Collections.emptyList();
- }
- @Override
- public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
- return Collections.emptyList();
- }
- }
4、MyNativeModule
- package com.rnandroid01;
- import android.content.Context;
- import android.content.Intent;
- import android.os.Bundle;
- import android.provider.ContactsContract;
- import android.widget.Toast;
- import com.facebook.react.bridge.ReactApplicationContext;
- import com.facebook.react.bridge.ReactContextBaseJavaModule;
- import com.facebook.react.bridge.ReactMethod;
- import com.facebook.react.modules.core.DeviceEventManagerModule;
- public class MyNativeModule extends ReactContextBaseJavaModule {
- private ReactApplicationContext mContext;
- public MyNativeModule(ReactApplicationContext reactContext) {
- super(reactContext);
- mContext = reactContext;
- }
- @Override
- public String getName() {
- //一定要有这个名字的 在rn代码里面是需要这个名字来调用该类的方法的
- return "MyNativeModule";
- }
- //函数不能有返回值,因为被调用的原生代码是异步的,原生代码执行结束之后只能通过回调函数或者发送消息给rn那边
- //有一个错误
- @ReactMethod
- public void rnCallNative(String msg) {
- Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
- // Intent intent = new Intent(mContext, MyActivity.class);
- // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//一定要加上这句 否则报错
- // mContext.startActivity(intent);
- Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
- Bundle bundle = new Bundle();
- mContext.startActivityForResult(intent,200,bundle);
- }
- public void sendMsgToRn(String msg){
- //将消息msg发送给RN侧
- mContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("AndroidToRNMessage",msg);
- }
- }
在RN侧
- /**
- * Sample React Native App
- * https://github.com/facebook/react-native
- * @flow
- */
- import React, { Component } from 'react';
- import {
- AppRegistry,
- StyleSheet,
- Text,
- NativeModules,
- DeviceEventEmitter,
- View
- } from 'react-native';
- class RNAndroid01 extends Component {
- componentWillMount(){
- DeviceEventEmitter.addListener('AndroidToRNMessage',this.handleAndroidMessage);
- }
- componentWillunMount(){
- DeviceEventEmitter.remove('AndroidToRNMessage',this.handleAndroidMessage);
- }
- handleAndroidMessage=(msg)=>{
- //RN端获得native端传递的数据
- console.log(msg);
- }
- render() {
- return (
- <View style={styles.container}>
- <Text style={styles.welcome}
- onPress={this.CallAndroid}
- >
- Welcome to React Native!RN与Android的通信
- </Text>
- <Text style={styles.instructions}>
- To get started, edit index.android.js
- </Text>
- <Text style={styles.instructions}>
- Shake or press menu button for dev menu
- </Text>
- </View>
- );
- }
- CallAndroid=()=>{
- NativeModules.MyNativeModule.rnCallNative('rn调用原生模块的方法-成功啦');
- }
- }
上面的例子实现了RN与Native端的交互及数据传递。
重点使用了React Native的RCTDeviceEventEmitter,通过消息机制来实现。
好了,RN与native的交互还可以通过Promise和Callback回调方式实现,我们下篇文章再看。
引用原文:http://blog.csdn.net/codetomylaw/article/details/51926421
写博客是为了记住自己容易忘记的东西,另外也是对自己工作的总结,文章可以转载,无需版权。希望尽自己的努力,做到更好,大家一起努力进步!
如果有什么问题,欢迎大家一起探讨,代码如有问题,欢迎各位大神指正!
《React-Native系列》RN与native交互与数据传递的更多相关文章
- MIFARE系列3《卡能源和数据传递》
在MIFARE卡中,能量和数据通过天线传输,卡中天线为几匝线圈,直接连接到芯片上,不再需要额外的组件.线圈嵌入塑料中,形成了一个无源的非接触卡. 读卡器向IC发一组固定频率的电磁波,卡内有一个IC串联 ...
- 《React-Native系列》3、RN与native交互之Callback、Promise
接着上一篇<React-Native系列>RN与native交互与数据传递,我们接下来研究另外的两种RN与Native交互的机制 一.Callback机制 首先Calllback是异步的, ...
- React Native移动开发实战-3-实现页面间的数据传递
React Native使用props来实现页面间数据传递和通信.在React Native中,有两种方式可以存储和传递数据:props(属性)以及state(状态),其中: props通常是在父组件 ...
- react native 0.50与OC交互 && Swift与RN交互
新公司也打算做rn,还是得捡起来再度学习.开撸! react native一个版本一个样子,之前写的rn与iOS交互系列在最新版本中有点出入(0.50.4版本).今天填一下坑. 首先上npm版本,re ...
- 【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信
http://blog.csdn.net/xiaominghimi/article/details/51586492 一用到跨平台的引擎必然要有引擎与各平台原生进行交互通信的需要.那么Himi先讲解R ...
- 【react native】rn踩坑实践——从输入框“们”开始
因为团队技术栈变更为react native,所以开始写起了rn的代码,虽然rn与react份数同源,但是由于有很多native有关的交互和变动,实际使用还是碰到蛮多问题的,于是便有了这个系列,本来第 ...
- React Native 系列(五) -- 组件间传值
前言 本系列是基于React Native版本号0.44.3写的.任何一款 App 都有界面之间数据传递的这个步骤的,那么在RN中,组件间是怎么传值的呢?这篇文章将介绍到顺传.逆传已经通过通知传值. ...
- React Native 系列(三) -- 项目结构介绍
前言 本系列是基于React Native版本号0.44.3写的,相信大家看了本系列前面两篇文章之后,对于React Native的代码应该能看懂一点点了吧.本篇文章将带着大家来认识一下React N ...
- React Native 系列(三)
前言 本系列是基于React Native版本号0.44.3写的,相信大家看了本系列前面两篇文章之后,对于React Native的代码应该能看懂一点点了吧.本篇文章将带着大家来认识一下React N ...
随机推荐
- [转]C#自定义控件属性与行为
原文链接:http://blog.csdn.net/a237428367/article/details/5926445 控件应该定义属性而不是公共字段,因为可视化设计器在属性浏览器中显示属性,而不显 ...
- IOS无限自动循环滚动banner(源码)
本文转载至 http://blog.csdn.net/iunion/article/details/19080259 目前有很多APP都开始使用一些滚动banner,我自己也做了一个,部分算法没有深 ...
- 搭建一个简单的基于web的网络流量监控可视化系统
本文转载于我的个人博客,转载请标明出处. 初衷 在腾讯云的学生认证申请提交上去n天之后,终于得到了审批,所以迫不及待的想玩玩腾讯云,作为一个搞网络的,自然有一些关于网络应用的小玩意,所以把以前部署过的 ...
- hdu3535(AreYouBusy)
题目链接:传送门 题目大意:有 n 组任务,m 个体力,每组任务有 k 个,分类为 f,每个任务花费 x 体力,得到 y 开心值,求最大开心值,若不能完成输出-1 分类为 0:这一组中的 k 个任务至 ...
- Leetcode-Recover BST
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...
- java上传图片,把图片存到本地
思路:js通过FileReader获取图片的Base64,Java解码用IO存到本地. HTML 代码 <input type="file" ng-model="f ...
- 在Editplus中Dev C++配置C++的编译运行环境
1.首先得下载安装DEV-cpp 2.打开Editplus编辑器,工具->配置自定义工具 3.具体配置 编译C:命令:D:\Dev-Cpp\MinGW64\bin\g++.exe参数:" ...
- 在Web工程中,普通Java类如何读文件
我们在以前讨论过在Web工程不能采用Java工程原先的读取方式,即创建一个文件流(FileInputStream)并给出一个文件目录(从src开始找一直找到你要读取文件的目录),这种的方式是不可行的. ...
- django--mysql设置
mysql基本配置 'default': { 'ENGINE': 'django.db.backends.mysql', 'HOST': '127.0.0.1', 'PORT': 3306, 'USE ...
- xxxservlet继承HttpServlet类
"HttpServlet类被定义为抽象类,但是源码里面没有抽象方法.所以没有一定要求实现的方法.之所以定义为抽象类,是因为他继承了GenericServlet这个抽象类.并没有全部实现里面的 ...