2010-10-19 11 views

risposta

18

Si dovrebbe essere in grado di fare questo con notifica e la NotificationManager. Tuttavia, ottenere un modo sicuro per sapere quando la tua applicazione non è in esecuzione è la parte difficile.

è possibile ottenere la funzionalità di base di che cosa state desiderando facendo qualcosa di simile:

Notification notification = new Notification(R.drawable.your_app_icon, 
              R.string.name_of_your_app, 
              System.currentTimeMillis()); 
notification.flags |= Notification.FLAG_NO_CLEAR 
        | Notification.FLAG_ONGOING_EVENT; 
NotificationManager notifier = (NotificationManager) 
    context.getSystemService(Context.NOTIFICATION_SERVICE); 
notifier.notify(1, notification); 

questo codice deve essere da qualche parte dove si è sicuri andranno licenziato all'avvio del applicativi. Probabilmente nel metodo onCreate() dell'oggetto dell'applicazione personalizzato dell'applicazione.

Tuttavia dopo che le cose sono difficili. L'uccisione dell'applicazione può avvenire in qualsiasi momento. Quindi puoi provare a mettere qualcosa anche nel onTerminate() della classe Application, ma non è garantito che venga chiamato.

((NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE)).cancel(1); 

sarà ciò che è necessario per rimuovere l'icona.

+5

'Notifica 'è stato dichiarato obsoleto in livello API 11. Utilizzare invece Notification.Builder. –

+0

Se si utilizza anche 'Servizio', non è necessario rimuovere manualmente la notificazione.Quando il servizio viene interrotto, la notifica verrà automaticamente rimossa. ("Tuttavia, se si interrompe il servizio mentre è ancora in esecuzione in primo piano, viene anche rimossa la notifica." Https://developer.android.com/guide/components/services.html#Foreground) –

6

Dai un'occhiata alla Guida Dev "Creating Status Bar Notifications".

Un modo per raggiungere l'obiettivo di mantenere l'icona non solo quando l'applicazione è in esecuzione è di inizializzare la notifica nella onCreate() e chiamare cancel(int) nel metodo onPause() solo se isFinishing() restituisce true.

Un esempio:

private static final int NOTIFICATION_EX = 1; 
private NotificationManager notificationManager; 

@Override 
public void onCreate() { 
    super.onCreate(); 

    notificationManager = (NotificationManager) 
     getSystemService(Context.NOTIFICATION_SERVICE); 

    int icon = R.drawable.notification_icon; 
    CharSequence tickerText = "Hello"; 
    long when = System.currentTimeMillis(); 

    Notification notification = new Notification(icon, tickerText, when); 

    Context context = getApplicationContext(); 
    CharSequence contentTitle = "My notification"; 
    CharSequence contentText = "Hello World!"; 
    Intent notificationIntent = new Intent(this, MyClass.class); 
    PendingIntent contentIntent = PendingIntent.getActivity(this, 
     0, notificationIntent, 0); 

    notification.setLatestEventInfo(context, contentTitle, 
     contentText, contentIntent); 

    notificationManager.notify(NOTIFICATION_EX, notification); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    if (isFinishing()) { 
     notificationManager.cancel(NOTIFICATION_EX); 
    } 
} 
+0

Questo mostrerà solo se una determinata attività è in esecuzione. Non se l'applicazione è ancora in esecuzione. –

+0

@Greg: a destra, questo codice di esempio gestisce solo correttamente un'applicazione con una sola attività. È molto più difficile determinare quando il sistema ha ucciso l'applicazione. Come hai detto, una classe 'Application' personalizzata è probabilmente il posto migliore per il codice poiché persiste per tutta la vita dell'applicazione. Cancellare la notifica sarà difficile perché il sistema potrebbe decidere arbitrariamente di interrompere il processo di un'app in condizioni di memoria insufficiente. Si potrebbe provare a creare un servizio per monitorare lo stato poiché il sistema proverà a riavviare il servizio in seguito quando sarà disponibile più memoria. – Brian

+0

Se si rimuove 'notificationManager.cancel (NOTIFICATION_EX);' da 'onPause' la notifica rimarrà nella barra di notifica fino a quando l'applicazione non verrà completamente arrestata. –

8

Per nuova API è possibile utilizzare NotificationCompat.Builder -

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
    .setSmallIcon(R.mipmap.ic_launcher) 
    .setContentTitle("Title"); 
Intent resultIntent = new Intent(this, MyActivity.class); 
PendingIntent resultPendingIntent = PendingIntent.getActivity(
this, 
0, 
resultIntent, 
PendingIntent.FLAG_UPDATE_CURRENT); 
mBuilder.setContentIntent(resultPendingIntent); 
Notification notification = mBuilder.build(); 
notification.flags |= Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT; 

mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
mNotifyMgr.notify(NOTIFICATION_ID, notification); 

Mostrerà il tempo che l'applicazione è in esecuzione e qualcuno chiude manualmente l'applicazione. Puoi sempre annullare la notifica chiamando -

mNotifyMgr.cancel(NOTIFICATION_ID); 
+0

cosa sarà sii il contenuto di MyActivity.class? @mjosh –

+0

@Sarahcartenz Qualcosa che vuoi veramente – mjosh

+0

e se non definissi una classe del genere? o tienilo vuoto. non voglio un'azione una volta che la notifica è stata premuta, per esempio. –

3

Funziona davvero. ho creato un metodo fuori l'esempio precedente:

private void applyStatusBar(String iconTitle, int notificationId) { 
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) 
.setSmallIcon(R.mipmap.ic_launcher) 
.setContentTitle(iconTitle); 
Intent resultIntent = new Intent(this, ActMain.class); 
PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
mBuilder.setContentIntent(resultPendingIntent); 
Notification notification = mBuilder.build(); 
notification.flags |= Notification.FLAG_NO_CLEAR|Notification.FLAG_ONGOING_EVENT; 

NotificationManager mNotifyMgr = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
mNotifyMgr.notify(notificationId, notification);} 

Dovrebbe essere chiamato come: applyStatusBar ("Barra di stato Test", 10);

+0

se posso chiedere, quale sarà il contenuto di ActMain.class? –

Problemi correlati