Android PendingIntentのフラグ

Android

Android PendingIntentのフラグ

PendingIntentは今すぐスタートするIntentではないけど、タイミングが来たら使うよー というIntentです。

 PendingIntent replyPendingIntent =
        PendingIntent.getActivity(context, 0, replyIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT);

などとして作ります。

今回私がハマってしまったのは、Android Wearの開発にて出てきた次のような問題です。

  1. メッセージ受信
  2. そのメッセージを音声で返事する

というものですが、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を選択しないといけなかったわけですね!

メッセージは新しくなっていたので、フラグのことを気にしていなかったのですが、なんか意外な落とし穴でした!

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です