BroadcastReceiver在android清单中没有默认构造函数

时间:2016-11-07 18:40:20

标签: java android constructor broadcastreceiver

我正在尝试注册一个将BroadcastReceiver扩展为Android清单中的接收器的类。我可以轻松注册它们,但问题出现是因为类没有空构造函数。

  1. 我不明白为什么BroadcastReceiver需要一个空的构造函数,有没有办法解决这个问题?
  2. 我可以在我的班级中创建一个公共空构造函数,但问题是,这个类也是一个单例类。这意味着我不希望这个类使用空构造函数!这里有一个明显的冲突,我可以写一个空的构造函数,并且信任用户不会通过编写文档来使用它,但是必须有一个更简单的方法吗?
  3. TLDR;如何实现一个广播接收器的类(需要空构造函数在android清单中注册它),但同时,是一个单例类或一个拒绝用户访问默认构造函数的类。 (我已尝试使默认构造函数受到保护,但由于清单无法注册接收器,因此无法解决问题)

3 个答案:

答案 0 :(得分:5)

  

有办法解决这个问题吗?

没有。 Android不知道如何调用任何其他构造函数,或者传递给该构造函数的值。

  

这个类也是一个单例类

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

but there has to be a simpler method right?

是:不要让BroadcastReceiver成为单身人士。让其他类成为BroadcastReceiver使用的单例。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

  Widget nestedFutureBuilders(){
    return FutureBuilder(
      future: YourFirstRequest,
      builder: (BuildContext context, AsyncSnapshot<String> snapshotOne) {
        switch (snapshotOne.connectionState) {
          case ConnectionState.none:
            return Text('Press button to start.');
          case ConnectionState.active:
          case ConnectionState.waiting:
            return Text('Awaiting result...');
          case ConnectionState.done:
            if (snapshotOne.hasError)
              return Text('Error: ${snapshotOne.error}');
            return FutureBuilder<String>(
              future: YourSecondRequest, // which is related the first request data (snapshotOne.data).
              builder: (BuildContext context, AsyncSnapshot<String> snapshotTwo) {
                switch (snapshotTwo.connectionState) {
                  case ConnectionState.none:
                    return Text('Press button to start.');
                  case ConnectionState.active:
                  case ConnectionState.waiting:
                    return Text('Awaiting result...');
                  case ConnectionState.done:
                    if (snapshotTwo.hasError)
                      return Text('Error: ${snapshotTwo.error}');
                    return BuildYourUIHere();// you have both data here(snapshotOne.data & snapshotTwo.data)
                }
                return null; // unreachable
              },
            );
        }
        return null; // unreachable
      },
    );
  }

但是您还必须手动注销广播接收器:

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)
}