簡単なリマインダーアプリを書いています。すべてのリマインダーはDBに保存されます。DBにクエリを実行し、AlarmManagerで追加のタイムスタンプと異なるタイムスタンプを使用してpendingIntentsを作成するサービスがあります。また、AlarmManagerからインテントをキャッチするためのブロードキャストレシーバーがあります。このブロードキャストレシーバーは、リマインダーのオプション(却下、スヌーズなど)を使用してリマインダーアクティビティを開始します。現在、このスキームは機能しますが、私が思うほど良くはありません。フォアグラウンドでリマインダーアクティビティがある場合、新しいリマインダーアクティビティが開始されます(現在はバックグラウンドになります)。現在のアクティビティを新しいアクティビティで上書きせず、現在のアクティビティの後に表示される新しいリマインダーがあることをユーザーに通知したいだけです。
1 に答える
私が思うに、私は自分のタスクに適した解決策を見つけました。
1)AndroidManifestで、リマインダーアクティビティlaunchModeが「singleTop」になるように設定しました。launchModeの詳細については、こちらをご覧くださいhttp://developer.android.com/guide/topics/manifest/activity-element.html 2つの言葉で言えば、ブロードキャストレシーバーがすでにフォアグラウンドにあるアクティビティを開始しようとすると、onCreateではなくonNewIntentを呼び出します。
2)私のアクティビティでは、onNewIntentメソッドをオーバーライドし、(ブロードキャストからの)すべての着信インテントをArrayListに格納する必要があります。
3)finish()の前に、ArrayListから現在のインテントを削除する必要があります。サイズがゼロになったら、実際にアクティビティをfinish()します。
1つの重要な追加。ブロードキャストレシーバーのインテントには、次のようなFLAG_ACTIVITY_SINGLE_TOPが必要です。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);
これがないと、onNewIntentに存在するメインアクティビティは呼び出されません。私が見るように、これは既知の問題です:http ://code.google.com/p/android/issues/detail?id= 4155 Android 1.6でバグが見つかり、まだ存在しています。だから今それは機能です:)
私の英語は申し訳ありませんが、読むのは簡単ですが、書くのは難しいです:)