簡述RN集成到Android原生項(xiàng)目

最近一段時(shí)間比較忙,也沒時(shí)間梳理下自己的學(xué)習(xí)筆記单料,隔了好久也不知道要整理些什么出來扳躬,剛好最近在整理下React Native相關(guān)的東東,所以在此記錄下留作筆記使用糖儡。(在這就不描述Android項(xiàng)目和RN項(xiàng)目環(huán)境如何搭建了伐坏。)

一、Android項(xiàng)目集成RN

  1. 新建普通Android項(xiàng)目
    新建一個(gè)普通的Android項(xiàng)目即可握联,打開Android Studio -> File -> New -> New Project... 按步驟執(zhí)行即可桦沉。

  2. 在項(xiàng)目根目錄下引入React Native模塊
    在AS中的Terminal中輸入npm init ,輸入一些項(xiàng)目的描述屬性(默認(rèn)一路回車也行)每瞒,為了生成·文件的項(xiàng)目描述,根據(jù)提示來填寫就好了,生成的json文件內(nèi)容大致如下:

    {
          "name": "rnappdemo",
          "version": "1.0.0",
          "description": "test",
          "main": "index.js",
          "scripts": {
            "start": "node node_modules/react-native/local-cli/cli.js start",
            "test": "no"
          },
          "repository": {
            "type": "git",
            "url": "no"
          },
          "keywords": [
            "no"
          ],
          "author": "liu",
          "license": "ISC",
          "dependencies": {
            "react": "^16.5.2",
            "react-native": "^0.55.4"
          }
        }
    
  3. 引入rn的一些模塊文件

    npm install --save react react-native
    

    會(huì)在根目錄生成一個(gè)node_modules文件夾纯露,存的是RN的一些模塊文件独泞,如果在這個(gè)過程中出現(xiàn)require react@某.某.某版本, but none was installed ,那么就使用命令
    npm i -S react@某.某.某版本//此處為提示的版本號(hào).
    注意:如何安裝React Native指定版本,命令如:npm install --save react-native@0.55.4 苔埋,這里建議使用因?yàn)樽钚掳姹臼褂每赡軙?huì)出錯(cuò)懦砂,稍微比新版低個(gè)版本,我這里沒用最新版组橄,使用的是0.55.4荞膘。
    如何查看當(dāng)前rn版本信息:npm info React-native

  4. 引入.flowconfig文件

    • 方法一:.flowconfig文件可以從facebook的github上復(fù)制,然后在工程的根目錄創(chuàng)建.flowconfig文件玉工,將其內(nèi)容復(fù)制進(jìn)去即可羽资。
    • 方法二:在Terminal中執(zhí)行以下命令:
      curl -o .flowconfig https://raw.githubusercontent.com/facebook/react-native/master/.flowconfig
      
  5. 接下來打開package.json文件,在scripts模塊下添加遵班,如上步驟2顯示屠升。
    "start": "node node_modules/react-native/local-cli/cli.js start"

  6. 在項(xiàng)目根目錄下的build.gradle添加以下配置

    allprojects {
          repositories {
              jcenter()
              maven {
                  url "https://maven.google.com"
              }
              maven {
                  // All of React Native (JS, Android binaries) is installed from npm
                  url "$rootDir/node_modules/react-native/android"http://此處目錄請額外注意
              }
          }
      }
    
  7. 在app下的build.gradle -> dependencies 添加以下依賴:

    compile "com.facebook.react:react-native:+" // From node_modules.
    

    同時(shí)在android -> defaultConfig 中添加
    ndk{ abiFilters "armeabi-v7a","x86"}
    完整如下:

       defaultConfig {
                applicationId "com.liujc.rnappdemo"
                minSdkVersion 16
                targetSdkVersion 27
                versionCode 1
                versionName "1.0"
                testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
                ndk{
                    abiFilters "armeabi-v7a","x86"
                }
            }
    
  8. AndroidManifest.xml 清單文件中聲明網(wǎng)絡(luò)權(quán)限:

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

    如果需要訪問 DevSettingsActivity 界面(即開發(fā)者菜單),則還需要在 AndroidManifest.xml 中聲明:

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

