前言

对于现有的大多数项目来说都不是从头构建的,而要在原有项目的基础上引入React Native则肯定和用react-native init xxx创建工程不同。因此下面就来说下具体操作。不过在真正开始之前还是要先说明一下工具配置。

  • NodeJS:选择对应的系统下载并安装,安装完即可在终端运行npm 命令。
  • 配置源,众所周知因为墙的原因,所以最好配置国内的源。

配置方法如下:

npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global

1.加入package.json文件以及index.android.js文件

一般地,我们可以在项目根目录下创建package.json文件以及index.android.js文件。

  • package.json文件类似与Android中的build.gradle文件,在其中主要配置了React Native所需的依赖库以及一些脚本语句。以下的代码可以看作是一个package.json文件的模版,版本号可以根据需要而定。
{"name": "XXX","version": "0.0.1","private": true,"scripts": {"start": "node node_modules/react-native/local-cli/cli.js start","test": "jest"},"dependencies": {"react": "16.0.0","react-native": "0.50.3","react-native-device-info": "^0.12.1"},"devDependencies": {"babel-jest": "21.2.0","babel-preset-react-native": "4.0.0","jest": "21.2.1","react-test-renderer": "16.0.0"},"jest": {"preset": "react-native"}
}
  • index.android.js 文件是RN程序的入口文件。通常index.android.js 文件如下:
import React,{Component} from 'react';
import {AppRegistry,View,Text,
} from 'react-native';class App extends Component{//...其他方法render(){return(<View><Text>this is React Native  Page</Text></View>);}//...其他方法
}AppRegistry.registerComponent('XXX', () => App);

然后,在该目录下打开终端,运行 npm i 命令,安装React Native 所需的依赖,安装完成后会在根目录下创建node_modules文件夹,下载的依赖就在这个文件夹下。到此,第一步的工作已经完成了。

-----分割线------
实际上我们不会将RN代码放到Android工程里,因为在一般的公司项目中,使用SVN或者Git进行管理,客户端目录下一般都会有Android和iOS两个目录区分两个端。而React Native作为一个跨平台的框架,放在Android或者iOS目录里都不太合适。因此个人认为比较好的做法是在Android和iOS同级目录创建一个ReactNative目录,放置RN项目的代码。因此目录结构大致如下:

.
├──Android├──trunk├──branches└──tags
├──iOS      ├──trunk├──branches└──tags
└──ReactNative    ├──trunk├──branches└──tags 

此时,RN项目的代码包括package.json文件以及index.android.js文件都是在trunk目录下,自然地,需要在trunk目录打开终端,运行运行 npm i 命令,安装React Native 所需的依赖,而node_modules文件夹也自然会在该文件夹内创建。

2.在Android项目中配置ReactNative依赖

对于package.json文件在Android 工程中的情况

首先编辑在项目目录下build.gradle文件。

