?基于官方文檔http://reactnative.cn/docs/embedded-app-android.html#content
由于官方文檔語焉不詳,一些詳細(xì)步驟沒有配置好的話很容易植入失敗,這里工具是AS,我是在Mac上做的,,嘗試并且最終成功了。
React植入原生應(yīng)用步驟:(注意是Mac上的,windows尚未嘗試)
步驟1: ?植入前提
一個已有的、基于gradle構(gòu)建的Android應(yīng)用
Node.js,參見官方文檔了解相關(guān)的設(shè)置操作。(環(huán)境是否配置好的檢驗標(biāo)準(zhǔn)是能否成功初始化一個RN工程并運(yùn)行在手機(jī)上)
步驟2: 在App里添加依賴和權(quán)限
在App里的build.gradle文件中(不是project目錄下那個build.gradle),添加React Native依賴:
compile 'com.facebook.react:react-native:0.18.+'
盡量選擇React Native庫的最新穩(wěn)定版本。
然后,在AndroidManifest.xml里增加Internet訪問權(quán)限:
步驟3: 添加原生代碼,即以React為View的Activity
官方文檔目前是0.18版本以前的,我這里按照0.18版本的(基本一樣的,只是官方又進(jìn)一步封裝給我們用)
新建MyReactActivity,繼承ReactActivity,代碼如下。
只有三個抽象方法需要實現(xiàn),默認(rèn)是返回null,需要修改。
public class MyReactActivity? extends ReactActivity{
@Override
protected String getMainComponentName() {
return "myreactactivity";? //注冊的react組件名,一會在JS里要用到
}
@Override
protected boolean getUseDeveloperSupport() {
return BuildConfig.DEBUG; // Debug模式,這個模式才能在JS里作調(diào)試
}
@Override
protected List getPackages() {
return Arrays.asList(
new MainReactPackage()
);? //返回帶有官方已有的package的集合
}
}
由于是Activity,需要建立完畢后在AndroidManifest.xml里注冊。
此外,也要注冊另外一個開發(fā)菜單Activity(官方API),否則不能調(diào)出開發(fā)設(shè)置界面
<activity android:name=".MyReactActivity"
android:screenOrientation="portrait"
android:configChanges="keyboard|keyboardHidden|orientation|screenSize" />
<activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
步驟4: 添加React環(huán)境
打開控制臺,在當(dāng)前工程根目錄里執(zhí)行(AS直接點擊下面的控制臺就可以)
npm init
會有提示,說執(zhí)行 npm help json可以查看下面具體屬性的定義 和npm install --save可以生成包。
注意:就算有需要,也不要馬上輸入這兩個命令來做,輸了也不會有作用,因為下面已經(jīng)開始要你輸入name屬性了。
然后會要求依次輸入name,version,description,main,test command,author,license等屬性。
這是要生成的package.json里的內(nèi)容。具體該怎么填寫,建議control + C 退出當(dāng)前命令后執(zhí)行 npm help json,
然后把這個幫助說明文檔一點點全部復(fù)制下來(不大),大致看看注意要點,后面填寫時不明白的就查查看。
需要提示一點是這些屬性有的不能隨便寫,否則構(gòu)建不成功。
我的那些屬性最終如下,有些是根據(jù)自己的React模塊填寫的,有的是根據(jù)剛才那個幫助文檔填寫的。
{
"name": "myreactactivity",
"version": "0.0.1",
"description": "this is the package.json",
"main": "index.js",
"scripts": {
"start": "node_modules/react-native/packager/packager.sh" //這個是后面添加的
},
"repository": {
"type": "git",
"url": "git+https://github.com/npm/npm.git"
},
"author": "patrick",
"license": "ISC",
"bugs": {
"url": "https://github.com/npm/npm/issues"
},
"homepage": "https://github.com/npm/npm#readme",
"dependencies": {
"react-native": "^0.18.1"
}
}
然后再在控制臺里執(zhí)行
npm install --save react-native
會下載nodejs和RN等的依賴。
執(zhí)行完以后控制臺應(yīng)該不會出現(xiàn)WARN信息,若出現(xiàn)的話很可能就是構(gòu)建不成功(可以繼續(xù)往下操作步驟,不行的話就是這一步?jīng)]成功),
若的確構(gòu)建不成功,很大可能是上面的package.json的有些屬性填寫不正確。需要重新npm init。
繼續(xù)在控制臺執(zhí)行
curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig
現(xiàn)在打開新創(chuàng)建的package.json文件然后在scripts字段下添加如下內(nèi)容:
"start": "node_modules/react-native/packager/packager.sh" // 我的上面已經(jīng)有的就是在這一步添加的
步驟5: 添加JS代碼
在project目錄下(也就是package.json所在目錄)新建名為index.android.js的JS文件,在里面拷貝如下內(nèi)容
'use strict';
var React = require('react-native');
var {
Text,
View
} = React;
class myreactactivity extends React.Component {
render() {
return (
Hello, World
)
}
}
var styles = React.StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
},
hello: {
fontSize: 20,
textAlign: 'center',
margin: 10,
},
});
React.AppRegistry.registerComponent('myreactactivity', () => myreactactivity);
這就是個JS文件,會ReactJS的可以隨便寫了,只要引入的組件名對的上就好。
步驟6: 添加安卓關(guān)聯(lián)代碼
上面的新建的MyReactActivity可以設(shè)置為入口activity,也可以設(shè)置為普通activity。
如果打算設(shè)置為入口activity的話,就在清單文件里自己配置就可以,不需要額外代碼;
如果打算設(shè)置為普通acitivity,就按正常原生activity一樣配置和用代碼啟動就好。
總結(jié)一句話就是:啟動和加載這個MyReactActivity按照原生Activity一樣配置和加載就好。
步驟7: 運(yùn)行應(yīng)用
先在工程目錄下啟動JS服務(wù)器,在控制臺運(yùn)行
npm start
然后啟動APP,用AS的正常Run就可以。
第一次到MyReactActivity界面肯定是紅屏,需要搖出開發(fā)菜單設(shè)置IP和端口,然后Reload JS就行。
正常情況下現(xiàn)在可以看到Hello World了。
如果還是紅屏的話就需要看看顯示的錯誤是啥并且針對修改了。
PS:用Mac的話有個找原因的小竅門,打開Xcode(沒有的話需要下載,免費(fèi)的),在手機(jī)上運(yùn)行RN時,出錯的信息可以在Xcode上看到具體的錯誤信息。這在解決一些紅屏問題時很有用。