我正在尝试注册一个将BroadcastReceiver扩展为Android清单中的接收器的类。我可以轻松注册它们,但问题出现是因为类没有空构造函数。
TLDR;如何实现一个广播接收器的类(需要空构造函数在android清单中注册它),但同时,是一个单例类或一个拒绝用户访问默认构造函数的类。 (我已尝试使默认构造函数受到保护,但由于清单无法注册接收器,因此无法解决问题)
答案 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)
}