React Native 与 嵌入Android原生与Activity页面互相跳转

使用React Native 混合开发,原生页面跳转到不同的RN页面 Android原生开发跳转到某个RN单页面的demo。 目前公司项目全部采用原生开发,现在想提升开发效率,把部分Android,iOS两端公共高复用的界面使用RN去做。就需要在原有的项目基础上加入RN并且单独跳转到不同的RN界面去。网上查了一下相关资料发现大部分都是从RN界面跳转到原生的介绍。RN不好处理的地方,直接调用原生界面去制作。很少有介绍有从原生跳转到RN某个单页面的介绍。详情可以查看我的博客介绍以使用方法。 立即下载

前言

    RN作为混合开发,肯定需要与原生直接的页面跳转,这里也属于和原生端通信的知识模块。我们知道Android的页面跳转是通过Intent、Rn是通过路由,而两者直接页面互相跳转就需要原生借助JS暴露接口给Rn来实现了。先上效果图:




运行项目:React Native 配置环境,运行第一个RN项目


集成项目:React Native 教程——集成到现有原生应用


第一步,AS创建一个Activity,显示HelloWorld:

 @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(createView());
    }
    private View createView() {
        LinearLayout ll= new LinearLayout(this);
        ll.setGravity(Gravity.CENTER);
        ll.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        // 设置文字
        TextView mTextView = new TextView(this);
        mTextView.setText("hello world");
        LinearLayout.LayoutParams mLayoutParams = new LinearLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        // 在父类布局中添加它,及布局样式
        ll.addView(mTextView, mLayoutParams);
        return ll;
    }


第二步,创建MyIntentModule类,并继承ReactContextBaseJavaModule。

注意:方法头要加@ReactMethod

/**
 * 原生Activity与React交互——模块
 */

public class MyIntentModule extends ReactContextBaseJavaModule {

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

    @Override
    public String getName() {
        return "IntentMoudle";
    }
    //注意:记住getName方法中的命名名称,JS中调用需要

    @ReactMethod
    public void startActivityFromJS(String name, String params){
        try{
            Activity currentActivity = getCurrentActivity();
            if(null!=currentActivity){
                Class toActivity = Class.forName(name);
                Intent intent = new Intent(currentActivity,toActivity);
                intent.putExtra("params", params);
                currentActivity.startActivity(intent);
            }
        }catch(Exception e){
            throw new JSApplicationIllegalArgumentException(
                    "不能打开Activity : "+e.getMessage());
        }
    }

    @ReactMethod
    public void dataToJS(Callback successBack, Callback errorBack){
        try{
            Activity currentActivity = getCurrentActivity();
            String result = currentActivity.getIntent().getStringExtra("data");
            if (TextUtils.isEmpty(result)){
                result = "没有数据";
            }
            successBack.invoke(result);
        }catch (Exception e){
            errorBack.invoke(e.getMessage());
        }
    }
//注意:startActivityFromJS、dataToJS方法添加RN注解(@ReactMethod),否则该方法将不被添加到RN中
}


第三步,创建MyReactPackage类

实现ReactPackage接口暴露给RN调用,在createNativeModules里注册上一步添加的模块:

/**
 * 注册模块
 */
public class MyReactPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        return Arrays.<NativeModule>asList(new MyIntentModule(reactContext));
    }
    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}


第四步,在MainApplication中的getPackages方法中注册到ReactPackage中:

@Override
protected List<ReactPackage> getPackages() {
  return Arrays.<ReactPackage>asList(
      new MainReactPackage(),
          new MyReactPackage()
  );
}

第五步,接下来的工作便是RN的Index.js代码:
import React, { Component } from 'react';
import {
   View,
    NativeModules,
    TouchableNativeFeedback,
    ToastAndroid
} from 'react-native';
export default class App extends Component<{}> {
    _onPressButton() {
        console.log("You tapped the button!");
        NativeModules
            .IntentMoudle
            .startActivityFromJS("com.myreactdemo.MyActivity", null);
    }
    render() {
    return (
      <View>
        <TouchableNativeFeedback onPress={this._onPressButton}>
          <Text>跳转到原生页面</Text>
        </TouchableNativeFeedback>
      </View>
    );
  }
}

