27


23

通知によるアクティビティの開始:アクティビティの重複を避ける

そのため、現在通知を表示しています。 ユーザーがこの通知をクリックすると、アプリケーションが開始されます。 通知は持続し、サービスがバックグラウンドで実行されていることを示します。

Intent notificationIntent = new Intent(context, LaunchActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent);
mNotificationManager.notify(1, notification);

しかし、バグが発生するケースを検出しました。 ユーザーが通常のアイコンをクリックしてアプリケーションを起動し、アクティビティの実行中に通知をクリックすると、新しいアクティビティが開始され、前のアクティビティは終了せず、後のアクティビティが上になります。 それだけではありません。通知をさらにクリックすると、追加のアクティビティが作成され、既に実行されているアクティビティの上に配置されます。 どうすればこれを防ぐことができますか? 特定のアクティビティが現在表示されているか、ロードされているかどうかを確認するための適切なチェックはありますか?

3 Answer


37


これがデフォルトの方法です。 インスタンスを1つだけにしたい場合は、おそらく `android:launchMode =" singleTop "`を指定する必要があります。 + 4つの起動モードがあり、詳細はこちら:https://developer.android.com/guide/topics/manifest/activity-element.html


10


`lanchMode =" singleTask "`を使用する場合、アクティビティのインスタンスが既に存在する場合、Androidはアクティビティを再作成せずに、 `onNewIntent()`メソッドで起動します。

Androidで文書化されているとおり:

_ システムは、新しいタスクのルートにアクティビティを作成し、インテントをそれにルーティングします。 ただし、アクティビティのインスタンスが既に存在する場合、システムは、新しいインスタンスを作成するのではなく、onNewIntent()メソッドを呼び出して、インテントを既存のインスタンスにルーティングします。 _

http://developer.android.com/guide/topics/manifest/activity-element.html#lmode [アクティビティモードのAndroidドキュメント]


2


上記の2つの回答で述べたように、マニフェストのアクティビティの定義で定義されているアプリケーションの起動モードを設定する必要があります。


さらに、FLAG_ACTIVITY_SINGLE_TOPが有効なIntentフラグであるにもかかわらず、singleTaskまたはsingleInstanceに同等のインテントフラグがないことに注意してください。

さまざまな起動モードオプションの詳細については、launchModeセクションを参照してください。http://developer.android.com/guide/topics/manifest/activity-element.html#lmode