現在実行中のアクティビティのopenOptionsMenu()を呼び出す必要があるサービス(通信用)があります。サービスからのこのリクエストに応じてオプションメニューを表示する必要があるアクティビティが約3つあります。この現在実行中のアクティビティを見つけるにはどうすればよいですか?
2 に答える
私はその行動計画を忠告しません。ユーザーの許可や事前の知識なしにUI機能を操作することは不親切です。ただし、これを行うには、静的フィールドまたはアプリケーション拡張のフィールド(またはシングルトンステートマシンなど)を介して維持されるアクティビティへの確実な参照が必要になります。
私が提案するのは、アクティブなアクティビティからbindService()を呼び出して、サービスへの接続を開くことです。サービスのバインダー接続で定義されているメソッドの1つは、引数としてバインダーを使用する必要があります。アクティビティはこのバインダーをインスタンス化し、サービスのバインダーメソッドに渡します。興味深いイベントが発生すると、サービスはアクティビティが渡したバインダーのメソッドを呼び出す必要があります。
アクティビティの1つがバックグラウンドに入ると、以前に渡されたバインダーの登録を解除し、サービスからバインドを解除する必要があります。
つまり、次のようなサービスのAIDLがあります。
interface IServiceConnection {
void registerCallback(IActivityCallback callback);
void unregisterCallback(IActivityCallback callback);
}
次に、次のようなIActivityCallback.aidlがあります。
oneway interface IActivityCallback {
void openOptionsMenu();
}
あなたのサービスではあなたが持っています
private ArrayList<IActivityCallback> mCallbacks = new ArrayList<IActivityCallback>();
private IServiceConnection.Stub mBinder = new IServiceConnection.Stub() {
public void registerCallback(IActivityCallback callback) {
mCallbacks.add(callback);
}
public void registerCallback(IActivityCallback callback) {
mCallbacks.remove(callback);
}
}
private void onEvent() {
for (int ptr = mCallbacks.size() - 1; ptr > -1; ptr--) {
mCallbacks.get(ptr).openOptionsMenu();
}
}
サービスのonBindメソッドで、mBinderを返します。
あなたの活動ではあなたは
private IActivityCallback.Stub mPlayerBinder = new IActivityCallback.Stub() {
public void openOptionsMenu() {
// call method in Activity to show options menu
}
}
bindService呼び出しを使用してアクティビティからサービスにバインドし、ServiceConnectionがonServiceConnectedを受信したら、そのスタブをIServiceConnectionにキャストしてから、registerCallbackメソッドを呼び出します。