简短介绍:我有一个React Native应用,它基本上只是一个WebView包装器应用。我希望它能够从android启动器的“共享方式”菜单中接收文本。收到的文本应成为WebViews uri。
我在android AndroidManifest.xml中添加了意图过滤器
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
在本机共享菜单中注册该应用程序,使其能够处理纯文本共享意图。到目前为止一切顺利!
到目前为止,在MainActivit.java中,我仅通过烘烤共享文本就可以处理意图。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
when {
intent?.action == Intent.ACTION_SEND -> {
if ("text/plain" == intent.type) {
handleSendText(intent) // Handle text being sent
}
}
}
}
private fun handleSendText(intent: Intent) {
intent.getStringExtra(Intent.EXTRA_TEXT)?.let {
Toast.makeText(this, it, Toast.LENGTH_SHORT).show() // this works
// Send event to react native app.js
}
}
我已经按照本指南创建了一个事件发射器,该事件发射器应该能够与应用程序的react native部分对话:https://levelup.gitconnected.com/react-native-events-in-gory-details-what-happens-on-the-way-to-listeners-2cee6c55940c
kotlin类如下:
class EventEmitter(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
val reactContext = reactContext
override fun getName(): String {
return "EventEmitter"
}
@ReactMethod
fun anExposedMethod() {
// this will be accessible from javascript as well
}
private fun sendEvent() {
val currentContext = reactApplicationContext
val eventName = "myAwesomeEvent"
val params = Arguments.createMap()
params.putString("type", "myEventType")
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
.emit(eventName, params)
}
}
这已在MainApplication.kt中注册
class MainApplication : Application(), ShareApplication, ReactApplication {
private val mReactNativeHost = object : ReactNativeHost(this) {
override fun getUseDeveloperSupport(): Boolean {
return BuildConfig.DEBUG
}
override fun getPackages(): List<ReactPackage> {
return Arrays.asList<ReactPackage>(
MainReactPackage(),
EventEmitterPackage(),
RNCWebViewPackage()
)
}
override fun getJSMainModuleName(): String {
return "index"
}
}
override fun getReactNativeHost(): ReactNativeHost {
return mReactNativeHost
}
override fun onCreate() {
super.onCreate()
SoLoader.init(this, /* native exopackage */ false)
}
}
从这里我不确定该如何继续。在我看来,合理的是从handleSendText(intent:Intent)内调用sendEvent(),但是我无法在MainActivity类中访问此函数,并且我不确定如何正确使用该方法这样。
我对MainApplication和MainActivity的区别感到困惑-为什么这两个不同?
反应本机部分
在app.js中,我已导入eventEmitter
const EventEmitter = NativeModules.EventEmitter;
...
componentWillMount() {
DeviceEventEmitter.addListener('myAwesomeEvent', (event) => {
// this is were I want to receive the shared text at last
console.log(event);
this.state.uri = event;
});
}
但是到目前为止,我一直无法测试这种方法是否有效,因为我对从EventEmitter类调用sendEvent函数的方式或位置感到困惑。