2013-08-15 14 views
41

Aggiungo una notifica alla barra di sistema utilizzando la libreria NotificationCompat. Questa notifica ha due pulsanti di azione. Inoltre, la proprietà AutoCancel() nella notifica è impostata su true.Fare clic su Azioni di notifica Android non chiude Cassetto di notifica

On Fare clic sui pulsanti di azione, Sistema è configurato per avviare un IntentService che chiama NotificationManager.cancel(NOTIFICATION_ID) e quindi avvia un'attività in una nuova attività.
Il problema è che sebbene questa chiamata rimuova la notifica dal vassoio, non comprime il cassetto. L'attività chiamata viene disegnata dietro il cassetto.

Qualcuno può far luce su quale codice speciale è necessario per chiudere il disegno a parte dall'annullare la notifica?

Grazie.

+1

Hai mai trovato una soluzione per questo? –

+6

No. Solo alcuni hack per usare la reflection ed espandere, comprimi la Status bar. Apparentemente, se il tuo Pending Intent contiene un Intento che si risolve in un'attività, il cassetto viene automaticamente collassato. Tuttavia, se il tuo Pending Intent racchiude un BroadcastReceiver o un servizio, la barra delle notifiche mantiene il suo stato (espanso). – Aster

risposta

0

Il sistema Android comprime il cassetto delle notifiche ogni volta che fai clic su una notifica e avvia un'attività o una trasmissione. Non penso che ci sia un modo programmatico per chiudere il cassetto delle notifiche dal tuo codice. Suggerisco di controllare gli intenti che si passano al builder di notifica e assicurarsi che vengano forniti gli intenti di riferimento corretti. Penso che qualcosa all'interno del gestore delle notifiche di Android venga bloccato a causa dell'intento che fornisci. Finora non ho visto il cassetto delle notifiche rimanere aperto una volta che l'azione è stata attivata dalla notifica. Semplicemente curioso di sapere se la tua attività target sta avendo un'area semitrasparente in cui è visibile l'attività precedente, se poi ti suggerisco di rendere lo sfondo completamente opaco (non avendo alcuna regione trasparente/semi trasparente). Può essere che impedisca a Android Home Launcher di completare la sequenza di stop e quindi di non consentire al programma di avvio di chiudere il cassetto delle notifiche per te. Spero di essere stato in grado di aiutarti. Ti auguro il meglio.

1

Mentre ho apprezzato rendo conto che la risposta di Soumyajyoti dovrebbe essere corretto ... è in realtà non ...

sto usando

Intent CR = new Intent(CRCODE); 
PendingIntent.getBroadcast(getApplicationContext(), MY_ID, CR, 0); 

in un layout remoteview per una notifica in corso ...

Posso assicurarti che non chiude il cassetto ma attiva l'intento e disegna l'attività dietro il cassetto aperto, oltre ad eseguire gli altri compiti che ho assegnato al mio ricevitore ...

.210

Ho testato sia getActivity e getService (nessuno dei quali lavorerà nella mia circostanza, ho bisogno di sparare più intenti onRecieve) e ciascuno di essi chiudere il cassetto correttamente ...

So che questo non è una risposta, ma quando e se lo trovo lo segnalerò per modificare questo ...

pensiero folle ... forse un'attività senza visualizzazione del contenuto potrebbe essere chiamata come ricevitore di trasmissione che licenzierà gli intenti appropriati per altre classi o app come richiesto ...

il pensiero pazzo elencato sopra funziona ... avviare un'attività con PendingIntent. getActivity e usarlo per ritrasmettere trasmissioni o altri intenti poi finire da solo ... l'effetto non è diretto ma impercettibile all'utente finale

9

Ho scoperto che quando si utilizzano i pulsanti di azione nelle notifiche espanse, è necessario scrivere altro codice e tu sei più vincolato.

Prima di utilizzare le notifiche espanse, l'azione predefinita nella notifica di download del file era l'avvio di un'attività VISTA sul file. L'intento VIEW era racchiuso da un intento Chooser. Non è stato possibile utilizzare un intento in sospeso per l'intento di Scelta risorse direttamente dalla notifica, in quanto Chooser si arrestava in modo anomalo se non c'era attività per visualizzare il tipo di file. Quindi avevo un BroadcastReceiver che avviava l'intento di Scelta Risorse.

Con le notifiche espanse, ho deciso di modificare la notifica di download del file in modo che l'azione predefinita sia quella di mostrare l'attività sui dettagli del file, con pulsanti di azione per Visualizza e Invia. Come notato dall'utente2536953, l'avvio di un ricevitore di trasmissione dalla notifica non chiude il cassetto delle notifiche. Sulla base delle sue informazioni sul fatto che un'attività avrebbe chiuso il cassetto, ho cambiato il mio ricevitore di trasmissione in NotificationActivity senza alcuna interfaccia utente.

Come indicato in questo post How to dismiss Android notification after action has been clicked, un altro problema è che è necessario annullare manualmente la notifica quando l'utente fa clic su un pulsante di azione. La notifica viene annullata automaticamente solo per l'azione predefinita. Ho anche aggiunto il codice in NotificationActivity per gestirlo.

Costruire la notifica ampliata con vista e inviare pulsanti:

