21

Ich versuche, Informationen von der Benachrichtigung zu aufgerufenen Aktivität zu senden, während von meiner Aktivität ich null.Android Benachrichtigung PendingIntent Extras null

Der Code für die Benachrichtigung ist:

private void showNotification() { 
Intent resultIntent = new Intent(this, MainActivity.class); 
if (D) 
    Log.d(TAG, "Id: " + Id); 
resultIntent.putExtra("ineedid", deviceId); 

TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); 
stackBuilder.addParentStack(MeterActivity.class); 
stackBuilder.addNextIntent(resultIntent); 
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, 
    PendingIntent.FLAG_UPDATE_CURRENT); 
// Bundle tmp = resultIntent.getExtras(); 
// if (tmp == null) { 
// Log.d(TAG, "tmp bundle is null"); 
// } else { 
// long id = tmp.getLong("ineedid", -1); 
// Log.d(TAG, "tmp id : " + id); 
// } 
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
    BLEMessengerService.this) 
    .setSmallIcon(R.drawable.ic_action_search) 
    .setContentTitle("Event tracker") 
    .setContentText("Events received").setOngoing(true) 
    .setContentIntent(resultPendingIntent) 
    .setWhen(System.currentTimeMillis()); 

int mId = R.string.service_notification_start_service; 
mNM.notify(mId, mBuilder.getNotification()); 
} 

-Code für Informationen aus Absicht in Haupttätigkeit zu erhalten;

Bundle extras = getIntent().getExtras(); 
if (extras != null) { 
    long deviceID = getIntent().getLongExtra("ineedid", 
     -1); 
    if (ID == -1) { 
    if (D) 
     Log.i(TAG_D, "Wrong Id received."); 
    finish(); 
    } else { 
    device = dataSource.getDeviceByID(deviceID); 
    if (D) 
     Log.i(TAG_D, "Get the id."); 
    } 
} else { 
    if (D) 
    Log.d(TAG_D, "Bundle is null"); 
    finish(); 
} 

Ich habe überprüft, bevor die Benachrichtigung benachrichtigt werden, Bundle ist nicht null, und es hat ID in Extras. Während ich versuchte, es aus der Absicht zu holen, ist es weg. Hilfe.

+0

Ich habe auch versucht, "resultIntent.addFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP);", aber keine Arbeit. – antonio081014

+1

Gibt es einen Grund, warum Sie 'resultPendingIntent.getExtras()' nicht verwenden? – PearsonArtPhoto

+0

Ich habe gerade diese Zeilen gemacht, um zu überprüfen, ob mein pendingIntent Extras hat, und ich habe verifiziert, dass es das hat, was ich dort hingelegt habe. – antonio081014

Antwort

8

Ich habe gerade die Antwort, add line: resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

HINWEIS: Wenn Sie es als resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); hinzufügen wird es nicht funktionieren.

Ich versuchte auch andere Flags wie "FLAG_ACTIVITY_NEW_TASK" und "FLAG_ACTIVITY_RESET_TASK_IF_NEEDED". das funktioniert hier nicht.

+1

Ich habe das gleiche versucht. Irgendwelche Anhaltspunkte in der Dokumentation, warum dieses Flag benötigt wird? Es heißt nur "Wenn diese Option aktiviert ist, wird die Aktivität nicht gestartet, wenn sie bereits oben im Verlaufsstapel ausgeführt wird." – mparaz

21

Für mich neben Intent.FLAG_ACTIVITY_SINGLE_TOP Einstellung, ich eine einzigartige Aktion der Absicht hinzuzufügen hatte:

Intent resultIntent = new Intent(caller, NotificationActivity.class); 

    String xId = getNextUniqueId(); 
    resultIntent.putExtra("x_id", xId); 
    resultIntent.setAction(xId); 
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 

.. ohne setAction (..), sind Extras null auf dem Intent erhalten von meiner NotificationActivity.

Dieser Beitrag hilft es erklären: https://stackoverflow.com/a/3128271/2162226

13

in PendingIntent PendingIntent.FLAG_UPDATE_CURRENT diesen Flag verwenden, es ist Arbeit für mich

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); 
0

Ich war in einem lokalen Benachrichtigungen Plugin für die Einheit zu arbeiten, wenn ich das gleiche Problem aufgetreten -> Ich startete die App, plante die lokale Benachrichtigung, schickte die App an den Hintergrund, lokale Benachrichtigung erschien und, als ich darauf klickte, wurde die App wieder aufgenommen und getIntent().getExtras() war null.

In meinem Fall war das Problem, dass ich versuchte, die Extras in der falschen Absicht zu bekommen. Versuchen Sie, die Absichten mit einem einfachen toString zu drucken, zum Zeitpunkt der Erstellung und wenn Sie es erhalten, um sicherzustellen, dass das empfangene ist, was Sie erwarten.

Schauen Sie auch auf die onNewIntent Methode.

Verwandte Themen