在android活动之间发送和接收意图和事件并做出响应

时间:2019-03-26 09:17:11

标签: android react-native android-intent kotlin event-handling

简短介绍:我有一个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函数的方式或位置感到困惑。

0 个答案:

没有答案