Android RecyclerAdapter 中的 Kotlin Broad Receiver 不会与 MainActivity 中的 Broadcast Receiver 通信
Android Kotlin Broad Receiever in RecyclerAdapter Won't Communicate to Broadcast Receiever in MainActivity
上下文:清单中没有声明接收者,因为我没有声明新的接收者。
我有点疑惑为什么MainActivity中的receiver收不到recycler adapter发来的广播
回收器适配器
holder.checkBox.setOnClickListener {view ->
item.completed = holder.checkBox.isChecked
Log.i("wow", "is checked: ${holder.checkBox.isChecked}")
val intent = Intent().apply {
addCategory(Intent.CATEGORY_DEFAULT)
setAction(changeCompletedForDeck)
putExtra(changeCompletedForDeckItemID, item)
}
LocalBroadcastManager.getInstance(view.context).sendBroadcast(intent)
主要活动
private lateinit var broadcastReceiver: BroadcastReceiver
broadcastReceiver = object: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
//get deck, if deck != null then update the checkmark response
if (intent?.action == DeckRecyclerAdapter.changeCompletedForDeck) {
val deck = intent?.extras?.getParcelable<Deck>(DeckRecyclerAdapter.changeCompletedForDeckItemID)
Log.i("wow", "${deck?.title}")
deck?.let { deck ->
globalViewModel.update(deck)
}
}
}
}
val filter = IntentFilter(DeckRecyclerAdapter.changeCompletedForDeck)
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, filter)
//Destroy the BroadcastReceiver
override fun onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)
super.onDestroy()
}
您的问题是 Intent
操作。查看注册时您没有提供任何操作,因此系统不会识别收件人。
您可以使用 IntentFilter
定义特定操作,并在注册和 sendBroadcast
.
期间使用相同的操作
要识别不同的条件,您可以做两件事。
- 您可以在
Bundle
中设置数据并验证 onReceive()
中的包值
- 您还可以向
IntentFilter
添加多个操作并在 onReceive()
See this. 中验证操作
所以第一种方法在MainActivity
中有一个恒定的动作:-
companion object{
const val BROADCAST_ACTION="LIST_CHECK_ACTION"
}
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(BROADCAST_ACTION)).
然后发送广播使用下面的代码 addCategory(Intent.CATEGORY_DEFAULT)
不是必需的:-
val intent = Intent().apply {
action = MainAcvity.BROADCAST_ACTION
putExtra("item", item)
}
LocalBroadcastManager.getInstance(view.context).sendBroadcast(intent)
PS- 但是我认为您不应该使用 Broadcastreceiver
只是为了提供来自 Adapter
的回调不止于此。您应该为它使用回调侦听器。由于 RecyclerView.Adapter
将绑定到 UI 组件,因此回调接口会很好。我认为 broadcastReceiver
在这个用例中有点矫枉过正。
上下文:清单中没有声明接收者,因为我没有声明新的接收者。
我有点疑惑为什么MainActivity中的receiver收不到recycler adapter发来的广播
回收器适配器
holder.checkBox.setOnClickListener {view ->
item.completed = holder.checkBox.isChecked
Log.i("wow", "is checked: ${holder.checkBox.isChecked}")
val intent = Intent().apply {
addCategory(Intent.CATEGORY_DEFAULT)
setAction(changeCompletedForDeck)
putExtra(changeCompletedForDeckItemID, item)
}
LocalBroadcastManager.getInstance(view.context).sendBroadcast(intent)
主要活动
private lateinit var broadcastReceiver: BroadcastReceiver
broadcastReceiver = object: BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
//get deck, if deck != null then update the checkmark response
if (intent?.action == DeckRecyclerAdapter.changeCompletedForDeck) {
val deck = intent?.extras?.getParcelable<Deck>(DeckRecyclerAdapter.changeCompletedForDeckItemID)
Log.i("wow", "${deck?.title}")
deck?.let { deck ->
globalViewModel.update(deck)
}
}
}
}
val filter = IntentFilter(DeckRecyclerAdapter.changeCompletedForDeck)
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, filter)
//Destroy the BroadcastReceiver
override fun onDestroy() {
LocalBroadcastManager.getInstance(this).unregisterReceiver(broadcastReceiver)
super.onDestroy()
}
您的问题是 Intent
操作。查看注册时您没有提供任何操作,因此系统不会识别收件人。
您可以使用 IntentFilter
定义特定操作,并在注册和 sendBroadcast
.
要识别不同的条件,您可以做两件事。
- 您可以在
Bundle
中设置数据并验证onReceive()
中的包值
- 您还可以向
IntentFilter
添加多个操作并在onReceive()
See this. 中验证操作
所以第一种方法在MainActivity
中有一个恒定的动作:-
companion object{
const val BROADCAST_ACTION="LIST_CHECK_ACTION"
}
LocalBroadcastManager.getInstance(this).registerReceiver(broadcastReceiver, IntentFilter(BROADCAST_ACTION)).
然后发送广播使用下面的代码 addCategory(Intent.CATEGORY_DEFAULT)
不是必需的:-
val intent = Intent().apply {
action = MainAcvity.BROADCAST_ACTION
putExtra("item", item)
}
LocalBroadcastManager.getInstance(view.context).sendBroadcast(intent)
PS- 但是我认为您不应该使用 Broadcastreceiver
只是为了提供来自 Adapter
的回调不止于此。您应该为它使用回调侦听器。由于 RecyclerView.Adapter
将绑定到 UI 组件,因此回调接口会很好。我认为 broadcastReceiver
在这个用例中有点矫枉过正。