RN
调用android
代码大体分为如下几个步骤:react
一、用android studio
打开一个已经建立好的 RN
项目;android
二、建立一个类 CommonModule
继承自 ReactContextBaseJavaModule
,并重写 getName()
方法,在该类中咱们要暴露一些方法供 RN
调用;git
class CommonModule(private val reactContext: ReactApplicationContext)
: ReactContextBaseJavaModule(reactContext) {
}
复制代码
getName()
方法,改方法用来返回 RN
代码须要寻找的类的名称;override fun getName(): String {
// 必定要有名字 RN代码要经过名字来调用该类的方法
return "CommonModule"
}
复制代码
RN
调用的方法,并用 @ReactMethod
注解修饰;/**
* 加上 @ReactMethod 注解是为了暴露给RN调用的方法;
*
* 方法不能返回值,由于被调用的原生代码是异步的,原生代码执行结束以后只能经过回调函数或者发送消息给RN
*/
@ReactMethod
fun rnCallNative(msg: String) {
// 这个方法是说弹出一个弹窗到界面
Toast.makeText(reactContext, msg, Toast.LENGTH_LONG).show()
}
复制代码
三、建立类 CommonPackage
实现接口 ReactPackage
包管理器,并把第2步中建立好的 CommonModule
类添加进来;github
class CommonPackage : ReactPackage {
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
val list = ArrayList<NativeModule>()
list.add(CommonModule(reactContext))
return list
}
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
return emptyList()
}
}
复制代码
四、将建立好的 CommonPackage
包管理器添加到 ReactPackage
列表中;也就是在 ReactNativeActivity
中的 onCreate
方法中添加:react-native
class ReactNativeActivity : AppCompatActivity(), DefaultHardwareBackBtnHandler {
private var mReactRootView: ReactRootView? = null
private var mReactInstanceManager: ReactInstanceManager? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val list = mutableListOf<ReactPackage>()
list.add(MainReactPackage()) // 默认
list.add(CommonPackage()) // 自定义Package
mReactRootView = ReactRootView(this)
mReactInstanceManager = ReactInstanceManager.builder()
.setApplication(application)
.setCurrentActivity(this)
//.setBundleAssetName("index.android.bundle")
.setJSBundleFile(CodePush.getJSBundleFile())// ! 此处为codePush加载JsBundle方式,默认为.setBundleAssetName("index.android.bundle")
.setJSMainModulePath("index") // ! 注意这里的index指向入口的js文件
//.addPackage(MainReactPackage())
.addPackages(list) // ! 此处为扩展Packages,默认为.addPackage(new MainReactPackage())
.setUseDeveloperSupport(BuildConfig.DEBUG)
.setInitialLifecycleState(LifecycleState.RESUMED)
.build()
// 注意这里的 rn_sample 必须对应“index.js”中的 “AppRegistry.registerComponent()”的第一个参数
mReactRootView?.startReactApplication(mReactInstanceManager, "rn_sample", null)
setContentView(mReactRootView)
}
...
}
复制代码
五、在 RN
代码中用 NativeModules
组件去调用原生模块;promise
import {Alert, Button, NativeModules, StyleSheet, View} from 'react-native';
const commonModule = NativeModules.CommonModule;
function callAndroid() {
commonModule.rnCallNative('RN 调用 Android 原生~~');
}
复制代码
render
方法里设置 button
的点击事件直接调用自定义方法 callAndroid
便可;render() {
return (
<View style={styles.container}>
<Button title='call_android' onPress={callAndroid}/>
</View>
);
}
复制代码
到此,基本的 RN
调用安卓原生代码的方式就得以实现。bash
在原生代码
CommonModule
类中建立桥接方法,当桥接的方法最后一个参数是Promise
对象,那么该方法就会返回一个JS
的Promise
对象给对应的JS
方法。app
一、首先须要在 CommonModule
中定义一个暴露给 RN
的方法,而且要用 @ReactMethod
标识;异步
@ReactMethod
fun rnCallNativePromise(msg: String, promise: Promise) {
Toast.makeText(reactContext, msg, Toast.LENGTH_LONG).show()
val componentName = name
promise.resolve(componentName)
}
复制代码
二、在 RN
代码中也是须要用 NativeModules
组件调用原生模块;ide
import {Alert, Button, NativeModules, StyleSheet, View} from 'react-native';
const commonModule = NativeModules.CommonModule;function callAndroidPromise() {
commonModule.rnCallNativePromise('RN Promise 调用 Android 原生~~')
.then((msg) => {
Alert.alert('promise 收到消息', msg)
console.log("promise 收到消息", msg)
})
.catch((error) => {
console.log(error)
})
}
复制代码
render() {
return (
<View style={styles.container}>
<Button title='call_android' onPress={callAndroid}/>
<Button title='call_android_promise' onPress={callAndroidPromise}/>
</View>
);
}
复制代码
一、 一样也是按照上面的方式,在原生模块中暴露一个桥接的方法给 RN
调用,参数传入一个成功的回调和一个失败的回调;
@ReactMethod
fun rnCallNativeCallback(success: Callback, error: Callback) {
try {
success.invoke(100, 200)
} catch (e: Exception) {
error.invoke(e.message)
}
}
复制代码
二、在 RN
代码中也是须要用 NativeModules
组件调用原生模块;
import {Alert, Button, NativeModules, StyleSheet, View} from 'react-native';
const commonModule = NativeModules.CommonModule;function callAndroidCallback() {
commonModule.rnCallNativeCallback((x, y) => {
Alert.alert('callback 收到消息', x + ',' + y)
console.log('callback 收到消息', x, y)
}, (error) => {
console.log(error)
})
}
复制代码
render() {
return (
<View style={styles.container}>
<Button title='call_android' onPress={callAndroid}/>
<Button title='call_android_promise' onPress={callAndroidPromise}/>
<Button title='call_android_callback' onPress={callAndroidCallback}/>
</View>
);
}
复制代码
最后,RN与安卓原生之间的通讯方式已经介绍完了,若有不对的地方,欢迎指正~~
完整的项目地址:github.com/iceCola7/rn…