allprojects {repositories {google()jcenter()//添加这个仓库maven {// All of React Native (JS, Android binaries) is installed from npmurl "$rootDir/node_modules/react-native/android"}}
}

然后在编辑app目录下的build.gradle文件,添加React Native依赖。

   implementation 'com.facebook.react:react-native:0.50.3'

注意该版本号需要与package.json文件中配置的RN版本号保持一致。
之所以需要在项目的build.gradle文件中添加maven配置,是因为Android项目默认的依赖包的源jcenter()并不包含最新版的React Native(它只到0.20.1)。

对于ReactNative独立目录情况

与第一种情况并无太大区别,只是RN的maven仓库路径有所不同。因为通过版本控制拉取下来的工程位置各有不同,为了避免开发人员对项目目录下的build.gradle文件编辑冲突,推荐使用如下方式:

//加载local.properties配置
Properties properties = new Properties()
InputStream inputStream = project.rootProject.file('local.properties').newDataInputStream();
properties.load(inputStream)allprojects {repositories {jcenter()maven {// All of React Native (JS, Android binaries) is installed from npmurl properties.getProperty('reactnative.dir')}}
}

其中local.properties文件不需要提交版本控制,并在其中添加一个reactnative.dir属性,属性值为RN的android工程目录路径,例如在我的项目中

reactnative.dir=/Users/littlebyte/svn/ReactNative/ReactNative/node_modules/react-native/android

3.创建RN视图承载的Activity或Fragment

创建RN视图承载的Activity

public class MyReactActivity extends ReactActivity {

@Override
protected String getMainComponentName() {//该返回值需要与N程序的入口文件index.android.js中的注册的名字相同return "XXX";
}

}

创建RN视图承载的Fragment

与Activity不同,在Fragment中加载RN有点不一样。但在Android中加载RN,无论是在Activity还是Fragment,加载的都只是一个View而已。而给Fragment设置View,只需要Fragment的onCreateView返回RN的View即可。代码如下:

public class MyFragment extends Fragment {public static final String COMPONENT_NAME = "MyFragment";private ReactRootView mReactRootView;@Overridepublic void onAttach(Context context) {super.onAttach(context);mReactRootView = new ReactRootView(context);mReactRootView.startReactApplication(getReactNativeHost().getReactInstanceManager(),COMPONENT_NAME,null);}@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {super.onCreateView(inflater, container, savedInstanceState);return mReactRootView;}@Overridepublic void onDestroy() {super.onDestroy();if (mReactRootView != null) {mReactRootView.unmountReactApplication();mReactRootView = null;}if (getReactNativeHost().hasInstance()) {getReactNativeHost().getReactInstanceManager().onHostDestroy(getActivity());}}protected ReactNativeHost getReactNativeHost() {return ((ReactApplication) getActivity().getApplication()).getReactNativeHost();}public ReactInstanceManager getReactInstanceManager() {return getReactNativeHost().getReactInstanceManager();}}

而后Fragment该怎么用就怎么用。

4.修改Application

修改自定义的 Application ,实现 ReactApplication 接口。

public class MainApplication extends Application implements ReactApplication {public final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {@Overridepublic boolean getUseDeveloperSupport() {return BuildConfig.DEBUG;}@Overrideprotected List<ReactPackage> getPackages() {return Arrays.<ReactPackage>asList(new MainReactPackage());}};@Overridepublic ReactNativeHost getReactNativeHost() {return mReactNativeHost;}}

5.修改Application,添加相应的权限以及Activity声明

RN需要添加以下权限:

 <uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

除了声明自定义的Activity,还需要添加DevSettingsActivity,用来修改RN的相关设置。

  <activity android:name="com.facebook.react.devsupport.DevSettingsActivity"/>

至此,Android原生项目集成RN的工作就基本完成了。

6.调试

要调试首先需要启动RN的本地服务器。在package.json文件所在目录打开终端,运行react-native start命令即可启动本地服务器。然后安装并运行App。
如果使用模拟器调试则可以直接运行打开RN的页面,而如果使用真机调试还需要摇一摇弹出设置菜单,点击Dev Settings,设置Debug server host&port for device,填入你电脑的ip:8081即可。
之后就可以愉快的调试运行了。

在原有Android项目中快速集成React Native相关推荐

  1. Android项目中最火最常用的优秀开源项目(很有用)

    Android项目中最火最常用的优秀开源项目 分类 详细 框架名称 简介 Star 数 最近 更新 UI 刷新 SmartRefreshLayout Android 智能下拉刷新框架 7.7k 1天 ...

  2. 混合开发架构|Android工程集成React Native、Flutter、ReactJs

    混合开发架构|Android工程集成React Native.Flutter.ReactJs 架构设计说明 创建安卓原生工程 创建Flutter 集成嵌入原生工程 创建React Native 解决R ...

  3. android studio 自动生成对象,在Android Studio中快速导入可绘制对象的方法?

    在Android Studio中快速导入可绘制对象的方法? 在Android项目中的某个时候,您将需要在res/drawable目录中导入一些可绘制对象-工具栏图标,图像,UI功能. 大多数情况下,您 ...

  4. Android项目中如何用好构建神器Gradle?

    摘要:本文作者贾吉鑫为大众点评Android工程师,在进行团队并行开发时,分库遇到的问题很多都要通过Gradle脚本解决.Gradle虽为构建神器,但学习曲线比较陡峭,要想在Android项目中用好G ...

  5. android项目中在webview中打开pdf

    android项目中在webview中打开pdf. 关于android打开pdf文件方法有多种,下面的文章有详细说明: Android 实现 PDF 文件阅读功能调研 Android 使用PDF.js ...

  6. android使用webview上传文件,Android项目中如何在webview页面中上传文件

    Android项目中如何在webview页面中上传文件 发布时间:2020-11-26 15:56:27 来源:亿速云 阅读:68 作者:Leah 本篇文章为大家展示了Android项目中如何在web ...

  7. Android项目中创建编译期的注解

    ==注解 生命周期为RetentionPolicy.RUNTIME,可在运行时通过反射获取. 生命周期为RetentionPolicy.CLASS, 编译期处理的注解,可以使用APT(Annotati ...

  8. Android项目中出现的Plugin with id ‘kotlin-android‘ not found解决方法

    Android项目中出现的Plugin with id 'kotlin-android' not found解决方法 参考文章: (1)Android项目中出现的Plugin with id 'kot ...

  9. flutter打开android界面,在已有Android项目中使用Flutter

    实现效果,在已存在的android项目中接入flutter,即android调用开启flutter页面(使用android打开flutter的指定页面),flutter调用原生android方法 步骤 ...

最新文章

  1. RabbitMQ 入门系列(5)— RabbitMQ 使用场景优缺点
  2. Keras Bug 解决方法 Exception ignored in: bound method BaseSession.__del__ of
  3. Python(四)字符串
  4. 10.27 noip模拟试题
  5. 《CLR Via C# 第3版》笔记之(二十一) - 异步编程模型(APM)
  6. create 添加async和不添加的区别_六偏磷酸钠不可怕—谈谈食品添加剂中的用途
  7. 自我介绍Linux运维小白,运维面试自我介绍
  8. Timer 和TimerTask分析
  9. vmware“增强型虚拟键盘”键呈灰色不能修改状态
  10. 配置win10系统服务器失败怎么解决,windows10系统重置失败如何解决
  11. html打造动画【系列2】- 可爱的蛙蛙表情
  12. JPG图片怎么转换成Word
  13. clCreateBuffer的7种方式的异同、MapBuffer与clCreateBuffer某些方式的区别与联系
  14. 一个人必须不停地写作,才能不被茫茫人海淹没。
  15. notepad++消除生成bak文件
  16. 【方案】去哪儿网徐磊:如何利用开源技术构建日处理130亿+的实时日志平台?...
  17. Python实现灰狼优化算法(GWO)+SVR的组合预测模型
  18. 步进电机的工作原理及驱动方法
  19. 山东大学软件学院项目实训-创新实训-网络安全靶场实验平台(五)
  20. 字符串替换^和|字符

热门文章

  1. 数据结构之单链表尾插法创建-RearCreate
  2. session_onend,你到底什么时候才能激发?
  3. linux创建多个子进程,[Linux进程]使用fork函数创建多个子进程
  4. python机械臂仿真_VTK与Python实现机械臂三维模型可视化详解
  5. Quartz.net持久化与集群部署开发详解
  6. Swift之高德地图自定义标注弹出气泡样式
  7. C++编程思想重点笔记(下)
  8. Python基础(10)--数字
  9. Linux -- free 命令 内存适用状态监控
  10. ubuntu 16.04 编译 opencv_contrib 3.4, nonfree