ReactNative 和Android通信(1)

創(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) {

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

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,318評(píng)論 25 708
  • 這篇文章針對(duì)于對(duì)rn有些基礎(chǔ)的同學(xué),沒有基礎(chǔ)的同學(xué)可以先了解一下rn以后再看這篇文章。要想深入理解 React N...
    小草33閱讀 2,144評(píng)論 1 5
  • ? React Native(以下簡(jiǎn)稱RN)的目標(biāo)是用基于react的JavaScript寫代碼,在iOS/A...
    Iceguest閱讀 3,776評(píng)論 0 10
  • 玉樹臨風(fēng)何足論, 風(fēng)流倜儻自稱雄。 中華崛起寰球傲, 日麗風(fēng)和稟圣公。
    花屋主人蕭寒閱讀 706評(píng)論 9 26
  • 今晚做冥想初始,內(nèi)心有些不安定,偶爾有些念頭冒出來。隨著引導(dǎo)的逐漸深入,人也漸漸安住在當(dāng)下。整個(gè)身體沉浸在平靜祥和...
    一花一世界1217閱讀 338評(píng)論 1 3

友情鏈接更多精彩內(nèi)容