2015-06-08 8 views
9

Ho visto diversi approcci e ho provato tutto ma non riuscivo a farlo funzionare. Non so perché è così complicato, nei documenti sembra così facile! Voglio attivare OnNewIntent con una notifica (l'utente fa clic su di esso nella barra delle notifiche).Android OnNewIntent non chiamato

Attualmente ho impostato la mia attività di singleTop

<activity 
    android:name="-.-.-.MainMenuActivity" 
    android:launchMode="singleTop" 
    android:screenOrientation="portrait" > 
</activity> 

Questo è il codice in cui creo la notifica:

public void showNotification(String text, String componentId){ 
    NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(this) 
      .setSmallIcon(R.drawable.logo) 
      .setContentTitle("Title") 
      .setAutoCancel(true) 
      .setContentText(text); 

    // Creates an explicit intent for an Activity in your app 
    Intent resultIntent = new Intent(this, MainMenuActivity.class); 
    if(!componentId.equalsIgnoreCase("")){       
     resultIntent.putExtra("componentId", componentId); 
    } 
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); 

    PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, 0); 
    mBuilder.setFullScreenIntent(resultPendingIntent, false); 
    mBuilder.setContentIntent(resultPendingIntent); 
    NotificationManager mNotificationManager = 
     (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    // mId allows you to update the notification later on. 
    mNotificationManager.notify(0, mBuilder.build()); 
} 

Questo è il metodo OnNewIntent nel mio MainMenuActivity:

@Override 
protected void onNewIntent(Intent intent) { 
    // TODO Auto-generated method stub 
    super.onNewIntent(intent); 
    setIntent(intent); 

    ... 
} 

Non ho mai ricevuto la chiamata OnNewIntent. Non so cosa sto sbagliando. Io uso solo 2 activites in tutta l'app e MainMenuActivity arriva dopo LoginActivity, quindi MainMenuActivity dovrebbe sempre essere in cima allo stack comunque (ho più frammenti dove li ho sostituiti all'interno di MainMenuActivity).

Qualsiasi aiuto sarebbe apprezzato! Grazie ragazzi.

+0

sei mai arrivato ovunque con questo? Sono praticamente nella stessa situazione. – Piwaf

risposta

9

Ok ha funzionato subito dopo aver postato la mia domanda. Penso che la differenza chiave nel nostro codice è che io passo il flag "PendingIntent.FLAG_UPDATE_CURRENT" alla creazione/recupero dell'oggetto PendingIntent. Questo post mi ha aiutato a capirlo.

Notification.Builder mBuilder = 
       new Notification.Builder(context) 
       .setSmallIcon(R.drawable.notifyicon) 
       .setContentTitle(title) 
       .setContentText(extras.getString("message")) 
       .setAutoCancel(true) 
       .setOnlyAlertOnce(false) 
       .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)) 
       .setVibrate(new long[] {0,500,250,500}); 

     if(badgeCount > 1) 
      mBuilder.setNumber(badgeCount); 
     // Creates an explicit intent for an Activity in your app 
     Intent resultIntent = new Intent(context, SiteViewActivity.class); 
     resultIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     resultIntent.putExtra(NOTIFY_INTENT_TYPE_KEY, alertType); 

     PendingIntent resultPendingIntent = PendingIntent.getActivity(context, alertType, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
     mBuilder.setContentIntent(resultPendingIntent); 
     NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     notifyMgr.notify(alertType, mBuilder.build()); 
+0

anche tu aggiungi il valore 'alertType' - è una chiave per il mio stesso problema !! thnks! –

0

Dopo una lunga ispezione ho notato che Android 4.4 (KitKat e forse inferiore) non chiamare onNewIntent e onResume né se si utilizza FLAG_UPDATE_CURRENT su pendingIntent. Una volta modificato in FLAG_ONE_SHOT, inizierà a funzionare. su Android 6 (e probabilmente anche su 5) tuttavia onNewIntent funziona anche con il flag FLAG_UPDATE_CURRENT.

Tuttavia, sembra che se crei più intenti in sospeso (ad esempio dopo aver ricevuto due notifiche) i dati non verranno aggiornati con flag FLAG_ONE_SHOT, quindi flag FLAG_CANCEL_CURRENT potrebbe essere una scelta migliore (non ha problemi con dati non aggiornati)

2

come prima, si dovrebbe aggiungere android:launchMode="singleTop" alla definizione di attività nel file manifesto come qui di seguito

<activity 
    android:name="MainActivity" 
    android:launchMode="singleTop" 
</activity> 

Poi, come Hasan Masud detto questo, si dovrebbe aggiungere Intent.ACTION_MAIN e Intent.CATEGORY_LAUNCHER alla tua azione come qui di seguito

Intent intent = new Intent(this, MainActivity.class); 
intent.setAction(Intent.ACTION_MAIN); 
intent.addCategory(Intent.CATEGORY_LAUNCHER); 

Questo è tutto. In questo modo, se l'app è aperta e quando si fa clic sulla notifica, verrà attivato il metodo onNewIntent (..) ma qualunque cosa accada, se l'app è chiusa, quando si fa clic sulla notifica, l'intento di notifica verrà inviato a onCreate (..) metodo di attività corrente.

+0

Sei il migliore! Mi ci sono voluti per sempre per scoprire che è necessario aggiungere Intent.ACTION_MAIN e INTENT.CATEGORY_LAUNCHER !!! Non l'ho visto scritto da nessuna parte ... – Mars