20

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.... 
}

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

何か案は?

4

2 に答える 2

42

保留中のインテントで使用しているデータをエクストラとしてインテントに入れます。このインテントは、受信者onReceiveのメソッドで取得します。BroadCast以下のように Pending インテントを定義してみてください。

PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent,PendingIntent.FLAG_CANCEL_CURRENT);
于 2011-07-19T18:58:57.787 に答える
11

保留中の意図について述べたように:

この動作のため、PendingIntent を取得する目的で、2 つの Intent がいつ同じであると見なされるかを知ることが重要です。人々が犯すよくある間違いは、毎回異なる PendingIntent を取得することを期待して、「余分な」コンテンツのみが異なるインテントを持つ複数の PendingIntent オブジェクトを作成することです。これは起こりません。マッチングに使用される Intent の部分は、 で定義されたものと同じIntent.filterEqualsです。に従って同等の 2 つの Intent オブジェクトを使用するIntent.filterEqualsと、両方に対して同じ PendingIntent が得られます。

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

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

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

于 2014-01-04T13:12:35.057 に答える