第六步,从Android跳转到RN页面
可以在rn中拿到activity跳转传递的值,值的传递跟普通activity之间的跳转没有差别:
[javascript]  view plain  copy
  1. getData() {  
  2.       NativeModules.IntentModule.dataToJS((msg) => {  
  3.               console.log(msg);  
  4.               let base = require('./constant');  
  5.               base.columnID = msg;  
  6.               //ToastAndroid.show('JS界面:从Activity中传输过来的数据为:' + base.columnID, ToastAndroid.SHORT);  
  7.           },  
  8.           (result) => {  
  9.               ToastAndroid.show('JS界面:错误信息为:' + result, ToastAndroid.SHORT);  
  10.           })  
  11.   }  

拿到这个值之后存在了常量类里,就是通过这个常量来实现跳转到不同的界面,之后的事情就迎刃而解了:
[java]  view plain  copy
  1. componentDidMount() {  
  2.       let base = require('./constant');  
  3.       //ToastAndroid.show(base.columnID, ToastAndroid.SHORT);  
  4.       let id = base.columnID;  
  5.       if (id == "3") {  
  6.           const { navigator } = this.props;  
  7.           if (navigator) {  
  8.               navigator.push({  
  9.                   name: 'secondPage',  
  10.                   component: secondPage,  
  11.               })  
  12.           }  
  13.       }  if (id == "4") {  
  14.           const { navigator } = this.props;  
  15.           if (navigator) {  
  16.               navigator.push({  
  17.                   name: 'otherPage',  
  18.                   component: otherPage,  
  19.               })  
  20.           }  
  21.       }  
  22.   } 


第七步,运行安装:

输入命令启动应用:

1.进入项目根目录:

cd MyReactDemo  
2.运行:
react-native run-android  
*如果设备没安装上AwesomeProject,可直接用Android studio或eclipse开发工具打开AwesomeProject文件里的Android项目,点击run运行安装即可。 运行应用首先需要启动开发服务器(Packager)

npm start  

*不知道如何安装运行的请移步前两章 :


运行项目:React Native 配置环境,运行第一个RN项目


集成项目:React Native 教程——集成到现有原生应用


欢迎入坑:




Qt Creator设计器里也能拖拽?5步将你的QML自定义控件变成可视化插件(Qt6.5+) 本文详细介绍了如何在Qt Creator设计器中实现QML自定义控件的可视化拖拽功能(Qt6.5+)。通过5个步骤,从构建可插件化的QML控件基础到部署插件到设计器环境,帮助开发者将自定义控件转化为设计器插件,提升团队协作效率。特别适合需要频繁调整UI样式的开发场景。 阅读详情

相关推荐

876-基于STM32的毫米波雷达智能睡眠监测系统

基于STM32的毫米波雷达智能睡眠监测系统通过非接触式毫米波雷达检测人体呼吸频率和体动次数,结合WIFI数据传输和OLED显示,实现睡眠质量分析与远程监控。系统核心功能包括生理参数采集、阈值设置、数据可视化及远程交互。

m0_50083169的博客 1544

uni-app 跳转Android原生界面(Activity),并传值交互

应大家的要求,我研究了一下相互传值操作 一、uni-app 跳转Android原生界面(Activity)并传值 前端传值操作 <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> </head> <body> <input type="button" value="js start native Activity" onclick="jsCallNative.

ITPlus的博客 1万+

Pspice开关电源仿真:从零实现反激式电源设计实战案例

通过Pspice仿真工具,手把手实现反激式开关电源的设计与优化,深入剖析关键参数设置与波形分析,帮助掌握Pspice在电源开发中的实际应用技巧。

weixin_35756690的博客 1156

React Native 与 嵌入Android原生与Activity页面互相跳转,程序人生

/注意:startActivityFromJS、dataToJS方法添加RN注解(@ReactMethod),否则该方法将不被添加到RN中。

2401_84121827的博客 1887

Cadence 17.4 PSpice仿真555定时器输出方波

这里利用555定时器组成多谐振荡器产生1Hz的方波并用PSpice仿真其输出的方波波形。555定时器是一种广泛应用的中规模集成电路。根据其内部组成的不同,可分为双极型(555B)和CMOS型(555C)两类。两种类型的定时器各有所长。双极型定时器具有较大的驱动能力,其输出电流可达200mA,可直接驱动发光二级管、扬声器、继电器等负载。而CMOS型定时器的输入阻抗高、功耗低。

