我想创建一个 Android 框架服务并发布一个侦听器接口来更新客户端的更新。我不想为应用程序创建 register_XX() 和 unregister_XX() 方法来提供侦听器参考。我想要的是,应用程序只需实现该侦听器接口,而无需调用任何 register/unregister 方法即可获得更改通知。
我该如何实施?
我想创建一个 Android 框架服务并发布一个侦听器接口来更新客户端的更新。我不想为应用程序创建 register_XX() 和 unregister_XX() 方法来提供侦听器参考。我想要的是,应用程序只需实现该侦听器接口,而无需调用任何 register/unregister 方法即可获得更改通知。
我该如何实施?
有什么好的理由反对注册/注销?如果您调用接口*Listener
,我希望注册/注销它(从开发人员的角度来看)。
我认为您可以使用一些抽象类 AbstractListener 来实现您的目标,该类在构造函数中注册自身 - 但从架构的角度来看这并不好,并且无法解决注销问题。
例如
public abstract class AbstractUpdateReceiver {
public AbstractUpdateReceiver() {
register();
}
public abstract void onReceive(Update anUpdate);
// optional, only the user should react on registering
public abstract void onRegistered();
// optional, only the user should react on unregistering
public abstract void onUnregistered();
private void register() {
//...do register
onRegistered();
}
public void unregister() {
//do unregister
onUnregistered();
}
}
on(Un)Registered
如果整个注册过程应该对实现应用程序隐藏,则调用和实现不是必需的。但是对于注销,用户仍然必须调用unregister()
,只要您的框架不提供类似clearReceivers()
或clearReceiver(AbstractUpdateReceiver receiver)
另一个(更好)更好的解决方案,没有像从实现应用程序将实现注册/取消注册到框架中的任何东西,将是一个工厂完成整个工作,而不是一个抽象类。在这种情况下,您必须将抽象类拆分为普通类和接口,普通类提供并处理注册,而接口提供方法onUpdateReceived
。然后你将拥有工厂,它从框架中创建并返回类。
public UpdateReceiver createUpdateReceiver(IUpdateReceiver wrapped) {
UpdateReceiver receiver = new UpdateReceiver(wrapped);
receiver.register(); //or register directly into a non-static factory
return receiver;
}