react native 和原生平臺 android的互動
慣例這是寫在前面的話,週五的時候和同事朋友聊起來寫部落格這件事,自己在朋友圈吹下的牛逼,無論如何都是要完成的啊,等把部落格寫完了,獎勵自己玩一會兒魔獸,我的小號獸人戰士已經10級了,聯盟,你們顫抖吧。
圖片發自簡書App
我們這裡從react-natvie 呼叫原生android的方法,獲取原生android的資料
部分開始講,其中還包括android
對react-native
的回撥。
這就是說的互相互動的事,那麼我們開始吧!
react-natvie 呼叫原生android的方法,獲取原生android的資料
在react-native
和原生平臺API
之間,有一個JavaScript
的橋接層,react-native
就是透過橋接層來和原生的平臺進行互動的,其中,這涉及到了兩個模組NativeModule
和NativeEventEmitter
。
1.NativeModule
:用於JavaScript
程式碼呼叫原生的程式碼。
2.NativeEventEmitter
:用於原生程式碼傳送訊息到JavaScript
程式碼。
我們可以看一下Animated
下的原始碼實現:
目錄在這裡
node_modulesreact-nativeLibrariesAnimatedsrcNativeAnimatedHelper.js
它的第一行就是
const NativeAnimatedModule = require('NativeModules').NativeAnimatedModule;const NativeEventEmitter = require('NativeEventEmitter');
引用了這兩個模組,我們再看一下下面是怎麼呼叫的呢?
createAnimatedNode: function(tag: ?number, config: Object): void { assertNativeAnimatedModule(); NativeAnimatedModule.createAnimatedNode(tag, config); },
建立一個Animated
動畫,是透過呼叫NativeAnimatedModule.createAnimatedNode(tag, config);
來實現的。
而在android
這裡的程式碼,如果想要能夠讓react-native
呼叫到,需要實現三個步驟:
1.寫出你想要呼叫的模組(繼承ReactContextBaseJavaModule) 2.把這個模組匯出(實現匯出介面ReactPackage) 3.把這個模組註冊釋出(在MainApplication中註冊)
那麼我們開始吧:
1.寫出你想要呼叫的模組(繼承ReactContextBaseJavaModule)
//.../** * Created by feiyu on 2018/5/12. */public class CommunicationModule extends ReactContextBaseJavaModule { private final ReactApplicationContext mReactContext; public CommunicationModule(ReactApplicationContext reactContext) { super(reactContext); this.mReactContext = reactContext; } @Override public String getName() { //你想要呼叫的那個模組的名稱,實際上就是當前的這個物件 return "Communication"; } @Nullable @Override public MapgetConstants() { HashMap constants = new HashMap(); constants.put("systemName","android"); return constants; } //我們想要呼叫的原生的android方法,這個方法可以開啟一個activity,同時還可以傳遞引數過來 @ReactMethod public void StartActivityFromReactNative(String activityName, String data, Promise promise, Callback callback){ Activity currentActivity = getCurrentActivity(); try{ if(currentActivity != null){ Class> toActivity = Class.forName("yourPackageName" +"." +activityName); Intent intent = new Intent(currentActivity,toActivity); intent.putExtra("params",data); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//在react native 開啟activity currentActivity.startActivity(intent); } promise.resolve(true); callback.invoke(true); }catch(ClassNotFoundException e){ throw new JSApplicationIllegalArgumentException("開啟activity失敗"+e.getMessage()); } } }
在這裡我們實現了一個必須的方法就是getName
這個方法返回的是我們想要呼叫的那個模組的名稱,也就是當前物件。同時我們想要給react-native
傳遞一些引數,就實現了getConstants
方法,在這個方法中我們設定了當前平臺的名稱。我們想要呼叫一個android
本地的方法,所以我們實現了StartActivityFromReactNative
方法,重要的是我們需要設定@ReactMethod
註解。呼叫完StartActivityFromReactNative
方法後我們想要知道呼叫結果呢?我們有兩種方式Promise
和Callback
都可以,例如上面的程式碼。
2.把這個模組匯出(實現匯出介面ReactPackage)
//.../** * Created by feiyu on 2018/5/12. */public class Communication implements ReactPackage { @Override public ListcreateNativeModules(ReactApplicationContext reactContext) { List modules = new ArrayList(); modules.add(new CommunicationModule(reactContext)); return modules; } @Override public List createViewManagers(ReactApplicationContext reactContext) { return Collections.emptyList(); } public List > createJSModules(){ return Collections.emptyList(); } }
上面的這個就是固定模式了,你在實現任意的模組時都可以複製上面的程式碼,然後把CommunicationModule
換成你的。
3.把這個模組註冊釋出(在MainApplication中註冊)
第三步就非常簡單了!
//...public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @Override protected ListgetPackages() { return Arrays. asList( new MainReactPackage(), new Communication() ); } @Override protected String getJSMainModuleName() { return "index"; } }; //...}
最後我們在getPackages
中返回我們的物件就可以了new Communication()
.
react-native 呼叫android原生
react-native
呼叫原生平臺是基於NativeModules
,呼叫的方法是NativeModules
.模組名稱.介面名稱。
原生平臺返回資料到react-native
平臺是基於回撥,回撥的原型定義是RCTRResponseSenderBlock(IOS)平臺
和com.facebook.react.bridge.CallBack(Android平臺)
。
我們想要獲取android
平臺定義的那個systemName
的話只需要這樣:
if(Platform.OS === "android"){ let systemName = NativeModule.Communction.systemName; }
呼叫我們定義的那個開啟activity
的方法也是同上:
if(Platform.OS === "android"){ NativeModule.Communction.StartActivityFromReactNative("CommunicationActivity",123456); }
這樣就可以了。然後怎麼獲取到react-native
給傳過來的資料呢?在android
的activity
中:
public class CommunicationActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_communication); Intent intent = getIntent(); if(intent != null){ String params = intent.getStringExtra("'params"); Toast.makeText(this,"從react-native中傳遞過來的資料"+params,Toast.LENGTH_LONG).show(); } } }
需要注意的地方:
1.react native
呼叫android
進行介面跳轉時,需要設定FLAG_ACTIVITY_NEW_TASK
標誌
2.我們在呼叫android
的模組時,名稱要和getName
的方法一樣:
NativeModule.Communction.systemName;
就是Communction
...
到這裡react-native
和android
的就Over
了。祝大家週末愉快!
參考書籍:《React Native 實戰》
作者:雨飛飛雨
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1795/viewspace-2810117/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- React Native與Android通訊互動React NativeAndroid
- React native 與Android原生互動方式(一)React NativeAndroid
- React Native 互動元件之 SwitchReact Native元件
- Flutter入門進階之旅(十九)Flutter與原生平臺互動Flutter
- 前端和React Native程式碼互轉總結前端React Native
- React Native Android 啟動異常React NativeAndroid
- react native ScrollView巢狀WebView 互動問題React Native巢狀WebView
- 深入淺析React Native與web的基本互動(附程式碼)React NativeWeb
- 移動跨平臺方案對比:WEEX、React Native、Flutter和PWAReact NativeFlutter
- [譯] React Native 與 iOS 和 Android 通訊React NativeiOSAndroid
- 重新認識React Native和Android的通訊原理React NativeAndroid
- react-native 環境的搭建(包括Android和iOS)ReactAndroidiOS
- 淺談移動應用的跨平臺開發工具(Xamarin和React Native)React Native
- 從 React Native 到 Flutter,移動跨平臺方案的真相React NativeFlutter
- 隨手記Android JS與Native互動實踐AndroidJS
- h5 和native 互動那些事兒H5
- 【quickhybrid】H5和Native互動原理UIH5
- 使用React Native和Expo快速構建原生移動iOS和Android應用程式React NativeiOSAndroid
- flutter和Android原生互動FlutterAndroid
- Android介面與互動設計原則Android
- Flutter 與Native原生互動Flutter
- Android整合React Native啟動白屏問題優化AndroidReact Native優化
- React Native Android 原始碼分析之啟動過程React NativeAndroid原始碼
- 利用 Native.js 實現 Android 與 HTML 資料的互動JSAndroidHTML
- Android中Java和JavaScript互動AndroidJavaScript
- react-native run-android踩的坑ReactAndroid
- React-Native修改安卓平臺的包名React安卓
- 17-3 react native Android打包React NativeAndroid
- React Native 修改Android工程目錄React NativeAndroid
- react-native android狀態列ReactAndroid
- React Native Android環境搭建(Mac)React NativeAndroidMac
- react-native android 打包步驟ReactAndroid
- android 的webView載入h5,和h5的互動(java和JavaScript的互動)AndroidWebViewH5JavaScript
- React Native區分安卓/iOS平臺React Native安卓iOS
- Android和H5之間的互動AndroidH5
- [React Native]react-native-scrollabReact Native
- 《React Native跨平臺移動應用開發》讀後鬼扯React Native
- Android 原生和 JS 互動實踐AndroidJS