最新版Android原生集成RN

最新的在原生Android应用中集成ReactNative 集成到现有原生应用把 React Native 组件集成到 Android 应用中有如下几个主要步骤:开发环境准备第一步:引入react-native第二步:添加react和react native模块第三步:添加ReactNative依赖第四步:在package.json文件中的scripts里面配置启动脚本1.创建一个index.js文件2. 添加你自己的 React Native 代码3.配... 阅读详情

前言

现在不少应用都是采用了混合开发模式,不论是原生加RN,或是原生加Flutter,或是原生加H5。原生实现主业务线,其他部分可以借助跨平台方案开发,提高开发效率,或者实现热更新,调高业务迭代效率。

下面简单介绍一下Android原生集成最新RN版本的过程。

添加package.json文件

首先在一个正常编译运行的原生APP根目录下执行yarn init命令,按提示填写基本信息后会在项目根目录下,创建一个package.json文件。

添加JavaScript依赖,生成node_modules

然后,使用如下命令添加React和React Native运行环境的支持脚本。

yarn add react react-native

命令执行完成后,所有JavaScript依赖模块都会被安装到项目根目录下的node_modules/目录中。

注意:node_modules这个目录我们原则上不复制、不移动、不修改、不上传,随用随装,同时把node_modules/目录记录到.gitignore文件中(即不上传到版本控制系统,只保留在本地)。

接下来,在package.json文件中配置启动RN Metro服务的脚本,即script脚本,文件全部内容如下。
项目根目录package.json文件

{
  "name": "AndroidDemo",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "react": "^18.2.0",
    "react-native": "^0.70.6"
  },
  "scripts": {
    "start": "yarn react-native start"
  }
}

原生端添加React Native依赖

在app中build.gradle文件中添加React Native和JSC引擎依赖:

dependencies {
    ...
    implementation "com.facebook.react:react-native:+"
    implementation "org.webkit:android-jsc:+"
}

在项目的build.gradle文件中为React Native和JSC引擎添加maven源的路径,必须写在 “allprojects” 代码块中。

allprojects {
    repositories {
        maven {
            // All of React Native (JS, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
        maven {
            // Android JSC is installed from npm
            url("$rootDir/../node_modules/jsc-android/dist")
        }
    }
}

!!!注意这里有个问题,点击同步后,会报如下错误:

Build was configured to prefer settings repositories over project repositories but repository 'maven' was added by build file 'build.gradle'

原因是gradle7.0后,以前位于根项目build.gradle文件中的代码库设置现在迁移到了settings.gradle文件中,根目录build.gradle文件不做更改。
settings.gradle文件配置

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            url "$rootDir/node_modules/react-native/android"
        }
        maven {
            url("$rootDir/node_modules/jsc-android/dist")
        }
    }
}

相关说明:https://developer.android.com/studio/releases/gradle-plugin#7-1-0

配置原生项目网络权限及开发者菜单页面

在原生AndroidManifest.xml文件进行添加,对应示例如下
如果需要访问http请求,需要application中添加usesCleartextTraffic

// 网络权限
 <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true" // 访问http请求
        android:theme="@style/Theme.AndroidStudy"
        tools:targetApi="31">

        <activity
            android:name=".MainActivity"
            android:exported="true">
<!--            <intent-filter>-->
<!--                <action android:name="android.intent.action.MAIN" />-->

<!--                <category android:name="android.intent.category.LAUNCHER" />-->
<!--            </intent-filter>-->
        </activity>

        <activity
            android:name=".MyActivity"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        //开发者调试菜单
        <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
    </application>

创建一个RN入口文件index.js

index.js是 React Native 应用在 Android 上的入口文件。而且它是不可或缺的!它可以是个很简单的文件,简单到可以只包含一行require/import导入语句,示例代码如下。

import React from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';

class HelloWorld extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.hello}>Hello, World</Text>
      </View>
    );
  }
}
var styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    backgroundColor: '#f9c2ff',
  },
  hello: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
    color: 'red'
  }
});

AppRegistry.registerComponent(
  'MyReactNativeApp',
  () => HelloWorld
);

创建一个页面用来承载RN页面

需要在一个Activity中创建一个ReactRootView对象,然后在这个对象之中启动React Native应用,并将它设为界面的主视图,这里创建了一个MyActivity页面

import android.app.Activity;
import android.os.Bundle;
import android.view.KeyEvent;

