【React Native開發】React Native移植原生Android項目(4)

轉載請標明出處:前端

http://blog.csdn.net/developer_jiangqq/article/details/50519677
java

本文出自:【江清清的博客】node


()前言       

       【好消息】我的站點已經上線執行,後面博客以及技術乾貨等精彩文章會同步更新,請你們關注收藏:http://www.lcode.orgreact

         前三節課程咱們已經對於React Native For Android的環境搭建。IDE安裝配置以及應用執行。調試相關的知識點作了解說。今天咱們來說一個很是實用的知識點。android

移植咱們已有的原生Android項目到React Native中。git

         剛建立的React Native技術交流3羣(496508742),React Native技術交流4羣(458982758),請不要反覆加羣!歡迎各位大牛,React Native技術愛好者加入交流!同一時候博客左側歡迎微信掃描關注訂閱號,移動技術乾貨,精彩文章技術推送!github

在React Native中React事實上不少其它關注的是視圖View層。因此React Native自己也支持並且可以讓咱們很是easy方便的移植一個Android原生的項目到React Native中。npm

()前提準備工做 

          ①.首先咱們有一個採用Gradle構建的Android應用項目,這個你們直接採用Android Studio進行建立一個項目就能夠。我這邊新建一個文件夾TestHello。而後採用Android Studio建立一個android項目在該文件夾如下。詳細例如如下:json

          ②.電腦必須安裝Node.js。詳細安裝用法(點擊進入)react-native

()Android項目相關配置

        2.1 在咱們Android項目的build.gradle中加入React Native依賴,而後同步。詳細代碼例如如下:

compile 'com.facebook.react:react-native:0.17.+'

[注意].該會同步0.17版本號以上的react native,官方的版本號仍是停留在0.13沒有更新,我本地的reactnative0.17版本號的,因此你們這邊配置必定要跟本身本地的版本號保持一致或者更新。

關於這個問題今天我下午研究了一下去,踩了很是多坑啊~~ 只是ReactNative中文網那邊我已經讓站長更新了版本號。

        2.2緊接着咱們需要在項目AndroidManifest.xml中加入網絡訪問權限

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

該只用於開發階段從開發server載入最細的JavaScript代碼,在正式公佈版本號中,假設有需要可以把該網絡權限刪掉。

()加入原生代碼

         在Android項目的MainActivity中,咱們需要配置相關代碼來進行啓動執行React Native庫。

咱們需要建立ReactRootView,而後在裏邊渲染React引用,並且設置成Activity的主視圖就能夠。

詳細代碼例如如下:

public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {
    privateReactRootView mReactRootView;
    privateReactInstanceManager mReactInstanceManager;
 
    @Override
    protectedvoid onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
 
       mReactRootView = new ReactRootView(this);
       mReactInstanceManager = ReactInstanceManager.builder()
               .setApplication(getApplication())
               .setBundleAssetName("index.android.bundle")
               .setJSMainModuleName("index.android")
               .addPackage(new MainReactPackage())
               .setUseDeveloperSupport(BuildConfig.DEBUG)
               .setInitialLifecycleState(LifecycleState.RESUMED)
               .build();
       mReactRootView.startReactApplication(mReactInstanceManager, "TestHello",null);
 
       setContentView(mReactRootView);
    }
 
    @Override
    publicvoid invokeDefaultOnBackPressed() {
       super.onBackPressed();
    }
}

       注意如下的代碼:

mReactRootView.startReactApplication(mReactInstanceManager,"TestHello", null);

        以上當中方法另一種個參數我這邊採用TestHello來進行命名了,注意這個要和後面講到的東西進行統一,詳細咱們繼續往下看。

       在React Native中,事實上FB給咱們提供了ReactInstanceManger來替咱們管理Activity相關的生命週期。因此咱們需要傳遞一些Actitivty相關的生命週期到ReactInstanceManger中。詳細代碼onPause()和onResume()方法例如如下:

@Override
    protectedvoid onPause() {
       super.onPause();
 
        if(mReactInstanceManager != null) {
           mReactInstanceManager.onPause();
        }
    }
    @Override
    protectedvoid onResume() {
       super.onResume();
 
        if(mReactInstanceManager != null) {
            mReactInstanceManager.onResume(this,this);
        }
    }

     緊接着對於返回button鍵的事件咱們也需要傳遞一下:

