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