【问题标题】:How to make interface to be used by Clients : Android如何制作供客户使用的界面:Android
【发布时间】:2013-07-21 15:03:04
【问题描述】:

我想创建一个 Android 框架服务并发布一个侦听器接口来更新客户端的更新。我不想为应用程序创建 register_XX() 和 unregister_XX() 方法来提供侦听器参考。我想要的是,应用程序只需实现该侦听器接口,而无需调用任何 register/unregister 方法即可收到更改通知。

我该如何实现?

【问题讨论】:

    标签: android service interface frameworks


    【解决方案1】:

    有什么好的理由反对注册/取消注册吗?如果您调用接口*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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-24
      • 2015-07-13
      相关资源
      最近更新 更多