14

私はのように、PendingIntent経由でいくつかの余分なデータを送信しようとしている:私はBroadcastonReceive()と呼ばれることがわかりPendingIntentを介してブロードキャストにデータを送信する方法は?

@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が登録することを意味します。データをキャッチしようBroadcastに続いて

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); 

適切な方法で、しかしまだ余分なものは空です。

アイデア?

+0

私はこれと同様のことをしました! http://stackoverflow.com/questions/14571564/android-pendingintent-extras-not-received-by-broadcastreceiver/14612215#14612215 – toobsco42

答えて

34

保留中のインテントで使用しているインテントのデータをエクストラとして保存します。 あなたはこの目的をonReceiveBroadCastの受信者に得ます。 保留中のインテントを以下のように定義してください。

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

私はそれをチェックします... – barmaley

+0

そしてはい、それは動作します!どうもありがとう! – barmaley

+1

その後、受け入れられたバディまたは質問は未回答として残ります:)。 – om252345

10

pending intentに言ったように:

この動作のため、2つのインテントは、PendingIntentを取得する目的のために同じであると考えられている際に知っておくことが重要です。人々がよくやっている間違いは、「余分な」内容だけが変化するインテントを持つ複数のPendingIntentオブジェクトを作成し、毎回異なるPendingIntentを取得することを期待することです。これはではなく、が発生します。照合に使用されるインテントの部分は、Intent.filterEqualsで定義されたものと同じです。 Intent.filterEqualsと同等の2つのインテントオブジェクトを使用する場合は、それらの両方に対して同じPendingIntentが取得されます。

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

あなたが本当に複数の異なるPendingIntentを必要とする場合は、 で(例えば、両方同時に を示している2つの通知として使用するように)同じ時間にアクティブなオブジェクト、あなたは違う何か があることを確認する必要があります。それらを異なる PendingIntentsに関連付けるように指示します。これは Intent.filterEqualsによって考慮意図属性、又は getActivity(Context, int, Intent, int)getActivities(Context, int, Intent\[\], int)getBroadcast(Context, int, Intent, int)、または getService(Context, int, Intent, int)に供給された異なる要求コードの整数のいずれであってもよいです。あなただけが使用する テントのいずれかの時間でアクティブなPendingIntentが必要な場合は

、そしてあなたは、代わりにキャンセルや意図に関連付けられている現在のどんなPendingIntent を変更するのいずれかのフラグ FLAG_CANCEL_CURRENTFLAG_UPDATE_CURRENTを使用することができます供給は です。

関連する問題