import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactRootView;
import com.facebook.react.common.LifecycleState;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.facebook.react.shell.MainReactPackage;
import com.facebook.soloader.SoLoader;

public class MyActivity extends Activity implements DefaultHardwareBackBtnHandler {
    private ReactRootView mReactRootView;
    private ReactInstanceManager mReactInstanceManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SoLoader.init(this, false);
        mReactRootView = new ReactRootView(this);
        mReactInstanceManager = ReactInstanceManager.builder()
                .setApplication(getApplication())
                .setCurrentActivity(this)
                .setBundleAssetName("index.android.bundle")
                .setJSMainModulePath("index")
                .addPackage(new MainReactPackage())
                .setUseDeveloperSupport(BuildConfig.DEBUG)
                .setInitialLifecycleState(LifecycleState.RESUMED)
                .build();
                // 注意这里的MyReactNativeApp 必须对应"index.js"中的
        // "AppRegistry.registerComponent()"的第一个参数
        mReactRootView.startReactApplication(mReactInstanceManager, "MyReactNativeApp", null);
        setContentView(mReactRootView);
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostPause(this);
        }
    }

    @Override
    protected void onResume() {
        super.onResume();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostResume(this, this);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (mReactInstanceManager != null) {
            mReactInstanceManager.onHostDestroy(this);
        }
        if (mReactRootView != null) {
            mReactRootView.unmountReactApplication();
        }
    }
// 显示开发调试菜单弹框
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
            mReactInstanceManager.showDevOptionsDialog();
            return true;
        }
        return super.onKeyUp(keyCode, event);
    }

    @Override
    public void invokeDefaultOnBackPressed() {
        super.onBackPressed();
    }
// 后退按钮事件传递给 React Native
    @Override
    public void onBackPressed() {
        if (mReactInstanceManager != null) {
            mReactInstanceManager.onBackPressed();
        } else {
            super.onBackPressed();
        }
    }
}

自此原生端集成RN完成。

测试集成效果。

首先,需要启动开发服务器(Metro)。你只需在项目根目录中执行以下命令:

yarn start

然后,点击Android Studio运行按钮,正常运行项目即可。

加载完bundle文件之后,可以看到如下页面了。

Android + RN 从零搭建 前端0基础的Android开发如何从0搭建Android +RN项目 阅读详情

相关推荐

老项目也能玩转跨平台?Android原生+RN混合开发深度解析

读者可通过本篇文章深入了解,在现有原生项目基础上,集成RN功能步骤及注意事项,推荐各位阅读。

wayne214的博客 1097

Android与RN的交互与通信

这块算是RN入门的最后一块内容,跨端之间的交互问题。两端交互是双向的,那么就会区分为RN通知Android调用方法Android通知RN调用方法这边就着官网讲解一下两种情况的实现方式。Android和RN之间的双向交互到这里就给你交待清除了,基本上都是官网的实现方式,想要更好的使用就需要做一系列的封装了。不过呢,通过这篇文章,相信门就给你入了。

qq_42430654的博客 1865

Android打包ReactNative项目作为SDK(将RN项目打包为aar包,调用方无需集成RN环境)

将android原生和react native混合开发的业务逻辑打包成SDK,提供给第三方APP使用(集成)

sinat_38115473的博客 3681

Android项目接入React Native方案

本篇文章主要介绍在现有的Android项目中接入React Native的接入过程,分析接入过程中的一些问题和解决方案,接入RN的平台为Android,开发环境为Mac,开发工具为Android Studio。

一杯清泉 6437

Android之原生项目集成React Native

上节我们简单讲解在一个用React Native(RN)创建的项目中如果引用安卓原生的控件,这节简单介绍下,在一个已存在的安卓原生应用中如何集成开发RN,如今的产品几乎都是原生所写,今后的开发方向肯定大多会去集成RN或者别的框架而并非推到重来,所以这块的内容也是开发必须要掌握的知识。

jj120522的专栏 8563

ReactNative调用android原生View

RN开发过程中,React Native是将原生控件封装桥接成JS组件来使用的,这保证了其性能的高效性。但是有时候官方封装的常用组件不能满足需求,就需要结合原生UI使用,例如:对原生实现的UI复用;复杂UI仍然需要原生自定义View实现。接下来就简单记录下RN开发过程中调用原生UI的流程。 例如下面这个UI效果,就需要用到Android原生自定义View实现: 以上图实现效果为例,分别从Andr...

