1. 程式人生 > >RN 與 Android 程式碼互動

RN 與 Android 程式碼互動

如果在開發中要用到一個 RN 沒有提供的元件,或者想複用 Java 程式碼已經實現的元件而不是用 JavaScript 再造一個車輪子,或者想使用 Java 高效的處理圖片、訪問資料庫、多執行緒程式設計等,你可以使用 RN 做到 JavaScript 與 Java 非同步通訊。

這裡我們以 Android 提供的 Toast 為例。在 RN 工程裡使用 JavaScript 呼叫 Android 系統的 Toast。

首先來看一下工程目錄結構:



如上圖,我們的工程叫 Awesome。左側的是 Atom 工程,右側的是將其中的 android/app 目錄匯入 Android Studio 後的 工程。
Java 檔案包括:

  • MainActivity.java;
  • AwesomeReactPackage.java;
  • ToastModule.java,RN 已經提供了該檔案,實際開發過程中直接引用即可,本文為了學習需要單獨寫出;

JavaScript 檔案包括:

  • index.android.js;
  • ToastAndroid.js。

檔案內容分別如下:
MainActivity

public class MainActivity extends Activity implements DefaultHardwareBackBtnHandler {

    private ReactInstanceManager mReactInstanceManager;
    private
ReactRootView mReactRootView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mReactRootView = new ReactRootView(this); mReactInstanceManager = ReactInstanceManager.builder() .setApplication(getApplication()) .setBundleAssetName("index.android.bundle"
) .setJSMainModuleName("index.android") .addPackage(new MainReactPackage()) .setUseDeveloperSupport(BuildConfig.DEBUG) .setInitialLifecycleState(LifecycleState.RESUMED) .build(); mReactRootView.startReactApplication(mReactInstanceManager, "Awesome", null); setContentView(mReactRootView); } @Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_MENU && mReactInstanceManager != null) { mReactInstanceManager.showDevOptionsDialog(); return true; } return super.onKeyUp(keyCode, event); } @Override public void onBackPressed() { if (mReactInstanceManager != null) { mReactInstanceManager.onBackPressed(); } else { super.onBackPressed(); } } @Override public void invokeDefaultOnBackPressed() { super.onBackPressed(); } @Override protected void onPause() { super.onPause(); if (mReactInstanceManager != null) { mReactInstanceManager.onPause(); } } @Override protected void onResume() { super.onResume(); if (mReactInstanceManager != null) { mReactInstanceManager.onResume(this, this); } } protected List<ReactPackage> getPackages() { return Arrays.<ReactPackage>asList( new MainReactPackage(), new AwesomeReactPackage()); } }

ToastModule

public class ToastModule extends ReactContextBaseJavaModule {

  private static final String DURATION_SHORT_KEY = "SHORT";
  private static final String DURATION_LONG_KEY = "LONG";

  public ToastModule(ReactApplicationContext reactContext) {
    super(reactContext);
  }

  @Override
  public String getName() {
    return "ToastAndroid";
  }

  @Override
  public Map<String, Object> getConstants() {
    final Map<String, Object> constants = new HashMap<>();
    constants.put(DURATION_SHORT_KEY, Toast.LENGTH_SHORT);
    constants.put(DURATION_LONG_KEY, Toast.LENGTH_LONG);
    return constants;
  }

  @ReactMethod
  public void show(String message, int duration) {
    Toast.makeText(getReactApplicationContext(), message, duration).show();
  }
}

AwesomeReactPackage

public class AwesomeReactPackage implements ReactPackage {

    @Override
    public List<NativeModule> createNativeModules(
            ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();

        modules.add(new ToastModule(reactContext));

        return modules;
    }

    @Override
    public List<Class<? extends JavaScriptModule>> createJSModules() {
        return null;
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return null;
    }
}

ToastAndroid

var { NativeModules } = require('react-native');
module.exports = NativeModules.ToastAndroid;

在 index.android.js 中使用 ToastAndroid:

var ToastAndroid = require('./ToastAndroid');
ToastAndroid.show('Awesome', ToastAndroid.LONG);

下面講解各個檔案的作用。

相關推薦

RN Android 程式碼互動

如果在開發中要用到一個 RN 沒有提供的元件,或者想複用 Java 程式碼已經實現的元件而不是用 JavaScript 再造一個車輪子,或者想使用 Java 高效的處理圖片、訪問資料庫、多執行緒程式設計等,你可以使用 RN 做到 JavaScript 與 Jav

React NativeAndroid互動

在使用RN進行跨平臺開發的過程中,經常會設計到跨平臺呼叫相關的內容,而在於RN進行互動的時候,最核心的就是RN提供的Component和Module。 其中,Component是專門將Native的UI暴露出來供JS呼叫的,而Native Module則是將N

React NativeAndroid通訊互動

剛建立的React Native 微信公眾號,歡迎微信掃描關注訂閱號,每天定期會分享react native 技術文章,移動技術乾貨,精彩文章技術推送。同時可以掃描我的微信加入react-native技術交流微信群。歡迎各位大牛,React Native技術愛好者加入

UnityAndroid互動之專案結構