tj_nonstoper的博客 1万+

Burp靶场实战:JWT签名绕过漏洞分析与利用

本文通过Burp Suite靶场实战,深入剖析了JWT签名绕过漏洞的多种攻击手法,包括签名未验证、alg:none攻击、弱密钥爆破、JWK/JKU头注入、KID路径遍历及算法混淆攻击。文章详细演示了利用过程,并提供了关键的防御指南,帮助开发和安全人员加固JWT实现,确保认证安全。

weixin_29325515的博客 597

RN与Android的交互

Android端接口 RN端向Android侧通信可以通过Android侧的接口来实现。 实现接口 Android侧的接口都需要继承ReactContextBaseJavaModule类,如下: class MyModule extends ReactContextBaseJavaModule { @NonNull @Override public String getName() { return "MyModule"; } // 1 @ReactMethod

kkk96291的博客 1234

基于Simulink的MIMO-OFDM系统仿真建模示例

MIMO概述MIMO技术利用多个天线进行信号发送和接收,通过空间复用来提高数据传输速率,或通过空间分集来增强信号的可靠性。OFDM概述OFDM是一种将高速率数据流分成多个低速数据流并行传输的技术,每个子载波都采用调制方式(如BPSK、QPSK),并通过IFFT/FFT变换实现串并转换。MIMO-OFDM优势结合了MIMO的空间分集增益与OFDM对抗多径效应的能力,适用于宽带无线通信系统。提供了更高的数据速率和更好的频谱效率,是现代无线通信标准(如4G LTE、5G NR等)的核心技术之一。

xiaoheshang_123的博客 327

React Native 与 嵌入Android原生与Activity页面互相跳转(1)

"不能打开Activity : "+e.getMessage());try{result = “没有数据”;//注意:startActivityFromJS、dataToJS方法添加RN注解(@ReactMethod),否则该方法将不被添加到RN中。

2401_84132393的博客 614

QT入门开发一个时钟

本文讲述了时钟开发的具体过程以及代码。 涉及到一下几个知识点: 1. 定时器使用 2. 本地时间获取 3. resource资源读取 4. 图片绘制 5. 图片按照中心旋转 6. sin或者cos角度计算。

啊渊的专栏 5150

PyQt5简介和安装

在initUI方法中,设置了窗口的标题和大小,并创建了一个按钮。PyQt5是一个功能强大的Python界面开发框架,可以轻松创建跨平台的图形用户界面应用程序。本文介绍了PyQt5的简介和安装方法,并提供了一个简单的示例应用程序来演示PyQt5的基本用法。PyQt5是一个功能强大的Python界面开发框架,它提供了丰富的工具和组件,用于创建跨平台的图形用户界面(GUI)应用程序。信号是控件发出的事件,槽是与之关联的处理函数。接下来,我们将编写一个简单的PyQt5应用程序,以演示PyQt5的基本用法。

XdKwargs的博客 224

2024年安卓最新React Native 与 嵌入Android原生与Activity页面互相跳转,2024年最新android app面试

最后小编想说:不论以后选择什么方向发展,目前重要的是把Android方面的技术学好,毕竟其实对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!这里附上我整理的几十套腾讯、字节跳动,京东,小米,头条、阿里、美团等公司19年的Android面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。由于篇幅有限,这里以图片的形式给大家展示一小部分。

2401_84558983的博客 1050

大数据平台符合信创(CDH国产化代替)详细方案(企业内部不外传方案)

信创旨在实现信息技术产业的自主可控,减少对外部技术的依赖,从而提升国家信息安全和经济发展的自主性。在此背景下,中国对信创提出了更高的要求,以期在激烈的市场竞争中占据有利地位。信创不仅关乎技术层面的创新,更涉及到产业链条的整合与优化。它要求从基础硬件、操作系统、数据库、中间件等各个层面实现国产替代,构建完整的信息技术生态体系。尤其是在做国企项目时,就有硬性要求使用符合信创(国产代替)。在信创背景下,符合要求的产品必须具备自主可控、安全可靠以及性能卓越等核心特点。

大模型大数据攻城狮的专栏 3512
上一篇: Android 搭配React Native开发的优势及劣势解析
下一篇: Android 主题Theme样式一键换肤,非常简单(附小案例)
艾阳Blog
艾阳Blog 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄10年 4087粉丝 217原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾阳Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值