Android フレームワーク サービスを作成し、更新時にクライアントを更新するリスナー インターフェイスを公開したいと考えています。アプリケーションがリスナー参照を提供するために register_XX() & unregister_XX() メソッドを作成したくありません。私が望むのは、アプリケーションは単にそのリスナーインターフェイスを実装し、登録/登録解除メソッドを呼び出さずに変更が通知されることです。
どうすればそれを実装できますか?
Android フレームワーク サービスを作成し、更新時にクライアントを更新するリスナー インターフェイスを公開したいと考えています。アプリケーションがリスナー参照を提供するために register_XX() & unregister_XX() メソッドを作成したくありません。私が望むのは、アプリケーションは単にそのリスナーインターフェイスを実装し、登録/登録解除メソッドを呼び出さずに変更が通知されることです。
どうすればそれを実装できますか?
登録/登録解除に対する正当な理由はありますか? インターフェイスを呼び出すと、*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;
}