这一篇记录的是如何在已有的Android应用中使用React Native,在官方的文档上也有介绍:http://reactnative.cn/docs/embedded-app-android.html#content,不过这里我还是想记录一下遇到的一些坑。一步一步来说吧:

创建Android应用

这里我直接用AndroidStudio在桌面上创建了一个应用,名称为ReactNativeApp

添加React Native支持

在创建好的Android应用的build.gradle中,加入React Native的库:compile 'com.facebook.react:react-native:0.17.+',如下图所示:
在AndroidManifest.xml文件中,需要加入访问网络的权限,然后还要注册一个Activity,这个Activity是React Native用来调试应用内置的一个Activity(com.facebook.react.devsupport.DevSettingsActivity),如下图所示:
添加跟ReactNative相关的java代码,具体代码可以在上面的官方文档上找到,这里我直接把代码添加到MainActivity中了,如下代码所示:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;import com.facebook.react.LifecycleState;
import com.facebook.react.ReactInstanceManager;
import com.facebook.react.ReactRootView;
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.facebook.react.shell.MainReactPackage;public class MainActivity extends AppCompatActivity implements DefaultHardwareBackBtnHandler {private ReactRootView mReactRootView;private ReactInstanceManager mReactInstanceManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mReactRootView = new ReactRootView(this);mReactInstanceManager = ReactInstanceManager.builder().setApplication(getApplication()).setBundleAssetName("index.android.bundle").setJSMainModuleName("index.android").addPackage(new MainReactPackage()).setUseDeveloperSupport(BuildConfig.DEBUG).setInitialLifecycleState(LifecycleState.RESUMED).build();mReactRootView.startReactApplication(mReactInstanceManager, "helloworld", null);setContentView(mReactRootView);}@Overridepublic void invokeDefaultOnBackPressed() {super.onBackPressed();}@Overrideprotected void onPause() {super.onPause();if (mReactInstanceManager != null) {mReactInstanceManager.onPause();}}@Overrideprotected void onResume() {super.onResume();if (mReactInstanceManager != null) {mReactInstanceManager.onResume(this, this);}}@Overridepublic void onBackPressed() {if (mReactInstanceManager != null) {mReactInstanceManager.onBackPressed();} else {super.onBackPressed();}}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {mReactInstanceManager.showDevOptionsDialog();return true;}return super.onKeyUp(keyCode, event);}}

经过上面几个步骤,Android的代码基本上就配置好了,下面需要配置React Native相关的js代码。

添加node模块

在Windows的命令行下,进入我们第一步创建的android应用的根目录,然后依次执行下面几个命令:
npm init
npm install --save react-native
curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig

执行npm init命令时,会让你输入一大堆的参数,这些可以直接回车,命令执行完毕后,会在当前目录下生成一个package.json文件;

执行npm install --save react-native命令时,会在当前目录下添加一个node模块,这个命令执行的时间会比较长,需要耐心等待下;
第三个命令是用curl执行的,在Windows上需要先安装curl,下载地址见这里: http://pan.baidu.com/share/link?shareid=2123553377&uk=4278509670下载完成后直接解压到硬盘某个目录,然后在环境变量的path中加入curl文件的路径,就可以直接在命令行中用curl命令了,有个问题是,如果直接执行上面的curl命令,可能会报错,这里我在-o参数前面加了-k参数后才执行成功。

修改package.json文件并启动服务器

执行完上面的三个命令后,在android应用的根目录下打开package.json文件,即上面npm init生成的那个文件,然后修改成如下内容:
{"name": "helloworld","version": "0.0.1","private": true,"scripts": {"start": "node_modules/react-native/packager/packager.sh"},"dependencies": {"react-native": "^0.12.0"}
}

修改完毕后,需要在android应用的根目录下添加一个index.android.js文件,在Activity中就会加载这个js文件显示UI,在这里我们直接使用官方文档上提供的demo,内容如下:

'use strict';var React = require('react-native');
var {Text,View
} = React;class MyAwesomeApp extends React.Component {render() {return (<View style={styles.container}><Text style={styles.hello}>Hello, World</Text></View>)}
}
var styles = React.StyleSheet.create({container: {flex: 1,justifyContent: 'center',},hello: {fontSize: 20,textAlign: 'center',margin: 10,},
});React.AppRegistry.registerComponent('helloworld', () => MyAwesomeApp);

这里需要注意一点,即上面代码的最后一行,React.AppRegistry.registerComponent('helloworld', () => MyAwesomeApp);这个函数的第一个参数应该跟我们java代码中的这一句:

mReactRootView.startReactApplication(mReactInstanceManager, "helloworld", null);

对应,如果不对应,加载就会出错。

到这里就可以启动服务器了,启动服务器的命令是:npm start,不过不知道为什么,我使用这个命令报错了,服务器并没有启动,所以我直接到node_modules/react-native/packager/目录下,执行了packager.sh命令,一样可以启动服务器,其实上面的package.json中配置的start,就是执行的packager.sh命令

打包运行Android应用

到这里,我们就可以编译apk文件了,用手机连接电脑,直接在AndroidStudio中运行即可。但是如果你的APP打开,可能会直接见到一片红,如下图所示:

