Intent.createChooser() 中使用的 BroadcastReceiver 的参数
Arguments for a BroadcastReceiver used inside Intent.createChooser()
我的应用程序上有很多分享按钮。按下共享按钮时,会向用户显示一个选择器,以便他可以 select 一个应用程序来共享内容。我想知道用户选择了什么,所以我决定使用 BroadcastReceiver
和 Intent.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)
}
}
我的应用程序上有很多分享按钮。按下共享按钮时,会向用户显示一个选择器,以便他可以 select 一个应用程序来共享内容。我想知道用户选择了什么,所以我决定使用 BroadcastReceiver
和 Intent.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)
}
}