已有Android項(xiàng)目集成RN

開篇一張圖,后面全靠編


1.配置ReactNative的js環(huán)境

在Android項(xiàng)目根目錄下輸入命令npm init (直接在Android studio的terminal命令窗口就行)

? 我們可以看到init讓你生成一個(gè)package.json文件唁毒,根據(jù)實(shí)際情況填寫的配置參數(shù)(也可以從已有的RN項(xiàng)目中拷貝package.json放大Android

? 項(xiàng)目根目錄下)?

當(dāng)前最新rn是0.56蒜茴,但是運(yùn)行時(shí)有報(bào)錯(cuò),建議使用0.55.4

? 如果是命令生成的package.json還需要手動(dòng)添加啟動(dòng)命令浆西,接下來還需要把啟動(dòng)腳本放進(jìn)去

? ????"scripts": {

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

? ?????????????"test": "jest"

? ? ? ?},

這樣我們就可以時(shí)時(shí)的調(diào)用本地調(diào)試服務(wù)進(jìn)行熱加載

2.添加ReactNative

接下來我們將React粉私、ReactNative添加到項(xiàng)目中:

npm install --save react react-native

完成后會(huì)在Android項(xiàng)目中多出一個(gè)node_modules文件夾,里面存放了下載好的React 和React Native和根據(jù)package.json生成的一些配置(也可以從已有的RN項(xiàng)目中拷貝近零,但不建議)

3.安裝完成之后诺核,我們?cè)偃ヅ渲?flowconfig,這個(gè)是對(duì)js代碼做約束的秒赤,建議配置(也可以不配置)猪瞬。

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

4.添加ReactNative依賴到Android項(xiàng)目

在app的build.gradle引入以下依賴

api "com.facebook.react:react-native:+"

在項(xiàng)目根目錄build.gradle添加依賴倉(cāng)庫地址

allprojects {

?repositories {? ? ? ?

?? ?…? ?

?? ? ? ? maven {?

? ? ????????????????? // All of React Native (JS, Android binaries) is installed from npm?

? ? ? ? ?????????????url "$rootDir/node_modules/react-native/android"? ? ?

????????? ?}?

? ? }?

}

這里maven路徑官網(wǎng)上寫的是rootDir/../nodemodules/react?native/android,而我們?yōu)榱朔奖鉇S編譯入篮,直接放在項(xiàng)目根目錄配置RN的陈瘦,所以這里的路徑要改成上面這樣

為了防止findbugsbug問題,建議在app/build.gradle中增加下面的代碼:

android {

? ? //...

? ? configurations.all {

? ? ? ? resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.0'

? ? }

}

5.添加權(quán)限

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

/**設(shè)置調(diào)試 的權(quán)限**/

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

<uses-permission android:name="android.permission.SYSTEM_OVERLAY_WINDOW" />

添加debug模式Activity(正式打包注釋掉就好了)

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

6.添加ReactNative界面

首先我們?cè)贏ndroid項(xiàng)目根目錄添加index.android.js,這個(gè)文件作為RN的入口文件潮售。

(也可以是其他名稱痊项,需要在實(shí)現(xiàn)ReactApplication接口時(shí)重寫getJSMainModuleName和getBundleAssetName)

7.添加RN Activity界面

(1).在較老的RN版本中,我們新建一個(gè)Activity實(shí)現(xiàn)DefaultHardwareBackBtnHandler接口

@Override

? ? protected void onCreate(Bundle savedInstanceState) {

? ? ? ? super.onCreate(savedInstanceState);

? ? ? ? mReactRootView = new ReactRootView(this);

? ? ? ? mReactInstanceManager = ReactInstanceManager.builder()

? ? ? ? ? ? ? ? .setApplication(getApplication())

? ? ? ? ? ? ? ? .setBundleAssetName("index.android.bundle")

? ? ? ? ? ? ? ? .setJSMainModuleName("index.android")//對(duì)應(yīng)index.android.js

? ? ? ? ? ? ? ? .addPackage(new MainReactPackage())

? ? ? ? ? ? ? ? .setUseDeveloperSupport(BuildConfig.DEBUG)

? ? ? ? ? ? ? ? .setInitialLifecycleState(LifecycleState.RESUMED)

? ? ? ? ? ? ? ? .build();

? ? ? ? // 注意這里的HelloWorld必須對(duì)應(yīng)“index.android.js”中的

? ? ? ? // “AppRegistry.registerComponent()”的第一個(gè)參數(shù)

? ? ? ? mReactRootView.startReactApplication(mReactInstanceManager, "ReactNativeDemo", null);

? ? ? ? setContentView(mReactRootView);

? ? }

(2).較新的RN版本酥诽,例如RN0.55 我們直接繼承ReactActivity即可

public class ReactNativeDemoActivity extends ReactActivity{

private static final String MAIN_COMPONENT = "ReactNativeDemo";

/** * 返回在index.android.js 中注冊(cè)的組件名

* @return

*/ @Nullable

@Override

protected String getMainComponentName() {

????????return MAIN_COMPONENT;

????}

}

在原生界面上添加一個(gè)入口跳轉(zhuǎn)到ReactNativeDemoActivity即可

