如何在原有Android项目中快速集成React Native详解

前言

RN经过一段时间发展,已经有充分数量的人尝试过了,就我身边就有几批,褒贬也不一:

① 做UI快

② 还是有很多限制,不如原生Native

③ 入门简单,能让前端快速开发App

④ iOS&Android大部分代码通用

⑤ code-push能做热更新,但是用不好依旧坑

......

在得到一些信息后,可以看出,要用RN高效率的做出比较不错的App是有可能的,单看投入度与最初设计是否合理,而且现在关于React Native的各种文档是相当丰富的,所以这个阶段想切入RN可能是一个不错的选择。

众所周知对于现有的大多数项目来说都不是从头构建的,而要在原有项目的基础上引入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 npm
   url "$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 npm
   url 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;
  @Override
  public void onAttach(Context context) {
    super.onAttach(context);
    mReactRootView = new ReactRootView(context);
    mReactRootView.startReactApplication(
        getReactNativeHost().getReactInstanceManager(),
        COMPONENT_NAME,
        null);
  }
  @Nullable
  @Override
  public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    return mReactRootView;
  }
  @Override
  public 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) {
    @Override
    public boolean getUseDeveloperSupport() {
      return BuildConfig.DEBUG;
    }
    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
          new MainReactPackage()
      );
    }
  };
  @Override
  public 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即可。

之后就可以愉快的调试运行了。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

您可能感兴趣的文章:

  • Windows下React Native的Android环境部署及布局示例
  • Android原生嵌入React Native详解
  • Android React Native原生模块与JS模块通信的方法总结
  • Android Rreact Native 常见错误总结
  • react-native 封装选择弹出框示例(试用ios&android)
  • Android原生项目集成React Native的方法
(0)

