web-dev-qa-db-fra.com

Android Notification PendingIntent Extras null

J'essaie d'envoyer des informations de la notification à l'activité invoquée, tandis que de mon activité, je suis devenu nul.

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 sur 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 ne soit notifiée, le paquet n'est pas nul et il a un identifiant dans les extras. Tandis que, quand j'ai essayé de le récupérer de l'intention, c'est parti. Aidez-moi.

40
antonio081014

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

AVIS: si vous l'ajoutez en tant que resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); Cela ne fonctionnera pas.

J'ai également essayé d'autres indicateurs comme "FLAG_ACTIVITY_NEW_TASK" et "FLAG_ACTIVITY_RESET_TASK_IF_NEEDED". ni ne fonctionne ici.

12
antonio081014

dans PendingIntent, utilisez cet indicateur PendingIntent.FLAG_UPDATE_CURRENT c'est du travail pour moi

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

Pour moi, en plus de définir Intent.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 setAction (..), Extras est nul sur l'intention reçue par ma NotificationActivity.

Ce message aide à l'expliquer: https://stackoverflow.com/a/3128271/2162226

29
Gene Bo

Lorsqu'une activité est lancée (lorsqu'elle est lancée pour la première fois) ou relancée (lorsqu'elle est placée en haut de la pile), la getIntent().getExtra() ne donnera pas null. Mais lorsque l'activité est présente en haut de la pile , le démarrage de cette activité avec l'utilisation de PendingIntent ne relancerait pas l'activité. (onCreate() ne sera pas appelé) à la place onResume() sera appelé. Et getIntent().getExtra() retournerait la valeur qui est associée à l'intention qui a démarré l'activité (qui est null).
Pour mettre à jour l'intention, procédez comme suit:

1). Définissez FLAG_ACTIVITY_SINGLE_TOP Et FLAG_ACTIVITY_CLEAR_TOP Dans votre intention.

resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

2). Substituez onNewIntent() dans l'activité où getIntent().getExtra() est appelée. Cette méthode est appelée par FLAG_ACTIVITY_SINGLE_TOP

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}

Pour plus d'informations: Voir ce doc

8
Neeraj Sewani

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

Dans mon cas, le problème était que j'essayais d'obtenir les extras à la mauvaise intention. Essayez d'imprimer les intentions avec une chaîne toString simple, au moment de la création et lorsque vous l'obtenez, pour vous assurer que le reçu est ce que vous attendez.

Jetez également un œil à la méthode onNewIntent .

1
jbourne