我的应用程序上有很多共享按钮。当按下共享按钮时,会向用户显示一个选择器,用户可以选择一个应用程序来共享内容。我想知道用户选择了什么,所以我决定使用BroadcastReceiver
和Intent.createChooser()
方法。
但我在应用程序中有多个共享按钮,所以我定义了以下类:
class MyBroadcastReceiver(val listener: MyBroadcastReceiverListener) : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
listener.handleShare()
}
interface MyBroadcastReceiverListener {
fun handleShare()
}
}
我想从不同的地方使用这个类来实现MyBroadcastReceiverListener
(Activity1、Activity2、Activity3等(,这样我就可以在每个地方对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
。有办法解决这个问题吗?感谢您的支持!😊
故事:在用户从应用程序选择器对话框中选择应用程序后运行代码块。您不应该将活动作为侦听器传递,因为这可能会泄露活动(即使活动被销毁,应用程序也可能保留对该活动的引用(。
解决方案:使用EventBus实现您的目标。
步骤1:通过gradle 将EventBus添加到您的项目中
implementation 'org.greenrobot:eventbus:3.2.0'
步骤2:定义事件
object OnShareEvent
步骤3:注册/注销活动中的侦听事件,如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:事件后
class MyBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
EventBus.getDefault().post(OnShareEvent)
}
}