? 實(shí)現(xiàn)DefaultHardwareBackBtnHandler接口的方式鞍泉,可以局部添加RN的組件mAndroidLayout.addView(mReactRootView);

8.自定義的Application實(shí)現(xiàn)ReactApplication接口

public class MainApplication extends Application implements ReactApplication {

private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {

????????????????@Override

????????????????protected boolean getUseDeveloperSupport() {

????????????????????????????return BuildConfig.DEBUG;

????????????????}

????????@Override protected List getPackages() {

????????????????return Arrays.<ReactPackage>asList( new MainReactPackage());

????????}

};

????@Override

????public ReactNativeHost getReactNativeHost() {

????????????return mReactNativeHost;

????????}

}

9.最后不要忘了在AndroidManifest中添加:

注意需要AppCompat的主題

<activity

? android:name=".ReactNativeDemoActivity"

? android:theme="@style/Theme.AppCompat.Light.NoActionBar"

/>

10.運(yùn)行項(xiàng)目

1)debug模式,可以不打離線包肮帐,實(shí)時(shí)看到j(luò)s修改后的效果

? ? 先啟動(dòng)服務(wù) npm start

? ? 然后直接運(yùn)行Android項(xiàng)目(注意在RN設(shè)置界面綁定電腦的ip端口)

2)release模式

? ? 在你打包你的發(fā)布版本之前要?jiǎng)?chuàng)建一個(gè)bundle文件咖驮,這個(gè)bundle文件會(huì)創(chuàng)建在項(xiàng)目的assets目錄中,并且這個(gè)文件會(huì)包含在你的apk包中训枢,

? ? 在你的項(xiàng)目根目錄中運(yùn)行:

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/

index.android.js是剛創(chuàng)建的RN界面入口js的名稱托修,后面的輸出目錄根據(jù)自己項(xiàng)目對(duì)應(yīng)修改,例如在項(xiàng)目根目錄新建一個(gè)bundle目錄存放bundle文件恒界,命令就是這樣了:

react-native bundle --platform android --entry-file index.android.js --bundle-output ./bundles/index.android.bundle --dev false

下一篇講解?客戶端如何更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睦刃,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子十酣,更是在濱河造成了極大的恐慌涩拙,老刑警劉巖际长,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異兴泥,居然都是意外死亡工育,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門郁轻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翅娶,“玉大人,你說我怎么就攤上這事好唯〗吣” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵骑篙,是天一觀的道長(zhǎng)蜕提。 經(jīng)常有香客問我,道長(zhǎng)靶端,這世上最難降的妖魔是什么谎势? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮杨名,結(jié)果婚禮上脏榆,老公的妹妹穿的比我還像新娘。我一直安慰自己台谍,他們只是感情好须喂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趁蕊,像睡著了一般坞生。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上掷伙,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天是己,我揣著相機(jī)與錄音,去河邊找鬼任柜。 笑死卒废,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宙地。 我是一名探鬼主播升熊,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绸栅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起页屠,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤粹胯,失蹤者是張志新(化名)和其女友劉穎蓖柔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體风纠,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡况鸣,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了竹观。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片镐捧。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖臭增,靈堂內(nèi)的尸體忽然破棺而出懂酱,到底是詐尸還是另有隱情,我是刑警寧澤誊抛,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布列牺,位于F島的核電站,受9級(jí)特大地震影響拗窃,放射性物質(zhì)發(fā)生泄漏瞎领。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一随夸、第九天 我趴在偏房一處隱蔽的房頂上張望九默。 院中可真熱鬧,春花似錦宾毒、人聲如沸驼修。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邪锌。三九已至,卻和暖如春癌瘾,著一層夾襖步出監(jiān)牢的瞬間觅丰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工妨退, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留妇萄,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓咬荷,卻偏偏與公主長(zhǎng)得像冠句,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幸乒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評(píng)論 25 707
  • 劉林靜是本次的期終考試中退步比較大的一個(gè)學(xué)生懦底,在考試前,我曾批評(píng)過她罕扎,是因?yàn)槲野l(fā)現(xiàn)好幾次我進(jìn)班的時(shí)候聚唐,她都...
    殷德靜閱讀 561評(píng)論 0 0
  • 說好了不睡 可還是悠然睡去 就這樣 在我的夢(mèng)里 你悄悄地走了 沒給我挽留的機(jī)會(huì) 只把太多的美好 留在我的記憶 是曲...
    天邊那朵白云閱讀 125評(píng)論 2 4
  • 作者:俊世太保 來源:九枝蘭網(wǎng)絡(luò)營(yíng)銷 號(hào)稱“不缺錢”的今日頭條卻進(jìn)行了新一輪融資客峭,而這背后則是今日頭條的競(jìng)爭(zhēng)對(duì)手從...
    Sting閱讀 919評(píng)論 0 8
  • 文/迎風(fēng)奔跑 2017.12.25 星期一 晴天 2017八月份中旬在哥哥的引領(lǐng)下桃笙,下載了簡(jiǎn)書氏堤,加入簡(jiǎn)書這個(gè)大家...
    c迎風(fēng)奔跑閱讀 350評(píng)論 11 12