Androïde Notification PendingIntent Extras null

j'essaie d'envoyer des informations de la notification à l'activité invoquée, alors que de mon activité j'ai obtenu null.

le code de notification est:

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 pour obtenir des informations à partir de l'intention de l'activité principale;

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

j'ai vérifié avant que la notification soit notifiée, bundle n'est pas null, et il a id en extras. Pendant que, quand j'ai essayé de le récupérer de l'intention, il a disparu. Aider.

25
demandé sur antonio081014 2012-11-28 05:42:30

5 réponses

pour moi, en plus de fixer L'intention.FLAG_ACTIVITY_SINGLE_TOP , j'ai dû ajouter une action unique à l'intention:

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

.. sans la setAction(..), Les Extras est nul sur l'Intention reçues par mon NotificationActivity.

Ce poste contribue à expliquer: https://stackoverflow.com/a/3128271/2162226

22
répondu gnB 2017-05-23 11:55:07

dans PendingIntent l'utilisation de ce drapeau PendingIntent.FLAG_UPDATE_CURRENT c'est un travail pour moi

PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
20
répondu Oubaida AlQuraan 2016-03-28 21:17:34

je viens de recevoir la réponse, ajoutez la ligne: resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

attention: si vous l'ajoutez comme resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); Il ne fonctionnera pas.

11
répondu antonio081014 2012-11-28 02:09:36

je travaillais dans un plugin de notification locale pour Unity quand j'ai rencontré le même problème - > j'ai lancé l'application, programmé la notification locale, envoyé l'application en arrière plan, la notification locale est apparue et, quand j'ai cliqué dessus, l'application a été reprise et getIntent().getExtras()null.

Dans mon cas, le problème était que je cherchais à obtenir les extras à la mauvaise intention. Essayez d'imprimer les intentions d'un simple toString, à la création moment et quand vous l'obtenez, pour s'assurer que le reçu est ce que vous attendez.

jetez également un coup d'oeil à la onNewIntent méthode.

1
répondu jbourne 2017-10-26 06:37:35

quand une activité est lancée(quand elle est lancée pour la première fois) ou relancée(quand elle est portée en haut de la pile) le getIntent().getExtra() ne pas donner null. Mais quand l'activité est présente sur le haut de la pile puis en commençant cette activité avec l'utilisation de PendingIntent ne relancerait pas l'activité(onCreate() ne sera pas obtenir de l'appelé) au lieu de onResume() serait appelé. Et getIntent().getExtra() retourne la valeur qui est associée avec l'intention qu'a commencé l'activité(ce qui est