二狭郑、編寫RN代碼運(yùn)行到Android項(xiàng)目中

  1. 在根目錄下創(chuàng)建index.android.js文件:

    'use strict';
    import React, { Component } from 'react';
    import {
     AppRegistry,
     StyleSheet,
     Text,
     NativeModules,
     View,
     ToastAndroid,
     DeviceEventEmitter
    } from 'react-native';
    let title = 'React Native界面';
    
    class reactNative extends Component {
    
    /**加載完成*/
    componentWillMount() {
      let result = NativeModules.MyNativeModule.Constant;
      console.log('原生端返回的常量值為:' + result);
    }
    
    /**
    * 原生調(diào)用RN
    */
    componentDidMount() {
       DeviceEventEmitter.addListener('nativeCallRn',(msg)=>{
            title = "React Native界面,收到數(shù)據(jù):" + msg;
            ToastAndroid.show("發(fā)送成功", ToastAndroid.SHORT);
       })
    }
    render() {
    return (
      <View style={styles.container}>
        <Text style={styles.welcome} >
            {title}
        </Text>
    
        <Text style={styles.instructions}>
          To get started, edit index.android.js
        </Text>
    
        <Text style={styles.instructions}>
          Double tap R on your keyboard to reload,{'\n'}
          Shake or press menu button for dev menu
        </Text>
    
        <Text style={styles.welcome}>
          我是RN界面!
        </Text>
      </View>
    );
     }
    }
    const styles = StyleSheet.create({
     container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
     },
     welcome: {
    fontSize: 20,
    textAlign: 'center',
    margin: 10,
     },
     instructions: {
       textAlign: 'center',
    color: '#333333',
    marginBottom: 5,
     },
    });   
    AppRegistry.registerComponent('reactNative', () => reactNative);
    
  2. 在Terminal中執(zhí)行啟動(dòng)命令
    npm run start 或者 yarn start//默認(rèn)啟動(dòng)端口為8081腹暖,后面會(huì)描述如何修改端口號(hào).
    啟動(dòng)完成后出現(xiàn)如下界面:

    ┌──────────────────────────────────────────────   ────────────────────────────────┐
    │                                                                              │
    │  Running Metro Bundler on port 8081.                                         │
    │                                                                              │
    │  Keep Metro running while developing on any JS projects. Feel free to   
    │
    │  close this tab and run your own Metro instance if you prefer.               │
    │                                                                              │
    │  https://github.com/facebook/react-native                                    │
    │                                                                              │
    └──────────────────────────────────────────────────────────────────────────────┘
    
    Looking for JS files in
    E:\workspace\WsForRN\RNAppDemo\RNAppDemo
    
    Metro Bundler ready.
    
    Loading dependency graph, done.
    

    然后在瀏覽器中輸入http://localhost:8081/index.android.bundle 訪問沒有報(bào)錯(cuò),則說明啟動(dòng)成功.

  3. 在Application里面添加如下代碼:

    public class AppApplication extends Application implements ReactApplication {
     private static AppApplication instance;
     @Override
     public void onCreate() {
         super.onCreate();
         instance = this;
         SoLoader.init(this, false);
     }
     
     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()
             );
         }
     };
    
     /**
      * 獲取Application實(shí)例
      */
     public static AppApplication getInstance() {
         return instance;
     }
     @Override
     public ReactNativeHost getReactNativeHost() {
         return mReactNativeHost;
     }
    }
    
  4. 在對應(yīng)Activity中添加如下代碼:

    public class MyRNActivity extends ReactActivity {
     @Override
     protected String getMainComponentName() {
         return "reactNative";//此處容器名要與index.android.js里面注冊的控件名一致
     }
    }
    
  5. 記得把Application和對應(yīng)的Activity在AndroidManifest.xml中注冊使用翰萨。運(yùn)行APP即可加載RN界面脏答。
    備注:設(shè)備要和服務(wù)端在同一局域網(wǎng)下調(diào)試,即鏈接同一WiFi或者設(shè)備鏈接電腦的代理亩鬼。


到此僅記錄Android原生集成RN項(xiàng)目的方法殖告,即初級技能,稍后整理下稍微升級點(diǎn)的技能雳锋,清單如下:

  1. Android原生與RN如何交互通信
  2. RN使用Android原生控件或自定義組件
  3. RN預(yù)加載實(shí)現(xiàn)
  4. React Native Linking與 Android原生頁面路由跳轉(zhuǎn)實(shí)現(xiàn)
  5. RN項(xiàng)目拆包和熱更新
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末黄绩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子玷过,更是在濱河造成了極大的恐慌爽丹,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件冶匹,死亡現(xiàn)場離奇詭異习劫,居然都是意外死亡咆瘟,警方通過查閱死者的電腦和手機(jī)嚼隘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袒餐,“玉大人飞蛹,你說我怎么就攤上這事谤狡。” “怎么了卧檐?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵墓懂,是天一觀的道長。 經(jīng)常有香客問我霉囚,道長捕仔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任盈罐,我火速辦了婚禮榜跌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盅粪。我一直安慰自己钓葫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布票顾。 她就那樣靜靜地躺著础浮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奠骄。 梳的紋絲不亂的頭發(fā)上豆同,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音含鳞,去河邊找鬼诱告。 笑死,一個(gè)胖子當(dāng)著我的面吹牛民晒,可吹牛的內(nèi)容都是我干的精居。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼潜必,長吁一口氣:“原來是場噩夢啊……” “哼靴姿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磁滚,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤佛吓,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后垂攘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體维雇,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年晒他,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吱型。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陨仅,死狀恐怖津滞,靈堂內(nèi)的尸體忽然破棺而出铝侵,到底是詐尸還是另有隱情,我是刑警寧澤触徐,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布咪鲜,位于F島的核電站,受9級特大地震影響撞鹉,放射性物質(zhì)發(fā)生泄漏疟丙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一鸟雏、第九天 我趴在偏房一處隱蔽的房頂上張望隆敢。 院中可真熱鬧,春花似錦崔慧、人聲如沸拂蝎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽温自。三九已至,卻和暖如春皇钞,著一層夾襖步出監(jiān)牢的瞬間悼泌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工夹界, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馆里,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓可柿,卻偏偏與公主長得像鸠踪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子复斥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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