緊急アラートに使用されるアプリを設計しています。アラートはサーバーから送信され、そのサーバーへの接続は維持されます。
サービスがサーバーから緊急リクエストを受け取ると、特定のアクティビティが開いているかどうかを確認します。その場合、緊急事態が発生したことを通知し、アクティビティはいくつかのオプションを含むダイアログ アクティビティを起動します。次に、この新しいダイアログ アクティビティの結果を処理します。
ただし、サービスがアクティビティが開いていないことに気付いた場合は、とにかくダイアログを起動してください。これは良い習慣ではないことはわかっていますが、この緊急事態の重要性のため、通知に依存したくありません (アプリがまだ緊急事態をリッスンしていることをユーザーに知らせるためにアクティビティが閉じられている場合、通知は既に使用されています) )。
現在起こっていることは、以下のコードがサービスで実行され、ダイアログが起動することです。ただし、「メイン」アクティビティ (アプリ内の唯一の他のアクティビティ) もダイアログの背後で開きます。私が本当にしたいことは、どちらか...
1) サービスは、結果を簡単に取得できるようにダイアログを開くメイン アクティビティを起動します。
2) サービスはダイアログ アクティビティのみを起動し、ブロードキャスト レシーバーを使用してこのアクティビティの結果をキャプチャします。
1 は、アクティビティからの結果を取得するために既に存在するメカニズムを使用します。しかし、このように活動を連鎖させるという考えは好きではありません。
2 は、メイン アクティビティをまとめて無視できることを意味します (この例では必要ないため)。
私が本当に求めているのは2つのことです。私の状況でのベスト プラクティスは何ですか? 2 番を達成するにはどうすればよいですか? これが私のサービスの起動コードです。このコードの通知は、開くダイアログ アクティビティを参照しています。
if (MainActivity.isActivityInUI) {
//Dealt with by activity
sendMessageAlert(message);
} else {
//Launch dialog directly from service
Intent notification = new Intent(this,
EmergencyNotificationActivity.class);
Bundle args = new Bundle();
args.putString(MobileMessage.EXTRA_LOCATION_NAME,
message.locationName);
args.putString(MobileMessage.EXTRA_ID,
String.valueOf(message.id));
args.putDouble(MobileMessage.EXTRA_LATITUDE,
Double.valueOf(message.latitude));
args.putDouble(MobileMessage.EXTRA_LONGITUDE,
Double.valueOf(message.longitude));
//and the flag to let the notification know this is from a service...
args.putBoolean(EXTRA_FROM_SERVICE, true);
notification.putExtras(args);
//add flag because this is being called from outside of an activity
notification.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK |ActivityInfo.LAUNCH_SINGLE_INSTANCE);
startActivity(notification);