1. 程式人生 > >混合開發之Android原生載入ReactNative頁面

混合開發之Android原生載入ReactNative頁面

這片文章主要記錄一下Android原生載入ReactNative頁面的方法,和上一篇混合開發之ReactNative呼叫Android原生方法可作為上下篇食用
首先還是大概的講一下流程:
1、Androidstudio新建Android專案,命令列執行npm init,把專案初始化成RN專案
2、執行npm install –save react react-native 安裝react和react-native,這裡要注意一下react-native的版本問題,在使用0.56.0版本的時候,專案編譯會出問題,建議使用其他版本,比如0.55.4
3、Android目錄下的build.gradle引入

dependencies {
    compile "com.facebook.react:react-native:+"
        ...
}

Project目錄下的build.gradle引入

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            //這裡要注意路徑 不要寫錯!!!切記
            url "$rootDir/node_modules/react-native/android"
        }
    }

}

新增完之後,專案先編譯一遍
4、在Project目錄下新建index.android.js檔案,編寫ReactNative程式碼
5、在Project目錄下的scr/main中新建assets資料夾,並且在命令列中輸入

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

這裡也要注意路徑,不要寫錯
6、MainActivity繼承ReactActivity返回模組名字
7、自定義MyApplication繼承Application實現ReactApplication
8、執行,看效果
這裡寫圖片描述

下面看具體步驟:
1、初始化 npm init
並且在生成的package.json檔案中新增下面一行

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

修改完的package.json

{
  "name": "hydemo2",
  "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.4.2",
    "react-native": "^0.55.4"
  }
}

這裡寫圖片描述

2、安裝react和指定版本的react-native

npm install --save react-native@0.55.4
npm install --save react

3、Android目錄下的build.gradle引入

dependencies {
    compile "com.facebook.react:react-native:+"
        ...
}

Project目錄下的build.gradle引入

allprojects {
    repositories {
        google()
        jcenter()
        maven {
            //這裡要注意路徑 不要寫錯!!!切記
            url "$rootDir/node_modules/react-native/android"
        }
    }

}

這裡寫圖片描述
這裡寫圖片描述

4、在Project目錄下新建index.android.js檔案,編寫ReactNative程式碼

這裡寫圖片描述

import React from 'react';
import {
  AppRegistry,
  StyleSheet,
  Text,
  View
} from 'react-native';

class HelloWorldApp extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.hello}>Hello world! I222 am from ReactNattive!!</Text>
      </View>
    )
  }
}
var styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
  },
  hello: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
  },
});

AppRegistry.registerComponent('hydemo2', () => HelloWorldApp);

5、在Project目錄下的scr/main中新建assets資料夾,並且在命令列中輸入

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output app/src/main/assets/index.android.bundle --assets-dest app/src/main/res
//解釋一下都什麼意思
react-native bundle 
--platform android  //平臺型別
--dev false //是否是開發
--entry-file index.android.js //輸入
--app/src/main/assets/index.android.bundle //輸出  
--assets-dest app/src/main/res  //資原始檔

這裡寫圖片描述
這裡寫圖片描述
6、MainActivity繼承ReactActivity返回模組名字

package com.android.sjq.hydemo2;

import com.facebook.react.ReactActivity;

import javax.annotation.Nullable;

public class MainActivity extends ReactActivity {

    @Nullable
    @Override
    protected String getMainComponentName() {
        //專案名字
        return "hydemo2";
    }
}

7、自定義MyApplication繼承Application實現ReactApplication

package com.android.sjq.hydemo2;

import android.app.Application;

import com.facebook.react.ReactApplication;
import com.facebook.react.ReactNativeHost;
import com.facebook.react.ReactPackage;
import com.facebook.react.shell.MainReactPackage;

import java.util.Arrays;
import java.util.List;

public class MyApplication extends Application implements ReactApplication {
    private 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;
    }

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

8、完成,執行
還有一個Android和RN混合開發的demo,需要的可以下載參考,demo包含了
1、Android載入RN頁面
2、Android呼叫RN函式
3、RN呼叫Android函式
傳送門