这时候需要配置下服务器的IP和端口,按手机的菜单键,然后选择Dev Settings选项,即出现开头我们在AndroidManifest.xml文件中配置的那个Activity,然后选择Debug sserver host & port for device那一项,在出来的对话框中,填写你的电脑的ip地址,默认端口是8081,注意:此时手机跟电脑应该在同一个局域网中。如下图所示:

这些都配置好了,就可以按菜单键,然后选择Reload JS重新加载js文件了,如果没其他问题的话,应该是可以在Activity中看到效果的,下面是一张效果图:
在使用小米手机的时候遇到一个坑:APP安装后,MIUI默认禁止了悬浮窗,导致我按菜单键时一直出不来React Native的调试对话框,这个对话框出不来就无法设置IP和端口,这里需要注意下,在应用权限管理中,应该允许我们的ReactNativeApp显示悬浮窗,如下图所示:
到这里基本上就告一段落了,在已有的Android项目中使用React Native,虽然官方文档上有详细介绍,但这个过程中依然存在很多坑,今天记录下来,希望给看到这篇博文的朋友一些帮助。

4、在已有的Android应用中使用React Native相关推荐

  1. android开发rn插件,在Android原生应用中嵌入React Native

    开发工具:Android Studio , WebStorm 参考链接:React Native官方中文文档 一.创建React Native项目 1.在本地React Native项目目录下,创建一 ...

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

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

  3. android 仿ios tabs,React Native兼容iOS Android的TabBar

    tabbar 最近着手开发的一个兼容iOS.Android的TabBar.还在不断开发中. 欢迎fork,欢迎star. :p 自己捣鼓了个E文的readme,没啥难度凑合可看. react-nati ...

  4. android 申请拍照权限,React Native模块之Permissions权限申请的实例相机

    React Native模块之Permissions权限申请的实例相机 发布时间:2020-09-03 23:49:26 来源:脚本之家 阅读:280 作者:lqh React Native模块之Pe ...

  5. android ios 混合编程,React Native与原生(Android、iOS)混编,三端痛点解析

    在做RN混编项目的时候或者面试的时候经常会遇到一些问题,总结起来有以下几种: 1.过多的注册RN组件( AppRegistry.registerComponent() ); 2.从原生跳转指定的RN页 ...

  6. Android特效(包含React Native)

    在这里提供了一些Android特效,大家可以参考一下, 带有删除按钮的dialog https://www.jianshu.com/p/9259ad7f857bToast封装 https://www. ...

  7. android 网络时区 错误,React native 安卓机器上调试代码报错:网络请求出错TypeError: Network request failed...

    React native 安卓机器上调试代码报错:网络请求出错TypeError: Network request failed 安卓机器 usb连接调试 报错信息 TypeError: Networ ...

  8. [React Native Android安利系列]搭建React Native Android环境

    欢迎大家收看react-native-android系列教程,跟着本系列教程学习,可以熟练掌握react-native-android的开发,你值得拥有 https://segmentfault.co ...

  9. Mac打包Android的apk,[Mac][React Native][Android] 打包成apk

    一旦把app写好之后,最后一个步骤就是打包成apk啰 文档中会提到keytool,gradlew assembleRelease. Android打包APK Android 把包成一个APK主要需要几 ...

最新文章

  1. iOS FMDB之FMDatabaseQueue(事物与非事物)
  2. 从user 登陆開始
  3. [Spring Cloud Task]6 Spring Batch批处理应用设计原则
  4. python 柱形图_python绘制双柱形图代码实例
  5. as it exceeds the max of 500KB._IT狂人第一季 | 如何考察员工
  6. Java 9:Process API的增强
  7. spring的基本知识
  8. 我的世界java版如何装mod_我的世界考古“初代贝爷生存”?开局3滴血,还没进游戏就要自闭了...
  9. 物联网火爆,开发者却遇到这个大难题!
  10. EasyUi datagrid列表增加复选框
  11. 不玩游戏,何谈人生!
  12. 【BZOJ 3669】 [Noi2014]魔法森林 LCT维护动态最小生成树
  13. 快速下载【百度文库】文档
  14. 利用python调用谷歌翻译API
  15. wow修改人物模型_人物修改教程更仔细
  16. Python实现输出100以内的质数
  17. jasperReports导出PDF字体加粗等样式失效问题
  18. Anaconda 添加清华镜像源
  19. html 抓取移动,网页采集提取数据教程,以自定义抓取方式为例 - 八爪鱼采集器...
  20. java 纳秒_如何在Java 8中使用Date API达到精确的纳秒精...

热门文章

  1. __builtin_expect的作用
  2. #Mac为什么会成为程序员的首选?程序员为什么都想要一台Mac?
  3. 缺件待料怎么办,如何实现精益生产?
  4. linux删除文件_【Linux实战】Vim编辑器和恢复ext4下误删除的文件
  5. 一条很长很长的路...
  6. 2年功能测试月薪9.5K,100多天自学自动化,跳槽涨薪4k后我的路还很长...
  7. c++之静态数据成员与静态成员函数
  8. 经济型EtherCAT运动控制器(九):示波器使用
  9. 程序员和烟民之间的猿粪!吸烟有害健康,少抽为妙。。。
  10. 工业级串口编程利器:Pcomm lite 串口库介绍 (Pcomm.dll)