React Native 與 Android 通信

本篇內容同樣和React Native 與 原生App有關,可以說更加深入了兩者之間的感情,為培養下一代做出準備:React Native與原生App的通信交互。

Android系統為我們提供了webview來加載網頁,同樣為了讓webview加載的網頁可以與App交互,同樣提供了一套機制幫助我們更方便的實現通信。為了實現React Native與原生App之間的通信,FB也實現了自己的一套交互機制。

(1) RCTDeviceEventEmitter 事件方式

(2) Callback 回調方式

(3) Promise

三種方式各具不同優缺點

1.RCTDeviceEventEmitter

優點:可任意時刻傳遞,Native主導控制。

2.Callback

優點:JS調用,Native返回。

缺點:CallBack為異步操作,返回時機不確定

3.Promise

優點:JS調用,Native返回。

缺點:每次使用需要JS調用一次

了解了三者的通信方式,怎么能少了代碼的描述!我們來看看代碼如何實現。大致的實現步驟如下:

(1)定義Module類,繼承 ReactContextBaseJavaModule

在Module類中,我們定義交互的方法,例如RN調用Native的方法,Native調用RN的方法等。

(2)定義Package類,繼承 ReactPackage

實現Package的 createNativeModules 方法,將Module實例添加到集合。

(3)定義Application,繼承ReactApplication

實現 getPackages方法 , 將Package實例添加到 getPackages 下的集合。

1.Module類中的核心代碼

名稱可以自定義,對接時協商好即可。

在module中定義一個方法,并用@ReactMethod 注解標注:表明該方法會被RN調用。即被RN調用的原生方法必須使用@ReactMethod注解標注。

注意: RN層調用Native層進行界面跳轉時,需要設置FLAG_ACTIVITY_NEW_TASK標志 ,否則會出現如下錯誤:

上面代碼定義了原生方法,通過在Android層調用RN層。使用ReactContext的getJSModule方法,emit來發送消息。同樣,emit的第一個參數要與RN層中addListener方法的第一個參數相同。

2.自定義Package的核心代碼

在createNativeModules方法中,初始化集合,并將module實例添加進集合,返回集合實例。

3.Application核心代碼

在getPackages方法中,將Package實例添加到Arrays中即可完成注冊。

以上就是Android層核心代碼配置,繼續來看React Native層核心代碼:

1.調用原生代碼

在React Native層,通過NativeModules調用commModule,繼而調用原生方法即可。 注意:commModule要與Module類的getNames方法返回的名稱對應。

2. 接收原生調用

通過DeviceEventEmitter注冊監聽,類似于Android中的監聽事件。第一個參數標識名稱,要與Module中emit的Event Name相同。第二個參數即為處理回掉。

3.界面代碼

在Text中注冊單擊事件,RN層調用原生代碼,跳轉到撥號界面。

4.Android層調用RN的代碼

調用Module中定義的nativeCallRn方法,繼而出發RN層代碼。以上就是通過 RCTDeviceEventEmitter 模式進行通信交互。可以很清晰的看出,交互都是以主動方式為主。

RN中剩下的兩種通信方式,存在一個共同的特點:

從RN層調用Native層,Native層處理完成后,回調RN層

直接看代碼實現:

(1)Callback

同樣還是在Module類中定義交互方法:

RN中定義回調:

(2)Promise

Module類中定義交互方法:

RN中定義回調:

布局中觸發單擊事件:

最終效果:

Android調用React Native:

React Native調用Android:

 

 

來自:http://blog.csdn.net/u013718120/article/details/55506238

 

 本文由用戶 Christy4166 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!