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.

期间使用相同的操作

要识别不同的条件,您可以做两件事。

  1. 您可以在 Bundle 中设置数据并验证 onReceive()
  2. 中的包值
  3. 您还可以向 IntentFilter 添加多个操作并在 onReceive() See this.
  4. 中验证操作

所以第一种方法在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 在这个用例中有点矫枉过正。