Android PendingIntentのフラグ
PendingIntentは今すぐスタートするIntentではないけど、タイミングが来たら使うよー というIntentです。
PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
などとして作ります。
今回私がハマってしまったのは、Android Wearの開発にて出てきた次のような問題です。
- メッセージ受信
- そのメッセージを音声で返事する
というものですが、2回目以降の音声の返事が、1回目のしか取れない…。
なーんでかっ。
というと、下記のようにやっていたのですが
Intent intent = getIntent(); CharSequence voice_massage = getMessageText(intent); private CharSequence getMessageText(Intent intent) { Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); if (remoteInput != null) { return remoteInput.getCharSequence(EXTRA_VOICE_REPLY); } return null; }
そもそも、このgetIntent()で取得するIntentの中身が2回目以降更新されていない。
最初は、Intentに設定するフラグの方がおかしいのかな?
と思ってました。
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
というアレです。
しかし、これではなく、PendingIntentにつけるフラグが問題だったんです。
3番目の引数のフラグは、FLAG_CANCEL_CURRENTでないといけなかったんですね。
一番最初に書いた、PendingIntentのコードは下記のようになります。
PendingIntent replyPendingIntent = PendingIntent.getActivity(context, 0, replyIntent, PendingIntent.FLAG_CANCEL_CURRENT);
下記の公式ドキュメントを見ますと、
http://developer.android.com/reference/android/app/PendingIntent.html
FLAG_UPDATE_CURRENT…既存のPendingIntentがあれば、それはそのままでextraのデータだけ置き換える
FLAG_CANCEL_CURRENT…既存のPendingIntentがあれば、それをキャンセルして、新しいPendingIntentを実行する
ということです。
今回はIntent自体新しくしないといけなかったので、FLAG_CANCEL_CURRENTを選択しないといけなかったわけですね!
メッセージは新しくなっていたので、フラグのことを気にしていなかったのですが、なんか意外な落とし穴でした!