@Override
 public void onBackPressed() {
    if(mReactInstanceManager != null) {
       mReactInstanceManager.onBackPressed();
    } else {
       super.onBackPressed();
    }
}

      這樣咱們就可以當用戶按下返回鍵的時候,javaScript代碼可以作相關處理。固然假設前端不處理響應的事件。那麼會回調到上面的invokeDefaultOnBackPressed()方法中。繼而回退事件轉移到Activity了,如下就是Activity該怎麼樣執行。就怎麼樣執行了。默認事件就是關閉Activity了

         最後一步就是需要處理一下設備菜單了。默認狀況下咱們可以搖晃一下手機來彈出菜單,但是對於模擬器,該方法就不適用了。因此咱們才攔截事件方法進行相關處理一下就能夠。

@Override
public boolean onKeyUp(int keyCode, KeyEvent event){
    if(keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) {
       mReactInstanceManager.showDevOptionsDialog();
       return true;
    }
    return super.onKeyUp(keyCode, event);
}

到此爲止咱們的Android項目Activity和配置文件以及完畢了最主要的配置方法了。

()加入js

        如下咱們採用命令行。首先切換到項目的根文件夾上面(個人樣例是切換到TestHello文件夾下)

         5.1.命令行執行npm init 執行截圖例如如下:


該命令會建立一個package.json文件。並且提示咱們輸入一些信息,默認不輸入就能夠,只是name必需要爲全英文小寫哦,詳細結果執行結果例如如下:


   5.2.命令行執行npm install  --save react-native  進行安裝react native模塊以及相關node模塊。執行截圖例如如下:


 這裏開始安裝node模塊以及react native模塊,詳細執行結果會生成node_module文件夾例如如下:


5.3.最後執行例如如下命令就能夠:

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

作一下flow配置


        以上三步全部完畢了,上面給咱們建立node模塊,而後加入了react-native npm依賴。接下來咱們需要改動package.json文件。在scripts標籤那邊加入例如如下代碼:

"start":"node_modules/react-native/packager/packager.sh"

詳細改動截圖例如如下:


5.4.現在咱們建立一下文件命名爲:index.android.js,而後在裏邊加入例如如下代碼:

'use strict';
var React = require('react-native');
var {
  Text,
  View
} = React;
 
class MyAwesomeApp extends React.Component {
  render() {
    return (
     <View style={styles.container}>
       <Text style={styles.hello}>Hello, World</Text>
     </View>
    )
  }
}
var styles = React.StyleSheet.create({
  container:{
    flex: 1,
    justifyContent:'center',
  },
  hello: {
    fontSize:20,
   textAlign: 'center',
    margin:10,
  },
});
 
React.AppRegistry.registerComponent('TestHello', ()=> TestHello);

         以上就完畢了全部的相關代碼以及react-native配置了,注意上面的都採用TestHello了。但願你們都用同樣的名字和前面MainActivity進行統一哦。

()執行APP

         上面的配置步驟全部完畢了,如下咱們要執行APP了。首先咱們需要開啓開發server。使用例如如下命令就能夠:

npm start

執行結果例如如下:


        接下來就是最後一步了,直接執行react-native run-android命令編譯執行應用就可以了,執行結果例如如下:


這樣就完畢了一個簡單的Android原生項目移植到ReactNative中了。

()最後總結

          今天移植Android原生項目移植到React Native中。期間也遇到了很是多問題,好比因爲官網的文檔沒有保持最新,後來通過排查踩坑才發現。你們有問題可以加一下羣React Native技術交流羣(282693535)或者底下進行回覆一下。

          尊重原創,轉載請註明:From Sky丶清(http://blog.csdn.net/developer_jiangqq) 侵權必究!

          關注個人訂閱號(codedev123),天天分享移動開發技術(Android/IOS),項目管理以及博客文章!(歡迎關注,第一時間推送精彩文章)

關注個人微博,可以得到不少其它精彩內容

相關文章
相關標籤/搜索