摘要:是一個抽象類,是用來被調用對象的父類,我們需要一些的方法。新版本使用替換是設置相關配置的類。首先實現新建一個的實例并添加的實例實現中調用在顯示這樣就完成了從中直接調用了中定義的方法。
有的時候我們使用React Native無法滿足一些使用特定場景,這個時候就需要使用原生的Android方法,比如一些耗時的寫操作,操作數據庫或者多線程操作等。
React Native可以直接調用系統的API(java方法),實現JavaScript與java語言的通訊,如果React Native中沒有滿足我們需求的Api,可以封裝原生的方法提供JavaScript調用。
JavaScript和java通信是通過bridge實現的,在java層和JavaScript層的bridge分別存有相同的一份模塊配置表。Java與JavaScript相互通信時,通過bridge里的配置表將所調用模塊方式轉為{moduleID,methodID,args}的形式傳遞給處理層,處理層通過bridge里的配置表找到對應的方法執行,如果有callback,則回傳給調用層,如果沒有執行就結束。
我們通過JavaScript調用Toast的例子來看下,JavaScript如何調用Java代碼的。
新建一個項目:
react-native init RNAndroid
在android的項目目錄下面新建一個類RNToastModule,此類需要繼承ReactContextBaseJavaModule。
ReactContextBaseJavaModuleReactContextBaseJavaModule是一個抽象類,是用來被JavaScript調用對象的父類,我們需要Override一些ReactContextBaseJavaModule的方法。
首先要Override getName()方法:
@Override public String getName() { return "RNToastAndroid"; }
這個方法的返回值就是JavaScript中調用的名稱,比如我們命名為RNToastAndroid,在JavaScript中可以這樣調用:
var {NativeModules}=require("react-native"); var rnToastAndroid = NativeModules.RNToastAndroid;
然后我們可以選擇性的覆蓋getConstants()方法:
這個方法的用在JavaScript和Java直接定義公用常量的,它使用key-value的方式保存。
在Java中定義兩個變量:
private static final String DURAION_SHORT_KEY = "SHORT"; private static final String DURAION_LONG_KEY = "LONG";
在getConstants()中給兩個字符串賦值:
@Override public MapgetConstants() { final Map constants = new HashMap<>(); constants.put(DURAION_SHORT_KEY, Toast.LENGTH_SHORT); constants.put(DURAION_LONG_KEY, Toast.LENGTH_LONG); return constants; }
我們把Toast的兩個常量放在了 constants中。
在JavaScript可以這樣調用:
rnToastAndroid.show("Hello Toast of native", rnToastAndroid.SHORT);
最后我們定義一個React調用的方法:
@ReactMethod public void show(String message, int duration) { Toast.makeText(getReactApplicationContext(), message, duration).show(); }
這個使用了annotation定義的方式必須加上@ReactMethod。
這里的參數只能React Navive定義的參數。
@ReactMethod中傳的參數必須是JavaScript和Java對應的。
Boolean -> Bool Integer -> Number Double -> Number Float -> Number String -> String Callback -> function ReadableMap -> Object ReadableArray -> Array注冊ReactPackage
新建一個RNJavaReactPackage類,繼承ReactPackage。
@Override public ListcreateNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList<>(); modules.add(new RNToastModule(reactContext)); return modules; } @Override public List > createJSModules() { return Collections.emptyList(); } @Override public List createViewManagers(ReactApplicationContext reactContext) { return new ArrayList<>(); }
RNJavaReactPackage創建了一個NativeModule的List。把RNToastModule的實例都添加進去提供給JavaScript層調用。
添加ReactPackage在android/app/src/main/java/com/your-app-name/中有個MainActivity.java其中的getPackages()方法用來返回用來的ReactPackage包,添加定義好的RNJavaReactPackage的實例
以上內容已經在0.31.0中更新。
新版本使用ReactNativeHost替換ReactInstanceManager,ReactNativeHost是設置Android相關配置的類。
需要在Application中實例化。
首先實現新建一個ReactNativeHost的實例并添加RNJavaReactPackage的實例:
private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override protected boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected ListgetPackages() { return Arrays. asList( new MainReactPackage(), new RNJavaReactPackage() ); } };
實現ReactApplication:
public class MainApplication extends Application implements ReactApplication { @Override public ReactNativeHost getReactNativeHost() { return mReactNativeHost; } }JavaScript中調用
在JavaScript顯示Toast:
"use strict"; var {NativeModules}=require("react-native"); var rnToastAndroid = NativeModules.RNToastAndroid; rnToastAndroid.show("Hello Toast of native", rnToastAndroid.SHORT);
這樣就完成了從JavaScript中直接調用了Java中定義的方法。
代碼地址:https://github.com/jjz/react-...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/78740.html
摘要:本身是事件驅動的語言,需在中可以使用回調方法來處理函數返回的結果。同樣地在中定義了和的接口,用來處理調用方法的回調。是中增加的對于異步編程和回調更加友好的使用可以更簡潔,更靈活地處理回調。 在react-native中可以通過在java層自定義ReactMethod(https://segmentfault.com/a/1190000004486024)方式給JavaScript調用,...
摘要:但阿里百川并沒有提供直接獲取數據的方法,所以選擇時一定要慎重。 React-native 使用native第三方sdk ios(以阿里百川用戶反饋為例) 首先安裝cocopods(類似于npm,ios開發的依賴管理工具,教程:http://www.code4app.com/artic... 在ios根目錄下創建Podfile文件,添加如下代碼(使用的是百川feedback1.1.1版...
閱讀 2181·2021-11-19 09:55
閱讀 2637·2021-11-11 16:55
閱讀 3175·2021-09-28 09:36
閱讀 1945·2021-09-22 16:05
閱讀 3272·2019-08-30 15:53
閱讀 1806·2019-08-30 15:44
閱讀 2899·2019-08-29 13:10
閱讀 1339·2019-08-29 12:30