Intent.createChooser() 中使用的 BroadcastReceiver 的参数

Arguments for a BroadcastReceiver used inside Intent.createChooser()

我的应用程序上有很多分享按钮。按下共享按钮时,会向用户显示一个选择器,以便他可以 select 一个应用程序来共享内容。我想知道用户选择了什么,所以我决定使用 BroadcastReceiverIntent.createChooser() 方法。

但是我在整个应用程序中有多个共享按钮,所以我定义了以下 class:

class MyBroadcastReceiver(val listener: MyBroadcastReceiverListener) : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        listener.handleShare()
    }

    interface MyBroadcastReceiverListener {
        fun handleShare()
    }
}

我想从实现MyBroadcastReceiverListener(Activity1、Activity2、Activity3 等)的不同地方使用这个class,这样我就可以在每个override fun handleShare() 上执行相应的任务地方。我面临的问题是我必须在使用 Intent.createChooser().

之前执行此操作
var receiver = Intent(this, MyBroadcastReceiver::class.java) // how can I pass args  ?
var pi = PendingIntent.getBroadcast(this, 0, receiver, PendingIntent.FLAG_UPDATE_CURRENT)
Intent.createChooser(..., ..., pi.getIntentSender());

因为我必须以静态方式提供 MyBroadcastReceiver,所以我无法将参数(在本例中为侦听器)传递给 MyBroadcastReceiver。有没有办法解决这个问题?谢谢您的支持!

故事: 到 运行 用户从应用程序选择器对话框中选择应用程序后的代码块。您不应该将 activity 作为侦听器传递,因为这可能会泄漏 activity(应用程序可能会保留对 activity 的引用,即使它已被销毁)。

解决方案:使用EventBus实现你的目标。

第 1 步:通过gradle

将 EventBus 添加到您的项目
implementation 'org.greenrobot:eventbus:3.2.0'

步骤 2: 定义事件

object OnShareEvent

第 3 步:Register/unregister 从您的 activity 监听事件,例如 Activity1。

override fun onStart() {
    super.onStart()
    EventBus.getDefault().register(this)
}

override fun onStop() {
    super.onStop()
    EventBus.getDefault().unregister(this)
}

@Subscribe(threadMode = ThreadMode.MAIN)
fun handleShare(event: OnShareEvent) {
    // TODO: Your code logic goes here
}

第 4 步: Post 事件

class MyBroadcastReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context, intent: Intent) {
        EventBus.getDefault().post(OnShareEvent)
    }
}