NotificationCompat.Builder builder = new NotificationCompat.Builder(m_context).setAutoCancel(true); 

    final PendingIntent contentIntent = DownloadedFileIntentUtils.buildPendingItemDetailIntent(m_context, item); 
     builder.setContentIntent(contentIntent); 

    PendingIntent viewIntent = DownloadedFileIntentUtils.buildNotificationActionIntent(m_context, Intent.ACTION_VIEW, 
       m_context.getString(R.string.action_open), uri, MimeTypeUtil.getMimeType(item), id); 
    builder.addAction(R.drawable.actionbar_open_with, m_context.getString(R.string.action_open), viewIntent); 

    PendingIntent sendIntent = DownloadedFileIntentUtils.buildNotificationActionIntent(m_context, Intent.ACTION_SEND, 
       m_context.getString(R.string.action_send), uri, MimeTypeUtil.getMimeType(item), id); 
    builder.addAction(R.drawable.actionbar_share, m_context.getString(R.string.action_send), sendIntent); 

    builder.setTicker(title) 
    .setContentTitle(title) 
    .setContentText(text) 
    .setSmallIcon(R.drawable.notification_download); 
    .setStyle(new NotificationCompat.BigTextStyle().bigText(text)); 

    getNotificationManager().notify(id, builder.build()); 

Costruire l'intento di avviare un'attività dai pulsanti di azione di notifica:

public static PendingIntent buildNotificationActionIntent(Context context, String action, String actionTitle, Uri uri, 
     String mimeType, int notificationId) { 
    // Build the file action intent (e.g. VIEW or SEND) that we eventually want to start. 
    final Intent fileIntent = buildFileActionIntent(action, actionTitle, uri, mimeType); 

    // Build the intent to start the NotificationActivity. 
    final Intent notificationIntent = new Intent(context, NotificationActivity.class); 
    // This flag must be set on activities started from a notification. 
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    // Pass the file action and notification id to the NotificationActivity. 
    notificationIntent.putExtra(Intent.EXTRA_INTENT, fileIntent); 
    notificationIntent.putExtra(IIntentCode.INTENT_EXTRA_NOTIFICATION_ID, notificationId); 

    // Return a pending intent to pass to the notification manager. 
    return PendingIntent.getActivity(context, s_intentCode.getAndIncrement(), notificationIntent, PendingIntent.FLAG_ONE_SHOT); 
} 

public static Intent buildFileActionIntent(String action, String actionTitle, 
     Uri uri, String mimeType) { 
    Intent intent = new Intent(action); 
    intent.addCategory(Intent.CATEGORY_DEFAULT); 

    if (action.equals(Intent.ACTION_SEND)) { 
     intent.putExtra(Intent.EXTRA_STREAM, uri); 
     intent.setType(mimeType); 
    } else { 
     intent.setDataAndType(uri, mimeType); 
    } 

    intent.putExtra(Intent.EXTRA_TITLE, actionTitle); 

    // Grant read permission on the file to other apps without declared permission. 
    int flags = Intent.FLAG_GRANT_READ_URI_PERMISSION; 
    intent.setFlags(flags); 

    return intent; 
} 

attività di notifica, senza alcuna Interfaccia utente:

public class NotificationActivity extends Activity { 
private final static Logger s_logger = LogUtil.getLogger(NotificationActivity.class); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent intent = getIntent(); 

    // Cancel the notification that initiated this activity. 
    // This is required when using the action buttons in expanded notifications. 
    // While the default action automatically closes the notification, the 
    // actions initiated by buttons do not. 
    int notificationId = intent.getIntExtra(IIntentCode.INTENT_EXTRA_NOTIFICATION_ID, -1); 
    if (notificationId != -1) { 
     NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
     manager.cancel(notificationId); 
    } 

    // If there is an activity to handle the action, start the file action. 
    if (DownloadedFileIntentUtils.verifyActivityIsAvailable(this, fileActionIntent, false)) { 
      fileActionIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      DownloadedFileIntentUtils.startFileActionActivity(this, fileActionIntent); 
    } 

    // Finish activity. 
    finish(); 
} 

public static void startFileActionActivity(Context context, Intent fileActionIntent) { 
    // Start chooser intent. 
    Intent chooser = Intent.createChooser(fileActionIntent, fileActionIntent.getStringExtra(Intent.EXTRA_TITLE)); 

    // Copy the flags from fileActionIntent to chooser intent. 
    // FileActionExecutor must set FLAG_ACTIVITY_NEW_TASK on the intent passed to startActivity 
    // because the flag is required when starting an activity from a context that is not an activity. 
    chooser.addFlags(fileActionIntent.getFlags()); 

    context.startActivity(chooser); 
} 

Non dimenticare di aggiungere NotificationActivity a AndroidManifest.xml.

+0

Grazie mille! –

+1

Mi è stato richiesto di impostare android: taskAffinity = "" in NotificationActivity altrimenti stava avviando MainActivity anche se esisteva nel backstack –

+0

http://stackoverflow.com/questions/42527534/pending-action-expand-notification-on- fare clic su Per favore, ho una domanda –

36

Se la vostra azione sia nella forma di una trasmissione o di un servizio, ma si intende per l'area di notifica al collasso, si dovrebbe trasmettere android.intent.action.CLOSE_SYSTEM_DIALOGS dal OnReceive. Questo chiuderà manualmente il cassetto.

+26

sendBroadcast (new Intent (Intent.ACTION_CLOSE_SYSTEM_DIALOGS)); – goodhyun

+2

Il metodo sendBroadcast può essere trovato all'interno dell'oggetto contesto. –

+0

Ho aggiunto queste righe al mio BroadcastReceiver prima di chiamare context.startActivity (myIntent) Intento esso = nuovo Intent (Intent.ACTION_CLOSE_SYSTEM_DIALOGS); context.sendBroadcast (it); –

Problemi correlati