web-dev-qa-db-ja.com

ブロードキャストにPendingIntentを介してデータを送信する方法は?

PendingIntent経由で次のような追加データを送信しようとしています。

_MyMessage message;
//...
Intent intent;
SmsManager sms = SmsManager.getDefault();
intent = new Intent(Constants.SENT_PLAIN);
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId()); //putting long id (not -1L)
PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent, 0);
intent = new Intent(Constants.DELIVERED_PLAIN);
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId());
PendingIntent deliveredPI = PendingIntent.getBroadcast(activity, 0, intent, 0);
sms.sendTextMessage(phoneNumber, null, message.getBody(), sentPI, deliveredPI);
_

次に、Broadcastでデータをキャッチしようとしています:

_@Override
public void onReceive(Context context, Intent intent) {
    String message, prefix = "";
    String action = intent.getAction();
    long id = intent.getLongExtra(Constants.EXTRA_RAW_ID, -1L);  //here I receive id=-1

    // blah-blah.... 
}
_

BroadcastonReceive()が呼び出されたことがわかります-これは、Broadcastが適切な方法で登録されていることを意味しますが、それでもエキストラは空です。

何か案は?

16

保留中のインテントで使用しているインテントにデータをエクストラとして配置します。このインテントは、onReceiveレシーバーのBroadCastメソッドで取得します。保留中のインテントを次のように定義してみてください。

PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent,PendingIntent.FLAG_CANCEL_CURRENT);
37
om252345

で述べたように 保留中の意図

この動作のため、PendingIntentを取得するために、2つのインテントが同じであると見なされるタイミングを知ることが重要です。よくある間違いは、「余分な」コンテンツのみが異なるインテントを使用して複数のPendingIntentオブジェクトを作成し、毎回異なるPendingIntentを取得することを期待することです。これは発生しませんは発生しません。マッチングに使用されるインテントの部分は、 _Intent.filterEquals_ で定義されているものと同じです。 _Intent.filterEquals_ のように同等の2つのIntentオブジェクトを使用すると、両方で同じPendingIntentを取得します。

これに対処する2つの典型的な方法があります。

複数の異なるPendingIntentオブジェクトを同時にアクティブにする必要がある場合(両方が同時に表示される2つの通知として使用する場合など)、それらを異なるものに関連付けるには、それらについて異なるものがあることを確認する必要があります。保留中のインテント。これは、 _Intent.filterEquals_ によって考慮されるIntent属性のいずれか、または getActivity(Context, int, Intent, int)getActivities(Context, int, Intent\[\], int)getBroadcast(Context, int, Intent, int) 、または getService(Context, int, Intent, int)

使用するインテントのいずれかに対して一度に1つのPendingIntentのみをアクティブにする必要がある場合は、代わりにフラグ _FLAG_CANCEL_CURRENT_ または _FLAG_UPDATE_CURRENT_ を使用できます。 =指定しているインテントに関連付けられている現在のPendingIntentをキャンセルまたは変更します。

11
FxRi4