0

Android フレームワーク サービスを作成し、更新時にクライアントを更新するリスナー インターフェイスを公開したいと考えています。アプリケーションがリスナー参照を提供するために register_XX() & unregister_XX() メソッドを作成したくありません。私が望むのは、アプリケーションは単にそのリスナーインターフェイスを実装し、登録/登録解除メソッドを呼び出さずに変更が通知されることです。

どうすればそれを実装できますか?

4

1 に答える 1

2

登録/登録解除に対する正当な理由はありますか? インターフェイスを呼び出すと、*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;
}
于 2013-07-22T19:27:10.173 に答える