(最新react-native-0.59.5) 如何将ReactNative项目集成到现有得Android项目中(两种实现方法之一)
背景:最近在学习React-Native相关的知识,有个需求,如果已经存在一个成熟的Android 或者 IOS项目,如何实现在后续的开发中用RN来实现部分功能。再此我只是讲解一下Android demo的两种实现方法。
一· 官方实现(以RN项目为主体,将已有Android项目copy进来)
虽说是官方推荐实现,最开始我也是按照上面的教程,一步一步搭建环境,但是上面的内容有些更新不及时,而且有些坑,上面还有提及,所以在这里总结说明一下需要注意的地方,避免大家再次入坑。
1.准备工作
首先,环境搭建,可以参考React Native中文网 0.59来安装一些依赖的软件
2.创建 React Native项目目录结构
创建一个空目录用于存放React Native项目,在其中创建一个”/android"子目录,将你现有的Android项目,放到这个子目录中
3. 安装 JavaScript 依赖包
a. 在项目跟目录下创建文件 ”package.json",了解package.json, 添加如下内容
每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称、版本、许可证等元数据)。npm install命令根据这个配置文件,自动下载所需的模块,也就是配置项目所需的运行和开发环境。
{"name": "android_with_rn","version": "1.0.0","description": "","main": "index.js","scripts": {"test": "echo \"Error: no test specified\" && exit 1","start": "node node_modules/react-native/local-cli/cli.js start"},"author": "","license": "ISC","dependencies": {"react": "^16.8.6","react-native": "^0.59.5"}
}
b. 然后,在当前项目目录(包含package.json)中,打开终端/命令提示行,通过npm(node 包管理工具)来安装React和React Native模块,运行命令“npm install”,这些模块会被安装根目录的“node_modules"目录中(这个目录我们原则上不复制、不移动、不修改、不上传,随用随装)
把node_modules/目录记录到.gitignore文件中(即不上传到版本控制系统,只保留在本地)。
npm install --save react react-native
4. 配置Maven
a. 在已经存在的Android 项目的app build.gradle 文件添加 React Native 依赖:
- 如果想要指定特定的 React Native 版本,可以用具体的版本号替换 +,当然前提是你从 npm 里下载的是这个版本。
- 注意该版本号需要与package.json文件中配置的RN版本号保持一致。
之所以需要在项目的build.gradle文件中添加maven配置,是因为Android项目默认的依赖包的源jcenter()并不包含最新版的React Native(它只到0.20.1)
dependencies {...implementation "com.facebook.react:react-native:+" // From node_modules.}
b. 在已经存在的Android 项目的 build.gradle 文件添加 React Native 的 Maven 依赖的入口,必须写在 “allprojects” 代码块中
allprojects {repositories {maven {url "$rootDir/node_modules/react-native/android"}jcenter()google()}
}
5. 配置权限
a. 在 AndroidManifest.xml 添加权限声明:
<uses-permission android:name="android.permission.INTERNET" />
如果需要访问 DevSettingsActivity 界面(即开发者菜单),则还需要在 AndroidManifest.xml 中声明下面权限,开发者菜单一般仅用于在开发时从 Packager 服务器刷新 JavaScript 代码,所以在正式发布时你可以去掉这一权限。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
b. Android6.0 及以上需要添加动态权限申请悬浮窗权限(overlay)
public class MainActivity extends AppCompatActivity {static final int OVERLAY_PERMISSION_REQ_CODE = 1000;private AppCompatButton mBtnRn;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initEvent();}private void initEvent() {initView();checkAppPermission();}@SuppressLint("WrongViewCast")private void initView() {mBtnRn = findViewById(R.id.btn_rn);mBtnRn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//跳转RN页面startActivity(new Intent(MainActivity.this, BaseRnActivity.class));}});}private void checkAppPermission() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (!Settings.canDrawOverlays(this)) {Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,Uri.parse("package:" + getPackageName()));startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);}}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == OVERLAY_PERMISSION_REQ_CODE) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {if (!Settings.canDrawOverlays(this)) {//SYSTEM_ALERT_WINDOW被拒绝}}}}
}
6. 集成RN 代码
a. 创建一个index.js文件(注意在 0.49 版本之前是 index.android.js 文件)
index.js是 React Native 应用在 Android 上的入口文件。而且它是不可或缺的!它可以是个很简单的文件,简单到可以只包含一行require/import导入语句。本教程中为了简单示范,把全部的代码都写到了index.js里(当然实际开发中我们并不推荐这样做)。
Index.js
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}>RN 项目</Text></View>);}
}
var styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',},hello: {fontSize: 20,textAlign: 'center',margin: 10,},
});AppRegistry.registerComponent('Android_With_RN', () => HelloWorld);
b. 应用中添加一个RCTRootView。这个RCTRootView正是用来承载你的 React Native 组件的容器。
注意1:官方推荐不是最新版本,最新RN(0.59.5)不需要自己实DefaultHardwareBackBtnHandler,只要集成ReactActivity,最新版本0.59.5 ,在ReactActivity中,已经帮我们实现了ReactRoot与ReactInstanceManager的配置
public class MyReactActivity extends ReactActivity {@Nullable@Overrideprotected String getMainComponentName() {return "Android_With_RN";}@Overrideprotected ReactActivityDelegate createReactActivityDelegate() {return new ReactActivityDelegate(this,getMainComponentName());}
}
我们需要在AndroidManifest.xml 把 MyReactActivity 的主题设定为 Theme.AppCompat.Light.NoActionBar ,因为里面有许多组件都使用了这一主题。
<activityandroid:name=".MyReactActivity"android:label="@string/app_name"android:theme="@style/Theme.AppCompat.Light.NoActionBar">
</activity>
c. 实现ReactApplication
注意2:这一点和React Native中文网没有提到
public class MainApplication extends Application implements ReactApplication {private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {@Overridepublic boolean getUseDeveloperSupport() {return BuildConfig.DEBUG;}@Overrideprotected String getJSMainModuleName() {return "index";}@Overrideprotected List<ReactPackage> getPackages() {return Arrays.<ReactPackage>asList(new MainReactPackage());}};@Overridepublic ReactNativeHost getReactNativeHost() {return mReactNativeHost;}@Overridepublic void onCreate() {super.onCreate();SoLoader.init(this, /* native exopackage */ false);}
}
在AndroidManifest 配置MainApplication
<applicationandroid:name=".MainApplication"...
</application>
d. 在 Android Studio 中打包
你也可以使用 Android Studio 来打 release 包!其步骤基本和原生应用一样,只是在每次编译打包之前需要先执行 js 文件的打包(即生成离线的 jsbundle 文件)。具体的 js 打包命令如下:
注意:bundle文件路径,把上述命令中的路径替换为你实际项目的路径。如果 assets 目录不存在,则需要手动的在app/src/main/目录中添加一个assets目录。
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest app/src/main/res/
–platform : 平台(android/ios)
–dev : 开发模式
–entry-file : 条目文件
–bundle-output : bundle文件生成的目录
–assets-dest : 资源文件生成的目录
如果打包成功,会显示
Loading dependency graph, done.
bundle: start
bundle: finish
bundle: Writing bundle output to: app/src/main/assets/index.android.bundle
bundle: Done writing bundle output
7. 运行
在RN运行命令,运行到android设备中
react-native run-android
未完待续 下一篇讲解 另一种实现方式点我
(最新react-native-0.59.5) 如何将ReactNative项目集成到现有得Android项目中(两种实现方法之一)相关推荐
- React Native 0.59.0 发布,使用 React 编写原生应用
React Native 0.59.0 发布了.React Native 使开发者只使用 JavaScript 也能编写原生移动应用. 新版更新亮点: React Hooks React Native ...
- React Native 0.59.x新特性解读
概述 众所周知,在现在的前端技术开发栈中,跨平台开发是一个重要的课题,不管是老牌的Hybird还是最近流行的RN.Weex还是Flutter,不得不说,现在前端和客户端的界限越来越模糊. 最近在写&l ...
- React Native 0.50版本新功能简介
React Native在2017年经历了众多版本的迭代,从本人接触的0.29版本开始,到前不久发布的0.52版本,React Native作为目前最受欢迎的移动跨平台方案.虽然,目前存在着很多的功能 ...
- 余承东吐槽苹果续航;微软 IE 浏览器被曝漏洞;React Native 0.61.0 发布 | 极客头条...
快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...
- 苹果收购英特尔手机芯片业务;西门子将在华建立 5G 研发中心;React Native 0.60.4 发布 | 极客头条...
快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...
- React Native 0.20官方入门教程
最近对React Native比较有兴趣,简单把官网的入门例子做了一下,发现了很多坑,特别是watchman版本过低的问题,导致总是运行不起来.所以 这里特别下载了最新的watchman,进行了源码编 ...
- 9月27日科技资讯|余承东吐槽苹果续航;贾扬清担任阿里巴巴开源技术委员会负责人;React Native 0.61.0 发布
「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流. 整理 | 胡 ...
- 爱奇艺回应遭做空;百度 App 部分频道停更;React Native 0.62 发布 | 极客头条
整理 | 屠敏 头图 | CSDN 下载自东方 IC 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 一分钟 ...
- React Native 0.44.3 ----------微信h5支付
本篇记录ios使用ReactNative完成微信h5支付的一些注意事项. a. 支付完成或者取消微信h5支付,会跳转到手机默认的浏览器中(safari),无法回到原App. b. 如何获得支付状态?? ...
最新文章
- 经常用得到的安卓数据库基类
- 抽象工厂与工厂模式例子
- mysql多列索引不全用,MySQL多列索引的生效规则
- 支持全球探测点的新一代网站监控
- idea 新建一个spring项目
- ab plc编程软件_三菱PLC原装和高仿怎么区分?仿真和编程软件一样吗?
- c++直角坐标系与极坐标系的转换_平面向量的奇技淫巧——斜坐标系的一系列低级研究...
- php时间调用最简单的,PHP调用时间通过引用不可避免?
- munin mysql_munin 监控 mysql 2种方法
- Maigo的KM算法讲解
- UVA 10003 Cutting Sticks (区间dp)
- 配置 Ubuntu 字符界面启动
- raspberry pi4B ncnn cpu vulkan benchmark
- Linux添加开机自启、开机自动运行命令、开机启动项的两种方法
- 网络游戏开发实战-坦克大战学习问题记录
- 鸡啄米:C++编程入门系列之目录和总结http://www.jizhuomi.com/software/129.html
- 边缘检测、导数与边缘、什么是梯度
- 表空间相关命令及查询SQL
- 黑产系列01-如何发现黑产情报
- 【入门数据分析】淘宝用户行为分析
热门文章
- html上下两个箭头符号怎么打出来,电脑箭头符号怎么打出来(往返箭头符号图案)...
- 如何合理地制定项目管理计划?
- [E17264-15]Oracle® Database 2 Day + Real Application Clusters Guide 11g Release 2 (11.2)之六
- 软件测试真的干不到35岁吗?那咋办呢...我36了...
- python dataframe取行列_dataframe取元素方法总结
- 网页引入腾讯视频小记
- Vue项目性能优化方案
- Android原生界面添加水印
- Robotics: Computational Motion Planning(路径规划)笔记(一):基于图搜索的方法-Grassfire、Dijkstra和A*算法
- 1.4 计算机专业高级教程(计算机安全防护知识)