《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 ...
随机推荐
- _beginthreadex创建线程,立即执行?
一个线程创建后,并不是立马就执行,而是等时间片到来后才执行... C++ Code 12345678910111213141516171819202122232425262728293031323 ...
- 记一次androidd登陆页面的实现
背景 先说个事:最近我准备做个开源的博客园android客户端!符合Google最新的material design设计风格的!不知道有没有小伙伴愿意和我一起做呢?如果有愿意的,请私信我哦!!!!我还 ...
- 【BZOJ4675】点对游戏 树分治+期望
[BZOJ4675]点对游戏 Description 桑尼.露娜和斯塔在玩点对游戏,这个游戏在一棵节点数为n的树上进行. 桑尼.露娜和斯塔三人轮流从树上所有未被占有的节点中选取一点,归为己有,轮流顺序 ...
- VC中获取窗口句柄的各种方法
AfxGetMainWndAfxGetMainWnd获取自身窗口句柄HWND hWnd = AfxGetMainWnd()->m_hWnd; GetTopWindow函数功能:该函数检查与特定父 ...
- ES6 Promise对象then方法链式调用
then()方法的作用是Promise实例添加解决(fulfillment)和拒绝(rejection)状态的回调函数.then()方法会返回一个新的Promise实例,所以then()方法后面可以继 ...
- jq左右按钮点击幻灯片
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- window下安装mysql详细步骤
1.下载安装包 打开mysql官网下载页面:http://dev.mysql.com/downloads/mysql/ 1.选择相应的版本和平台 2.mysql配置 打开刚刚解压的文件夹F:\mysq ...
- Vue(5)- axios、vuex
一.内容回顾 1.webpack(前端中工作,项目上线之前对整个前端项目优化) - entry:整个项目的程序入口(main.js或index.js): - output:输出的出口: - loade ...
- 从SNE到t-SNE再到LargeVis
http://bindog.github.io/blog/2016/06/04/from-sne-to-tsne-to-largevis/
- CDN 环境下获取用户IP方法
CDN 环境下获取用户IP方法 1 cdn 自定义header头的X-Real-IP,在后端使用$http_x_real_ip获得 proxy_set_header X-Real-IP $remote ...