相关推荐

  • Android React Native原生模块与JS模块通信的方法总结

    Android React Native原生模块与JS模块通信的方法总结 前言: 在做React Native开发的时候避免不了的需要原生模块和JS之间进行数据传递,这篇文章将向大家分享原生模块向JS传递数据的几种方式. 方式一:通过Callbacks的方式 说起Callbacks大家都不陌生,它是最常用的设计模式之一.无论是Java,Object-c,C#,还是JavaScript等都会看到Callbacks的身影. 原生模块支持Callbacks类型的参数,该Callbacks对应JS中的f

  • Android Rreact Native 常见错误总结

    Android Rreact Native 常见错误总结 1.invariant violation:expected a component class,got[object object] 创建自定义组件首字母要大写,否则会报错. 2.Module 0 is not a registered callable module. 将gradle升级成最新版本(cd Android 进入android目录执行:sudo ./gradlew clean) 或者通过android studio工具升级

  • Android原生嵌入React Native详解

    1.首先集成的项目目录 我使用的是直接按照react-native init Project 的格式来导入的,也就是说,我的Android项目目录是跟node_modules是在一个目录下的. 我们init完项目之后,项目初始化完成了,这时候我们可以用命令react-native run-android直接运行项目,至于怎么调试,之前已经说过. 说一下我们怎么开发和运行分开吧,我们开发一般会选择webstrom,开发后我们会Android和ios的编译分开. 启动npm 下面说一下android

  • Android原生项目集成React Native的方法

    开发环境准备 首先按照开发环境搭建教程来安装React Native在安卓平台上所需的一切依赖软件(比如npm). 在应用中添加JS代码 在项目的根目录中运行: $ npm init $ npm install --save react react-native $ curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig npm init创建了一个空的node模块

  • react-native 封装选择弹出框示例(试用ios&android)

    在开发 App 的时候,经常会使用到对话框(又叫消息框.提示框.告警框). 在web开发中经常会用得到.今天就来介绍了一下react-native 封装弹出框 之前看到react-native-image-picker中自带了一个选择器,可以选择拍照还是图库,但我们的项目中有多处用到这个选择弹出框,所以就自己写了一下,最最重要的是ios和Android通用.先上动态效果图~ 一.封装要点 1.使用动画实现弹框布局及显示隐藏效果 2.通过一个boolean值控制组件的显示隐藏 3.弹框选项数组通过

  • Windows下React Native的Android环境部署及布局示例

    搭建基础环境 JDK(必须,不解释) SDK(建议使用Android Studio,集成SDK以及模拟器) genymotion(如果是使用真机或者Android Studio自带的模拟器,可以选择不装) NVM(node版本控制器,需要node4.0以上版本) 以上配置不是必须,可自行选择适合自己的环境,部分安装过程可能会涉及到翻墙,需要配置代理 配置踩坑记录 genymotion 这里选择genymotion模拟器来讲解,也会提一下Android Studio自带的模拟器的一些注意点,使用真

  • 如何在原有Android项目中快速集成React Native详解

    前言 RN经过一段时间发展,已经有充分数量的人尝试过了,就我身边就有几批,褒贬也不一: ① 做UI快 ② 还是有很多限制,不如原生Native ③ 入门简单,能让前端快速开发App ④ iOS&Android大部分代码通用 ⑤ code-push能做热更新,但是用不好依旧坑 ...... 在得到一些信息后,可以看出,要用RN高效率的做出比较不错的App是有可能的,单看投入度与最初设计是否合理,而且现在关于React Native的各种文档是相当丰富的,所以这个阶段想切入RN可能是一个不错的选择.

  • 如何在IDEA中快速解决Jar冲突详解

    目录 一.为什么会产生Jar包冲突? 1.1 直接与传递依赖 1.2 Maven 的传递依赖 1.3 Maven 如何解决版本冲突? 1.4 覆盖传递依赖版本 1.5 使用直接依赖覆盖传递依赖版本 二.通过IDEA快捷解决依赖冲突 2.1 查找冲突 2.2 发现冲突 2.3 解决冲突 一.为什么会产生Jar包冲突? 作为 Java 开发人员,我们可能会使用 Maven 维护许多应用程序以进行依赖项管理.这些应用程序需要不时升级以保持最新状态并添加新功能或安全更新. 由于某些依赖项之间的冲突,这个

  • Android 开发中使用Linux Shell实例详解

    Android 开发中使用Linux Shell实例详解 引言 Android系统是基于Linux内核运行的,而做为一名Linux粉,不在Android上面运行一下Linux Shell怎么行呢? 最近发现了一个很好的Android Shell工具代码,在这里分享一下. Shell核心代码 import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.

  • 关于在IDEA中SpringBoot项目中activiti工作流的使用详解

    记录一下工作流的在Springboot中的使用,,顺便写个demo,概念,什么东西的我就不解释了,如有问题欢迎各位大佬指导一下. 1.创建springboot项目后导入依赖 <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>6.0.0</version&

  • Springboot项目中使用redis的配置详解

    程序结构: 一.配置 1. 在pom.xml中添加依赖 pom.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&q

  • Echart图表在项目中的前后端使用详解

    目录 前言 一.项目架构 二.进入Echart官网学会自我分析 2.1 Echart官方文档 2.2 Echart基础代码常识 三,折线图使用 3.1 基础折线图 3.2 平滑折线图 3.3 面积折线图 3.4 炫酷组合图 前言 图表在我们的项目中可以帮我们很明确的看到我们想要看到的数据,并且通过操控图表,可以很快获得你想要的信息,在b站上同学们看见一些炫酷的可视化图表时否觉得好炫酷,好牛逼.一看这个项目就很nb,现在临近毕业设计阶段,学会如何使用Echart图表,或许会让你的项目打动老师,也会

  • Vue 项目中Echarts 5使用方法详解

    目录 前言 创建项目 基本使用 安装 使用方法 柱状图 动态排序柱状图 前言 Echarts 是一个纯JavaScript的图表库,兼容绝大部分的浏览器,底层依赖轻量级的canvas类库ZRender,提供直观,生动,可交互,可高度个性化定制的数据可视化图表. 创建项目 先使用vue-cli创建一个新的项目,配置按照自己的需要选择,默认的也可 vue create vue_echarts cd vue_echarts npm run serve 基本使用 安装 首先安装echarts npm i

  • Android Handler中的休眠唤醒实现详解

    目录 Handler中的奇奇怪怪 Linux相关 eventfd 相关操作 eventfd demo Epoll epoll API int epoll_create(int size) int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout) epoll 使用

  • iOS 项目中的version和build 详解

    iOS 项目中的version和build Version在plist文件中的key是"CFBundleShortVersionString",标识应用程序的发布版本号,和AppStore上的版本号保持一致.该版本的版本号是三个分隔的整数组成的字符串.第一个整数代表重大修改的版本,如实现新的功能或重大变化的修订.第二个整数表示的修订,实现较突出的特点.第三个整数代表维护版本 Build在plist文件中的key是"CFBundleVersion",标示(发布或者未发

  • Android编程中的消息机制实例详解

    本文实例讲述了Android编程中的消息机制.分享给大家供大家参考,具体如下: 在分析Android消息机制之前,我们先来看一段代码: public class MainActivity extends Activity implements View.OnClickListener { private TextView stateText; private Button btn; @Override public void onCreate(Bundle savedInstanceState)

随机推荐