React Native橋接Android模塊-RNDeviceEventEmitter方式
1.創建模塊類
public class RNManagerModule extends ReactContextBaseJavaModule {
private Context mContext;
public RNManagerModule(ReactApplicationContext reactContext) {
super(reactContext);
mContext = reactContext;
}
@Override
public String getName() {
return "RNManagerModule";
}
@ReactMethod
public void RNDeviceEvent() {
sendEventToRn("sendEventToRn");
}
private void sendEventToRn(String eventName) {
if (getReactApplicationContext() == null) {
return;
}
getReactApplicationContext().getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(eventName,"data");
}
}
2.註冊模塊
public class RNPackage implements ReactPackage {
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules=new ArrayList<>();
//將我們創建的類添加進原生模塊列表中
modules.add(new RNManagerModule(reactContext));
return modules;
}
}
3.Android包的註冊
將RNPackage添加到 MainApplication.java 中的 getPackages() 方法中
js調用原生代碼
import { NativeModules,DeviceEventEmitter } from 'react-native';
componentDidMount(){
//註冊掃描監聽
DeviceEventEmitter.addListener('sendEventToRn', (value)=>{console.log('DeviceEventEmitter -->',value)});
}
<Button
title="RNDeviceEventEmitter方式實現與android原生模塊交互"
onPress={() => {
NativeModules.RNManagerModule.RNDeviceEvent();
}}
/>
RN調用Android需要module名和方法名相同,而Android調用RN只需要方法名相同。
(1)RCTDeviceEventEmitter 事件方式
優點:可任意時刻傳遞,Android主導控制。 可以用於多線程
(2)Callback 回調方式
優點:JS調用,Android返回。
缺點:CallBack爲異步操作,返回時機不確定
(3)Promise
優點:JS調用,Android返回。
缺點:每次使用需要JS調用一次
(4)直傳常量數據(原生向RN)
跨域傳值,只能從原生端向RN端傳遞。RN端可通過 NativeModules.[module名].[參數名] 的方式獲取。
注意:RN層調用NativeModule層進行界面跳轉時,需要設置FLAG_ACTIVITY_NEW_TASK標誌