小小T的专栏 1398

【RN】ReactNative与原生交互之Android篇

最近在因为项目需求需要,需要在原本的Android工程中集成RN,用RN来开发需求经常变更的、变更周期短的业务。写下这篇文章用来记述集成过程中的细节注意点以及一些学习经验。本文主要介绍RN与Android原生之间的一些交互操作,以及原生中间件的封装流程。涉及如何调用原生接口、传参、获取回调值、获取常量值、调用原生UI、监听原生发送的事件、线程操作等。 一、自定义原生模块 创建自定义模块...

大灰狼的小绵羊哥哥的博客 1064

RN学习之路之-RN调用Android 原生页面篇(片尾附上源码地址)

1,前提是你必须完成Android 集成RN的操作,要不然下面没法玩 具体怎么玩请参考渣渣的笔记之 http://note.youdao.com/noteshare?id=3619fb52aae9cd06f3989b12e48b849a 2,RN页面如何调用Android 原生页面了 大家知道:Android 调用RN页面其实就是StartActivity 3,首先创建一个 M...

qq_30519365的博客 3042

原生安卓[Android]项目中集成RN[React Native]项目

原生安卓Android项目中集成RNReact Native项目 说明 开发环境 集成步骤 总结原生安卓[Android]项目中集成RN[React Native]项目1.说明: 1.基于对RN技术的跨平台性及代码的简洁性我对RN产生浓厚的兴趣 2.这是我人生的第一篇博客写得不好的希望各位读者谅解 3.本人在写这篇博客的时候查阅过大量的资料,花了两天时间才彻底搞清楚在原生Android项目集成RN技

qq_14923483的博客 1482

SAP成本计划BAPI接口BAPI_COSTACTPLN_POSTPRIMCOST深度解析与实战指南

在SAP ERP系统中,成本计划是财务与控制模块的核心功能,它涉及对企业未来成本支出的预测与规划。其原理是通过结构化数据模型,将成本要素分配到具体的成本对象上,以实现预算编制和成本控制。这一技术的核心价值在于实现成本数据的标准化、自动化处理,从而提升财务流程效率与数据准确性。在应用场景上,成本计划广泛应用于年度预算编制、项目成本预测、系统间数据集成以及历史数据迁移等关键业务环节。本文聚焦于实现上述流程自动化的关键技术——SAP标准接口BAPI_COSTACTPLN_POSTPRIMCOST,并深入探讨其在高

weixin_29657209的博客 350

使用PaddleOCR识别查验平台验证码

PaddleOCR识别国税查验平台验证码

m0_63932300的博客 1269

原生android工程实现RN集成

原生android工程实现RN集成

M075097的博客 3944

c++实现异步线程池并详细分析线程池析构流程

多线程编程是提高程序性能和响应能力的关键技术之一,异步线程池作为多线程编程的一种有效实现方式,能够管理和复用线程资源,避免频繁创建和销毁线程带来的开销。在本文中,我们将深入探讨如何实现一个异步线程池。

2301_76564925的博客 1599

android原生接入rn,Android原生项目集成ReactNative

Mac下搭建ReactNative开发环境一文中讲过了如何搭建环境以及创建一个ReactNative项目,很多时候我们会在原生项目开发中集成ReactNative,我们该怎么做呢?下面我们一步步实现吧。1.打开终端进入原生项目的根目录,输入npm init命令执行的过程中会让你填写一系列的值如下图所示:npm.jpg上面name属性填写的是reactnativedemo,最后输入yes结束,最终会...

weixin_30748139的博客 540

STM32CubeMx配置串口使用printf函数打印数据(HAL库开发)

HAL库开发串口,打印printf

m0_58832575的博客 6289

Ubuntu20.04下SRS流媒体服务器的安装与开机自启动优化指南

本文详细介绍了在Ubuntu20.04系统下安装SRS流媒体服务器并优化开机自启动的完整指南。从基础环境准备、服务管理方案对比到systemd自启动深度优化,提供了实用的配置技巧和排查方法,帮助用户快速搭建稳定的流媒体服务环境。特别推荐使用systemd方案实现高效的自启动管理。

weixin_29313239的博客 413

React Native踩坑:集成到现有Android原生应用、RN与Android相互调用

