14

Próbuję wysłać poprzez PendingIntent jakieś dodatkowe informacje, takie jak:Jak wysłać dane przez PendingIntent do transmisji?

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

potem w Broadcast próbuje złapać dane:

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

widzę, że BroadcastonReceive() nazywa - co oznacza, że ​​Broadcast zarejestrowany w odpowiedni sposób, ale wciąż dodatki są puste.

Wszelkie pomysły?

+0

Zrobiłem coś podobnego TUTAJ !!! http://stackoverflow.com/questions/14571564/android-pendingintent-extras-not-received-by-broadcastreceiver/14612215#14612215 – toobsco42

Odpowiedz

34

Umieść dane w intencji, której używasz w oczekiwaniu na Exses. Otrzymasz tę intencję w odbiorniku onReceive Metoda od BroadCast. Spróbuj zdefiniować oczekującą wersję, jak poniżej.

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

Sprawdzę to ... – barmaley

+0

I tak, to działa! Wielkie dzięki! – barmaley

+1

Następnie oznacz odpowiedź jako zaakceptowany znajomy lub pytanie pozostanie bez odpowiedzi :) .. – om252345

10

jak powiedział pending intent:

powodu tego zachowania, ważne jest, aby wiedzieć, kiedy dwa Intents są uważane za takie same dla celów pobierania PendingIntent. Częstym błędem, jaki popełniają ludzie, jest tworzenie wielu obiektów PendingIntent za pomocą Intents, które różnią się jedynie zawartością "extra", oczekując, że za każdym razem otrzymają inny PendingIntent. To się stanie , a nie. Części intencji używane do dopasowywania są tymi samymi, które zdefiniowano przez Intent.filterEquals. Jeśli użyjesz dwóch obiektów Intent, które są równoważne według Intent.filterEquals, otrzymasz ten sam PendingIntent dla obu z nich.

Istnieją dwa typowe sposoby radzenia sobie z tym.

Jeśli naprawdę potrzeba wiele odrębnych PendingIntent obiekty aktywne tym samym czasie (tak, aby użyć jako dwóch zawiadomień, które są zarówno pokazanych w tym samym czasie), a następnie trzeba będzie zapewnić, że jest coś że jest inna o ich powiązaniu z różnymi PendingIntents. Może to być dowolny z zamiarem cech uznawanych przez Intent.filterEquals lub różne liczby całkowite kod żądanie dostarczane getActivity(Context, int, Intent, int), getActivities(Context, int, Intent\[\], int), getBroadcast(Context, int, Intent, int) lub getService(Context, int, Intent, int).

Jeśli potrzebne jest tylko jedno PendingIntent aktywny w czasie któregokolwiek z zamiarów można użyć, a następnie można alternatywnie użyć flagi FLAG_CANCEL_CURRENT lub FLAG_UPDATE_CURRENT albo anulować lub modyfikować cokolwiek prąd PendingIntent jest skojarzony z zamiarem wy są zasilane .