【发布时间】:2013-07-21 15:03:04
【问题描述】:
我想创建一个 Android 框架服务并发布一个侦听器接口来更新客户端的更新。我不想为应用程序创建 register_XX() 和 unregister_XX() 方法来提供侦听器参考。我想要的是,应用程序只需实现该侦听器接口,而无需调用任何 register/unregister 方法即可收到更改通知。
我该如何实现?
【问题讨论】:
标签: android service interface frameworks
我想创建一个 Android 框架服务并发布一个侦听器接口来更新客户端的更新。我不想为应用程序创建 register_XX() 和 unregister_XX() 方法来提供侦听器参考。我想要的是,应用程序只需实现该侦听器接口,而无需调用任何 register/unregister 方法即可收到更改通知。
我该如何实现?
【问题讨论】:
标签: android service interface frameworks
有什么好的理由反对注册/取消注册吗?如果您调用接口*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;
}
【讨论】: