React-Native之Android:植入原生應(yīng)用

?基于官方文檔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上看到具體的錯誤信息。這在解決一些紅屏問題時很有用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容