【问题标题】:BroadcastReceiver has no default constructor in android manifestBroadcastReceiver 在 android manifest 中没有默认构造函数
【发布时间】:2016-11-07 18:40:20
【问题描述】:

我正在尝试在 Android 清单中注册一个扩展 BroadcastReceiver 作为接收器的类。我注册它们没有问题,但由于类没有空构造函数而出现问题。

  1. 我不明白为什么 BroadcastReceiver 需要一个空的构造函数,有没有办法解决这个问题?
  2. 我可以在我的类中创建一个公共的空构造函数,但问题是,这个类也是一个单例类。这意味着我不希望此类使用空构造函数!这里有一个明显的冲突,我可以只写一个空的构造函数并相信用户不会通过编写文档来使用它,但必须有一个更简单的方法对吗?

TLDR;如何实现一个作为广播接收器的类(需要空构造函数才能在 android manifest 中注册它)但同时是一个单例类或拒绝用户访问默认构造函数的类。 (我尝试过保护默认构造函数,但这并不能解决问题,因为清单无法注册接收者)

【问题讨论】:

    标签: java android constructor broadcastreceiver


    【解决方案1】:

    有没有办法解决这个问题?

    没有。 Android 不知道如何调用任何其他构造函数,也不知道将什么值传递给该构造函数。

    这个类也是一个单例类

    这是不可能的。 Android 将为它接收到的每个广播创建一个新的清单注册BroadcastReceiver 实例。

    but there has to be a simpler method right?
    

    是的:不要将BroadcastReceiver 设为单例。使 其他一些类 成为 BroadcastReceiver 使用的单例。

    【讨论】:

    • 我不知道android每次都会创建一个新的broadcastreceiver实例!谢谢你的洞察力!幸运的是,我可以稍微改变我的设计,将单例与广播接收器分开。
    【解决方案2】:

    BroadcastReceiver 是一个抽象类,一个类必须扩展它才能在Manifest 上注册为receiver。一旦扩展它,就无法更改其方法的范围,也无法对其强制使用Singleton 模式。如果您尝试将Singleton 设置为您的BroadcastReceiver,则您的设计可能存在问题。

    【讨论】:

      【解决方案3】:

      我认为您可以为此设置一个单例,也可以使用一个非默认构造函数。

      您必须在代码而不是清单中注册广播接收器。 在活动中:

      private var broadcastReceiver : MySmsBroadcastReceiver? = null
      override fun onCreate(savedInstanceState: Bundle?) {
          super.onCreate(savedInstanceState)
          val intentFilter = IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)
          broadcastReceiver = MySmsBroadcastReceiver(myArg1, myArg2)
          registerReceiver( broadcastReceiver, intentFilter)
      }
      

      但您还必须手动取消注册广播接收器:

      override fun onStop() {
          unregisterReceiver(broadcastReceiver)
          super.onStop()
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 2023-03-20
        • 2016-07-18
        • 1970-01-01
        • 2021-09-19
        • 1970-01-01
        相关资源
        最近更新 更多