React Native & Android集成

前端之家收集整理的这篇文章主要介绍了React Native & Android集成前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在一个现有的APP里集成ReactNative. 都是杂碎时间搞的,写的流程有些乱。。。。

1. 新建一个项目

在Android studio 里直接创建一个空工程(这里方便测试可以先把项目的目录改成android), 在app的依赖里面添加React Native的依赖:

  1. dependencies {
  2. compile fileTree(dir: "libs",include: ["*.jar"])
  3. compile "com.android.support:appcompat-v7:23.0.1"
  4. compile "com.facebook.react:react-native:+" // From node_modules
  5. }

然后在AndroidManifest.xml加入访问网络权限:

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

为了让项目支持调试RN,需要在AndroidManifest.xml里面加入RN的DevSettingsActivity,如下:

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

由于ReactNative的minSdkVersion为16,所以有可能需要在Manifest里添加

  1. <uses-sdk tools:overrideLibrary="com.facebook.react" />

修改MainActivity,如下:

  1. public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler{
  2.  
  3. private ReactRootView mReactRootView;
  4. private ReactInstanceManager mReactInstanceManager;
  5.  
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9.  
  10. mReactRootView = new ReactRootView(this);
  11. mReactInstanceManager = ReactInstanceManager.builder()
  12. .setApplication(getApplication())
  13. .setBundleAssetName("index.android.bundle")
  14. .setJSMainModuleName("index.android")
  15. .addPackage(new MainReactPackage())
  16. .setUseDeveloperSupport(BuildConfig.DEBUG)
  17. .setInitialLifecycleState(LifecycleState.RESUMED)
  18. .build();
  19. mReactRootView.startReactApplication(mReactInstanceManager,"HelloWorld",null);
  20.  
  21. setContentView(mReactRootView);
  22. }
  23.  
  24. @Override
  25. public void invokeDefaultOnBackPressed() {
  26. super.onBackPressed();
  27. }
  28.  
  29. @Override
  30. protected void onPause() {
  31. super.onPause();
  32.  
  33. if (mReactInstanceManager != null) {
  34. mReactInstanceManager.onPause();
  35. }
  36. }
  37.  
  38. @Override
  39. protected void onResume() {
  40. super.onResume();
  41.  
  42. if (mReactInstanceManager != null) {
  43. mReactInstanceManager.onResume(this,this);
  44. }
  45. }
  46.  
  47. @Override
  48. public void onBackPressed() {
  49. if (mReactInstanceManager != null) {
  50. mReactInstanceManager.onBackPressed();
  51. } else {
  52. super.onBackPressed();
  53. }
  54. }
  55.  
  56. @Override
  57. public boolean onKeyUp(int keyCode,KeyEvent event) {
  58. if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
  59. mReactInstanceManager.showDevOptionsDialog();
  60. return true;
  61. }
  62. return super.onKeyUp(keyCode,event);
  63. }
  64.  
  65. }

setBundleAssetName先不用管。后面离线打包的时候会用到。
PS:其实可以认为是ReactNative提供了一个FrameLayout。这样就很容易理解了。

在工程上一级目录下执行npm init,指定name等属性自动创建package.json文件
在工程上一级目录下新建一个index.android.js文件

  1. 'use strict';
  2.  
  3. import React,{
  4. Text,View
  5. } from 'react-native';
  6.  
  7. class ReactNativeProject extends React.Component {
  8. render() {
  9. return (
  10. <View style={styles.container}>
  11. <Text style={styles.hello}>Hello,World</Text>
  12. <Text>我来自ReactNative</Text>
  13. </View>
  14. )
  15. }
  16. }
  17. var styles = React.StyleSheet.create({
  18. container: {
  19. flex: 1,justifyContent: 'center',},hello: {
  20. fontSize: 20,textAlign: 'center',margin: 10,});
  21.  
  22. React.AppRegistry.registerComponent('HelloWorld',() => ReactNativeProject);

在项目上一级目录执行npm install --save react-native,这条命令会在目录下生成node_modules文件夹并添加react-native的npm依赖(千万不要用cnpm,唉说多了都是泪。。。)。

在项目上一级目录下执行:

  1. curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig

在上面生成的package.json中的scripts里面添加一行:

  1. "start": "node node_modules/react-native/local-cli/cli.js start"

例如:

  1. {
  2. "name": "react-demo","version": "1.0.0","description": "","main": "index.js","scripts": { "start": "node node_modules/react-native/local-cli/cli.js start","test": "echo \"Error: no test specified\" && exit 1" },"author": "","license": "ISC","dependencies": { "react-native": "^0.39.2" } }

code目录

首先启动RN的npm本地服务:

  1. react-native run-android

然后运行就可以了。。。

经试验 如果Android项目的目录名字不是android的话,会提示没有找到Android工程Android project not found. Maybe run react-native android first? .这时候只能先执行react-native startadb reverse tcp:8081 tcp:8081,然后使用Android studio run(或者./gradlew assembleDebug)安装在手机。以后更新摇一摇手机reload一下就OK了,同样不需要再编译apk了。

如果需要在Android studio里面来安装的话,就会提示”Could not get BatchedBridge….”,即RN找不到要加载的包,需要手动执行:

  1. react-native start
  2. adb reverse tcp:8081 tcp:8081

react-native start
adb reverse tcp:8081 tcp:8081

关于离线打包:

react-native bundle –platform android –dev false –entry-file index.android.js –bundle-output android/app/src/main/assets/index.android.bundle –assets-dest android/app/src/main/res

一条命令就可以打包到指定的目录,就不需要在依赖于服务端了
React Native 优先请求服务端(localhost)的连接,否则去assets里面找,如果还是没有找到才会报错。

关于代码结构的优化

在Native + RN的混合工程中,希望写的代码都在Android项目目录下,比较好维护。就是说要把index.android.js等自己写的js还有资源放在Android工程目录下。关于node_modules目录,如果也放在Android工程下,由于文件太多,AS都能卡死掉,,,所以想要的目录节后为:

  1. ├── node_modules
  2. ├── android_proj
  3. ├── app
  4. ├── build..
  5. ├── src..
  6. └── build.gradle
  7. ├── index.android.js
  8. ├── rnjs..

调整成这样的目录后,使用`react-native start 启动服务,手机上提示404,RN的packager在默认的目录中没有找到入口js文件。在启动服务时需要添加一个目录。

  1. react-native start --root android_proj

link=>
https://www.zhangningning.com.cn/blog/Android/android_react_native.html

猜你在找的React相关文章