4、在已有的Android应用中使用React Native
这一篇记录的是如何在已有的Android应用中使用React Native,在官方的文档上也有介绍:http://reactnative.cn/docs/embedded-app-android.html#content,不过这里我还是想记录一下遇到的一些坑。一步一步来说吧:
创建Android应用
添加React Native支持
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模块
npm init
npm install --save react-native
curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig
执行npm init命令时,会让你输入一大堆的参数,这些可以直接回车,命令执行完毕后,会在当前目录下生成一个package.json文件;
修改package.json文件并启动服务器
{"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);
对应,如果不对应,加载就会出错。
打包运行Android应用
这时候需要配置下服务器的IP和端口,按手机的菜单键,然后选择Dev Settings选项,即出现开头我们在AndroidManifest.xml文件中配置的那个Activity,然后选择Debug sserver host & port for device那一项,在出来的对话框中,填写你的电脑的ip地址,默认端口是8081,注意:此时手机跟电脑应该在同一个局域网中。如下图所示:
4、在已有的Android应用中使用React Native相关推荐
- android开发rn插件,在Android原生应用中嵌入React Native
开发工具:Android Studio , WebStorm 参考链接:React Native官方中文文档 一.创建React Native项目 1.在本地React Native项目目录下,创建一 ...
- flutter打开android界面,在已有Android项目中使用Flutter
实现效果,在已存在的android项目中接入flutter,即android调用开启flutter页面(使用android打开flutter的指定页面),flutter调用原生android方法 步骤 ...
- android 仿ios tabs,React Native兼容iOS Android的TabBar
tabbar 最近着手开发的一个兼容iOS.Android的TabBar.还在不断开发中. 欢迎fork,欢迎star. :p 自己捣鼓了个E文的readme,没啥难度凑合可看. react-nati ...
- android 申请拍照权限,React Native模块之Permissions权限申请的实例相机
React Native模块之Permissions权限申请的实例相机 发布时间:2020-09-03 23:49:26 来源:脚本之家 阅读:280 作者:lqh React Native模块之Pe ...
- android ios 混合编程,React Native与原生(Android、iOS)混编,三端痛点解析
在做RN混编项目的时候或者面试的时候经常会遇到一些问题,总结起来有以下几种: 1.过多的注册RN组件( AppRegistry.registerComponent() ); 2.从原生跳转指定的RN页 ...
- Android特效(包含React Native)
在这里提供了一些Android特效,大家可以参考一下, 带有删除按钮的dialog https://www.jianshu.com/p/9259ad7f857bToast封装 https://www. ...
- android 网络时区 错误,React native 安卓机器上调试代码报错:网络请求出错TypeError: Network request failed...
React native 安卓机器上调试代码报错:网络请求出错TypeError: Network request failed 安卓机器 usb连接调试 报错信息 TypeError: Networ ...
- [React Native Android安利系列]搭建React Native Android环境
欢迎大家收看react-native-android系列教程,跟着本系列教程学习,可以熟练掌握react-native-android的开发,你值得拥有 https://segmentfault.co ...
- Mac打包Android的apk,[Mac][React Native][Android] 打包成apk
一旦把app写好之后,最后一个步骤就是打包成apk啰 文档中会提到keytool,gradlew assembleRelease. Android打包APK Android 把包成一个APK主要需要几 ...
最新文章
- iOS FMDB之FMDatabaseQueue(事物与非事物)
- 从user 登陆開始
- [Spring Cloud Task]6 Spring Batch批处理应用设计原则
- python 柱形图_python绘制双柱形图代码实例
- as it exceeds the max of 500KB._IT狂人第一季 | 如何考察员工
- Java 9:Process API的增强
- spring的基本知识
- 我的世界java版如何装mod_我的世界考古“初代贝爷生存”?开局3滴血,还没进游戏就要自闭了...
- 物联网火爆,开发者却遇到这个大难题!
- EasyUi datagrid列表增加复选框
- 不玩游戏,何谈人生!
- 【BZOJ 3669】 [Noi2014]魔法森林 LCT维护动态最小生成树
- 快速下载【百度文库】文档
- 利用python调用谷歌翻译API
- wow修改人物模型_人物修改教程更仔细
- Python实现输出100以内的质数
- jasperReports导出PDF字体加粗等样式失效问题
- Anaconda 添加清华镜像源
- html 抓取移动,网页采集提取数据教程,以自定义抓取方式为例 - 八爪鱼采集器...
- java 纳秒_如何在Java 8中使用Date API达到精确的纳秒精...
热门文章
- __builtin_expect的作用
- #Mac为什么会成为程序员的首选?程序员为什么都想要一台Mac?
- 缺件待料怎么办,如何实现精益生产?
- linux删除文件_【Linux实战】Vim编辑器和恢复ext4下误删除的文件
- 一条很长很长的路...
- 2年功能测试月薪9.5K,100多天自学自动化,跳槽涨薪4k后我的路还很长...
- c++之静态数据成员与静态成员函数
- 经济型EtherCAT运动控制器(九):示波器使用
- 程序员和烟民之间的猿粪!吸烟有害健康,少抽为妙。。。
- 工业级串口编程利器:Pcomm lite 串口库介绍 (Pcomm.dll)