概述 為什麼會寫這樣的文章,原因是我們在使用Unity做開發的時候少不了跟其它平臺做互動,特別是當前流行的Android和iOS。但是由於Unity官方文件缺少這方便詳細的資料,以及每個人的開發水平也參差不齊,再加上涉及到多平臺的互動(不同平臺的開發者不甚瞭解

JSAndroid原生互動

JS與Android原生互動 在專案的開發中我們會遇到android 原生與Html5的混合開發,我們可能會需要在android中呼叫js裡面的方法進行資料互動或其他的特殊處理,又或者在Html頁面呼

UnityAndroid互動,使用Android Studio匯出各Unity工程通用的Android外掛包

網上已經有很多關於Unity與Android之間的互動,教程基本都一樣,但是裡面有個都強調的重點是建立安卓工程時包名要和unity的bundle id要一致,這樣我就比較疑惑,如果一些

js 學習總結,可利用其原生程式碼互動

js 基礎, js HTML DOM 物件的操作 js 高階教程 , js 瀏覽器 BOM js 庫 jQuery ,Prototype  js 例項 js 物件例項, 瀏覽器物件例項, HTML DOM 例項 js 函式 包裹在花括號中的程式碼塊 function f

js android互動(方法互呼叫) 和android向 js傳遞值, js向android傳引數 事件攔截看上一篇

mail_detail_v2.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewpor

Unity3DAndroid專案互動中無法監聽back鍵返回的解決辦法

 這兩天為解決unity3d與android專案整合中出現的無法監聽真機back實體鍵的問題找了很多資料,網上也有很多人遇到了這個問題,但是似乎都沒找到有效的解決方法。    實現的效果是從A_Activity跳轉到UnityPlayerNativeActi

從零開始實現UnityAndroid互動(一)

之前有SDK接入方面的需求,涉及到一些Unity與Android和iOS原生互動,雖然關於這方面的教程網上有不少,但第一次接觸還是遇到不少問題,這裡有很多坑與程式設計無關,很大一部分是配置不當造成的。在此記錄下來,做個備忘,也方便後來人學習。 第一步:環境搭建 下面是你需

unityAndroid互動初接觸

嵌入sdk是比較常見的吧,如接入廣告啊,新浪的分享...... 這些都需要接入sdk的,現在我們從最基本的做吧,其實這些和什麼引擎都是沒多大關係的,不管是unity,還是cosos2d......

FlutterAndroid原生程式碼互動

一、概述 Flutter正式版已經出了一段時間了,作為剛入門的一個菜鳥而言,我還需要更多的學習。 最近開始的flutter專案用到了分享功能,但是到目前為止,微信,QQ等還沒有出對flutter分享的SDK,這就需要用到flutter與Android和ios的原生互動。下面僅關於fl

Android和HTML5混合開發中android程式碼JS互動

當下HTML5非常火,使用HTML5混合開發的好處是當開發者想要修改某一個非原生頁面時,修改提交之後不用對應用進行升級發版,有人說HTML5將來將會取代原生開發,但個人感覺就目前來說這體驗感還沒完全達到原生的水平,今天做了個小Demo用於android與java

Android混合開發-(AndroidWeb的互動

在Android開發中,越來越多的商業專案使用了Android原生控制元件與WebView進行混合開發,當然不僅僅就是顯示一個WebView那麼簡單,有時候還需要本地Java程式碼與HTML中的JavaScript進行互動,Android也對互動做了很好的封裝,所以很容易實現例如:點選網頁中的按鈕A

AndroidHTML+JS互動

原創文章 ,首發在 http://blog.csdn.net/leejizhou/article/details/50894531李濟洲的部落格 在Android開發中,越來越多的商業專案使用了android原生控制元件與WebView進行混合開發,當然不僅僅就是顯示一個WebView那

Unity5 0Android互動

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java開發微信公眾號(二)--測試號申請、微信java程式碼初步互動

一、申請測試號 個人不能夠免費申請服務號,訂閱號有很多限制,介面許可權出來基本的幾乎沒有,如圖, 在微信公眾平臺,檢視介面許可權 那麼怎麼使用服務號的介面許可權呢?微信推出了測試號,交給大家使用,開通的步驟是: 1.在微信平臺頁面,在服務號中,點選開發者文件 2

androidjava web互動完成簡單的登入和註冊

   本文的知識點包括android客戶端的網路程式設計、訊息機制、IO流、多執行緒和java web伺服器端的servlet、資料庫操作、javabean技術、工具類和測試類的使用。 客戶端 執行效果圖 佈局檔案 activity_main.xml <

android客戶端伺服器端互動 如何保持session

最近在開發專案的過程中,遇到android與web伺服器要在同一session下通訊的問題。 在解決問題前先回顧下Session與Cookie: Cookie和Session都為了用來儲存狀態資訊,都是儲存客戶端狀態的機制,它們都是為了解決HTTP無狀態的問題而所做

Android ServiceActivity的互動

Android中有時候需要在Service中改變Activity的UI,或者在Activity中修改Service中的數值。首先必須使用與Activity繫結的Service,有三種方式可以實現。第一,是使用介面回撥的方式在Activty中實現Service中的介面;第二,使用廣播的方式傳遞;第三,則是用觀察