創(chuàng)建模塊
在android部分新建一個(gè)類繼承ReactContextBaseJavaModule,并且實(shí)現(xiàn)getName方法,這個(gè)方法的返回值在js端代表這個(gè)模塊
public class AndroidNative extends ReactContextBaseJavaModule {
public AndroidNative(ReactApplicationContext reactContext) {
super(reactContext);
}
@Override
public String getName() {
return "AndroidNative";
}
}
JS端想調(diào)用android的方法,必須使用注解@ ReactMethod標(biāo)示此方法,這個(gè)方法必須是void的。RN的跨語言訪問是異步進(jìn)行的,想要給js返回一個(gè)值的唯一方法是回調(diào)函數(shù)或發(fā)送事件。
@ReactMethod
public void sendMessageToNative(String message) {
Toast.makeText(getReactApplicationContext(), message, Toast.LENGTH_SHORT).show();
}
注冊(cè)模塊
在Java這邊做的最后一件事就是注冊(cè)這個(gè)模塊,如果不注冊(cè),在js端是無法使用的。新建一個(gè)類實(shí)現(xiàn)ReactPackage接口,并在createNativeModules方法中添加此模塊
public class AndroidNativeReactPackage implements ReactPackage{
@Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new AndroidNative(reactContext));
return modules;
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
在MainApplication.java文件的getPackages方法中加入此package,
@Override
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new AndroidNativeReactPackage()
);
}
import {NativeModules} from 'react-native';
//在需要的地方調(diào)用下面的代碼
NativeModules.AndroidNative.sendMessageToNative("RN調(diào)用原生Toast")
為了在js端使用方便,可以將之封裝成一個(gè)js模塊,這樣就用每次使用都寫import {NativeModules} from 'react-native';
android 端調(diào)用RN JS代碼
原生模塊在沒有被調(diào)用的情況下主動(dòng)往JS 端發(fā)送事件。最簡(jiǎn)單的辦法就是通過RCTDeviceEventEmitter,這可以通過ReactContext來獲得對(duì)應(yīng)的引用。
在andorid端的核心代碼如下:
reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit("約定的事件名字",param);
JS端可以通過使用DeviceEventEmitter模塊來監(jiān)聽事件
import {DeviceEventEmitter} from 'react-native';
componentWillMount() {
DeviceEventEmitter.addListener('約定的事件名字', this.onCompleted.bind(this));
}
onCompleted(result) {
alert(result)
}
從startActivityForResult中獲取結(jié)果
如果你使用startActivityForResult調(diào)起了一個(gè)activity并想從其中獲取返回結(jié)果,那么你需要監(jiān)聽onActivityResult事件。具體的做法是繼承BaseActivityEventListener或是實(shí)現(xiàn)ActivityEventListener
public class TestNative extends ReactContextBaseJavaModule implements ActivityEventListener{
public TestNative(ReactApplicationContext reactContext) {
super(reactContext);
reactContext.addActivityEventListener(this);
}
@Override
public String getName() {
return null;
}
@Override
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {
}
@Override
public void onNewIntent(Intent intent) {
}
}