21

Sto tentando di inviare informazioni dalla notifica all'attività richiamata, mentre dalla mia attività ho ottenuto null.Android Notification PendingIntent Extras null

Il codice per la notifica è:

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

codice per ottenere informazioni da intenti attività 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(); 
} 

Ho verificato prima della notifica ricevere una notifica, fascio non è nullo, ed ha id extra. Mentre, quando ho provato a recuperarlo dall'intento, non c'è più. Aiuto.

+0

Ho anche provato ad aggiungere "resultIntent.addFlags (Intent.FLAG_ACTIVITY_SINGLE_TOP);", ma non funziona. – antonio081014

+1

C'è un motivo per cui non stai usando 'resultPendingIntent.getExtras()'? – PearsonArtPhoto

+0

Ho appena creato quelle righe per verificare se il mio file in sospeso contiene gli extra, e ho verificato che ha ciò che ho inserito. – antonio081014

risposta

8

Ho appena ricevuto la risposta, linea di aggiungere: resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

AVVISO: se si aggiunge come resultIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); Non funzionerà.

Ho anche provato altri flag come "FLAG_ACTIVITY_NEW_TASK" e "FLAG_ACTIVITY_RESET_TASK_IF_NEEDED". non funziona qui

+1

Stavo provando la stessa cosa. Qualche indizio nella documentazione per cui questo flag è necessario? Dice solo "Se impostato, l'attività non verrà avviata se è già in esecuzione nella parte superiore della pila della cronologia." – mparaz

21

Per me, oltre a impostare Intent.FLAG_ACTIVITY_SINGLE_TOP, ho dovuto aggiungere un'azione unica per l'intento:

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

.. senza il setAction (..), Extra è nullo sul Intent ricevuto dal mio NotificationActivity.

Questo post aiuta a spiegarlo: https://stackoverflow.com/a/3128271/2162226

13

in PendingIntent utilizzare questo flag PendingIntent.FLAG_UPDATE_CURRENT è un lavoro per me

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

Stavo lavorando in un notifiche locali plug per l'Unità, quando ho incontrato lo stesso problema -> Ho lanciato l'app, pianificato la notifica locale, inviato l'app in background, è apparsa la notifica locale e, quando ho cliccato su di essa, l'app è stata ripresa e getIntent().getExtras() è stata null.

Nel mio caso, il problema era che stavo cercando di ottenere gli extra con l'intento sbagliato. Prova a stampare gli intenti con un semplice toString, al momento della creazione e quando lo ottieni, per assicurarti che l'accoglienza sia ciò che ti aspetti.

Dai anche un'occhiata al metodo onNewIntent.

Problemi correlati