React Native踩坑:集成到现有Android原生应用、RN与Android相互调用前言效果搭建开发环境集成到现有Android原生应用创建项目结构安装 React 和 React Native 模块把 React Native 添加到 Android 应用中添加依赖配置权限Network Security Config (API level 28+)编写 React Native 组件A...

杨迪龙的博客 2979

comsol 多物理场仿真流程-以开关柜为例

1、主要方法 在SolidWorks中对于开关柜的内部与外部结构进行建模,生成能够导入软件计算的3D模型。将SolidWorks中的模型导入comsol软件中,设置参数进行多物理场耦合仿真。 1、具体步骤 删除高压开关柜中对其内部电磁环境无较大影响的结构,如低压测量柜、断路器内部结构等。 导入模型:将厂家提供的3D模型转化为solidworks结构模型。 修复模型:修复已转化模型中转化错误的部分、修复已转化模型中非实体部分、修复已转化模型中重叠实体部分 化简模型:去除过于...

健忘16的博客 7020

Android原生项目集成RN页面

Android原生接入ReactNative 许久不接触RN,重新捡起重复踩坑,折腾三天就此记录 优化后接入步骤 新建文件夹,将原AndroidStudio项目拷贝至此目录 同目录下新建package.json文件,编辑基本项目信息 { "name": "工程名", "version": "0.0.1", "private": true, "scripts": { "s...

微光 2328

倍福--实现TCP/IP的配置

控制器为CX5120,需要和上位机做通信,选择TCP/IP的通讯方式,本文介绍TCP/IP通信的操作步骤。 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 1.2. 串口调试助手 3 1.2.1. TCP调试通信助手 3 授权文件 3 2.1 Lib文件 3 2.2. CAB文件 4 PLC程序编写 4 3.1. 引入TCP/IP库文件 4 3.2. Client端程序 5 3.2.1. 建立相关变量 5 3.3.2. 编写连接功能块

weixin_41883890的博客 5730

【WRFDA教程第一期】运行观测预处理程序(OBSPROC)

运行观测预处理程序(OBSPROC)

WW、forever的博客 1897

ReactNative——集成RN到原生应用

参考资料:Android现有工程接入RN开发嵌入到现有原生应用 - React Native 中文网原生模块 - React Native 中文网现有项目接入RN简单来说分以下步骤1.首先要有一个现成的Android 工程。2. 安装 react-native组件。3.在原生app 中初始化 rn 组件部分。4.编译、运行调试程序。下面详细步骤:开发环境准备首先按照开发环境搭建教程来安装React

编程之美 1103

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

rn代码与android,RN与原生通讯(安卓篇)

明天和意外你永远都不知道哪一个先来,编程界亦是如此。例如某个已经有原生代码开发模块的项目要求用RN扩张某些功能;又例如,RN中未封装到的组件非得求助于原生代码。所以RN与原生代码通讯对于混合编程是至关重要的。为了实现两者之间的通信,facebook也提供了三种通信方式。看内容.jpgRCTDeviceEventEmitter消息机制:由Native主导控制,可以任意时刻传递Callback回调方式...

weixin_39818550的博客 646

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

把RN集成到现有原生项目中

上一篇文章《ReactNative初探》我们初步讲解了RN的环境搭建和helloWorld的demo,还有整个过程中所碰到的一些坑点,也提到了把RN集成到现有的原生Android项目中去,其中这块我们是按照官方文档来实现的,但是有一个问题:假如我们native开发人员本地没有搭建RN环境,那么就需要每个协作开发的native人员都去从git上下载这些node_modules这个文件夹,里面的东西非...

Water的博客 1646

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

ReactNative调用Android原生方法

ReactNative调用Android原生方法

u014131921的博客 1万+

RN系列:Android原生与RN如何交互通信

【简述RN集成到Android原生项目】【Android项目集成RN系列:RN使用Android原生控件或自定义组件】【React Native Linking与 Android原生页面路由跳转问题】 Android与RN通信.png React Native在Android混编项目中的页面跳转和方法调用大致可以通过上面这张简图来描述下: 一、页面跳转(RN与Android原生) RN页面跳转原生 方式一: 通过下面即将讲述的方法调用实现,通过在RN中调用 NativeModule中.

大灰狼的小绵羊哥哥的博客 3374
上一篇: Kotlin协程Flow浅析
下一篇: Android实现RecyclerView嵌套流式布局
wayne214
博客等级 码龄11年 312粉丝 232原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值