日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

React Native实现js调用安卓原生代码

發布時間:2023/12/4 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 React Native实现js调用安卓原生代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 問題

?? 實現js調用安卓原始代碼,直接上代碼,簡單粗暴

?

?

?

?

2 代碼實現

?? 1) 實現一個繼承ReactContextBaseJavaModule的類,MyToastModule.java文件如下

public class MyToastModule extends ReactContextBaseJavaModule {public MyToastModule(ReactApplicationContext reactContext) {super(reactContext);}/*** getName方法返回一個字符串名字,就是js中的模塊名* 到時候我們寫js的時候需要導入這個模塊,這里我用的是MyToast*/@Overridepublic String getName() {return "MyToast";}/*** 這是js調用的方法,需要使用注解@ReactMethod,返回類型必須為void*/@ReactMethodpublic void show() {Toast.makeText(getReactApplicationContext(), "I am chenyu", Toast.LENGTH_SHORT).show();} }

?getName()方法返回一個字符串名字,就是js中的模塊名,到時候我們寫js的時候需要導入這個模塊,這里我用的是MyToastshow()方法 show()方法是到時候js調用的方法,需要使用注解@ReactMethod,返回類型必須為void

?

?2) 實現繼承ReactPackage的一個類

?? MyToastReactPackage.java 文件如下

package com.pro_react;import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager;import java.util.ArrayList; import java.util.Collections; import java.util.List;/*** */public class MyToastReactPackage implements ReactPackage {/*** 需要在應用的Package類的createNativeModules方法中添加這個模塊。* 如果模塊沒有被注冊,它也無法在JavaScript中被訪問到。* @param reactContext* @return*/@Overridepublic List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {List<NativeModule> modules = new ArrayList<>();modules.add(new MyToastModule(reactContext));return modules;}@Overridepublic List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {return Collections.emptyList();} }

這里的createNativeModules方法需要添加我之前寫的MyToastModule模塊

?

? 3 )? 在MainApplication.java文加的getPackages方法中添加我自己的包,代碼如下

package com.pro_react;import android.app.AppOpsManager; import android.app.Application; import android.content.Context; import android.content.Intent; import android.content.pm.ApplicationInfo; import android.net.Uri; import android.os.Build; import android.util.Log;import com.facebook.react.ReactApplication; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage; import com.facebook.soloader.SoLoader;import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import java.util.List;public class MainApplication extends Application implements ReactApplication {public static final String TAG = "MainApplication";private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) {@Overridepublic boolean getUseDeveloperSupport() {return BuildConfig.DEBUG;}@Overrideprotected List<ReactPackage> getPackages() {Log.i(TAG, "MainApplication getPackages");return Arrays.<ReactPackage>asList(new MainReactPackage(),new MyToastReactPackage());}@Overrideprotected String getJSMainModuleName() {return "index";}};@Overridepublic ReactNativeHost getReactNativeHost() {return mReactNativeHost;}@Overridepublic void onCreate() {super.onCreate();Log.i(TAG, "MainApplication onCreate");SoLoader.init(this, /* native exopackage */ false);} }

? 4) js模塊的編寫

????? js模塊要注意你需要加入這個

import {NativeModules} from 'react-native'

然后用變量保存安卓的模塊,也就是上面getName方法里面的返回值MyToast

var myAndroidToast = NativeModules.MyToast;

然后我是模擬,文本點擊觸發的調用原聲安卓的函數,App.js文件如下

/*** Sample React Native App* https://github.com/facebook/react-native** @format* @flow*/import React, {Component} from 'react'; import {Platform, StyleSheet, Text, View, NativeModules} from 'react-native';const instructions = Platform.select({ios: 'Press Cmd+R to reload,\n' + 'Cmd+D or shake for dev menu',android:'Double tap R on your keyboard to reload,\n' +'Shake or press menu button for dev menu', }); var myAndroidToast = NativeModules.MyToast; type Props = {}; export default class App extends Component<Props> {render() {return (<View style={styles.container}><Text onPress={()=> this._androidShowMsg()} style={styles.welcome}>Welcome to React Native!</Text><Text style={styles.instructions}>To get started, edit App.js</Text><Text style={styles.instructions}>{instructions}</Text></View>);}/***調用安卓原生代碼 * @private*/_androidShowMsg = () => {myAndroidToast.show();}; }const styles = StyleSheet.create({container: {flex: 1,justifyContent: 'center',alignItems: 'center',backgroundColor: '#F5FCFF',},welcome: {fontSize: 20,textAlign: 'center',margin: 10,},instructions: {textAlign: 'center',color: '#333333',marginBottom: 5,}, });

?

?

?

3 運行結果

運行之前要記得在項目的目錄下執行下面的命令,它會在android的assets目錄下生成index.android.bundle文件,也就是安卓會加載這個js文件,這里也會起到編譯js作用,如果有語法錯誤,這里控制臺會提示

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res

然后執行運行項目命令

react-native run-android

點擊Welcome to React Native運行結果如下

總結

以上是生活随笔為你收集整理的React Native实现js调用安卓原生代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。