react-native和原生通信之Android篇(第一彈)

在用react-native開發(fā)應用中,和原生通信是一個非常重要的事情。rn的模塊包裝不可能面面俱到,直接用別的造好的輪子又有很多的不可控性,所以掌握和原生通信是非常重要的技能。今天先以官方的Toast為例簡單介紹下Android開發(fā)的和原生通信。

一·實現(xiàn)Toast模塊

首先我們需要創(chuàng)建一個原生模塊類,該原生模塊類是繼承ReactContextBaseJavaModule類的Java代碼,該用來實現(xiàn)JavaScript所需的一些功能。我們的目標是使用JavaScript代碼通過調用ToastAndroid.show('Awesome',ToastAndroid.SHORT)方法進行再屏幕上面顯示一個toast消息提醒。

package com.demo;

import android.widget.Toast;

import com.facebook.react.bridge.ReactApplicationContext;

import com.facebook.react.bridge.ReactContextBaseJavaModule;

import com.facebook.react.bridge.ReactMethod;

import java.util.HashMap;

import java.util.Map;

public class ToastCustomModule extends ReactContextBaseJavaModule {

private static final String DURATION_SHORT="SHORT";

private static final String DURATION_LONG="LONG";

public ToastCustomModule(ReactApplicationContext reactContext) {

super(reactContext);

}

}

然后繼承ReactContextBaseJavaModule類之后,要求子類去實現(xiàn)一個getName()方法。該方法用于返回一個字符串信息,用來代表JavaScript前端使用這個模塊。這邊我們返回信息為"ToastCustomAndroid"用來代表給模塊。這樣我們在前端就可以用JavaScript通過React.NativeModules.ToastCustomAndroid訪問到這個模塊了。

@Override

public String getName() {

return"ToastCustomAndroid";

}

getConstants該給JavaScript提供一些可以使用常量

@Override

public Map getConstants() {

final Map constants =newHashMap<>();

constants.put(DURATION_SHORT, Toast.LENGTH_SHORT);

constants.put(DURATION_LONG, Toast.LENGTH_LONG);

returnconstants;

}

最后在寫一個方法,需要添加@ReactMethod注解,用于給JavaScript進行調用。該橋接方法的返回類型必須要為void。React Native中的橋接通信是異步形式的,所以如果需要返回值給JavaScript必須需要通過回調方法或者事件發(fā)送。

@ReactMethod

public void show(String message, int duration) {

Toast.makeText(getReactApplicationContext(), message, duration).show();

}

二·模塊注冊

package com.modules.custom;

import com.facebook.react.ReactPackage;

import com.facebook.react.bridge.JavaScriptModule;

import com.facebook.react.bridge.NativeModule;

import com.facebook.react.bridge.ReactApplicationContext;

import com.facebook.react.uimanager.ViewManager;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

public class AnToastReactPackage implements ReactPackage {

@Override

public List createNativeModules(ReactApplicationContext reactContext) {

List modules =newArrayList<>();

modules.add(newToastCustomModule(reactContext)); ?

returnmodules;

}

@Override

public List> createJSModules() {

returnCollections.emptyList();

}

@Override

public List createViewManagers(ReactApplicationContext reactContext) {

returnCollections.emptyList();

}

}

接下來,上面自定義的packager需要在MainApplication.java中的getPackagers方法中進行添加(具體路徑:android/app/src/main/java/com/your-app-name/MainApplication.java)。

好了到這里一個簡單例子已經完成,你可以在你的代碼中使用這個模塊了

?import { NativeModules } ?from 'react-native');

onPress={()=>NativeModules.ToastCustomAndroid.show("我是ToastCustomAndroid彈出消息",NativeModules.ToastCustomAndroid.SHORT)}

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容