2010-10-19 3 views

Répondre

18

Vous devriez être en mesure de le faire avec notification et la NotificationManager. Cependant, obtenir un moyen garanti de savoir quand votre application n'est pas en cours d'exécution est la partie la plus difficile.

Vous pouvez obtenir la fonctionnalité de base de ce que vous êtes désireux de faire quelque chose comme:

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

Ce code doit être quelque part où vous êtes sûr, obtenir mis le feu au démarrage de votre application. Peut-être dans la méthode onCreate() de l'objet Application personnalisé de votre application.

Cependant, après que les choses sont difficiles. La suppression de l'application peut se produire à tout moment. Vous pouvez donc essayer de placer quelque chose dans la classe onTerminate() de la classe Application, mais il n'est pas garanti qu'elle soit appelée.

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

sera ce qui est nécessaire pour supprimer l'icône.

+5

'Notification' était obsolète au niveau API 11. Utilisez plutôt Notification.Builder. –

+0

Si vous utilisez en plus 'Service', vous n'avez pas besoin de supprimer manuellement la notification.Lorsque le service est arrêté, la notification sera automatiquement supprimée. ("Toutefois, si vous arrêtez le service alors qu'il fonctionne toujours au premier plan, la notification est également supprimée." Https://developer.android.com/guide/components/services.html#Foreground) –

6

Jetez un oeil au Guide de développement "Creating Status Bar Notifications".

Une façon d'atteindre l'objectif de maintenir l'icône là que lorsque l'application est en cours d'exécution est d'initialiser la notification onCreate() et appelez cancel(int) dans votre méthode onPause() que si isFinishing() renvoie true.

Un exemple:

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

Cela vous montrera seulement si une activité donnée est en cours d'exécution. Pas si l'application est toujours en cours d'exécution. –

+0

@Greg: À droite, cet exemple de code gère uniquement correctement une application à une activité. Il est beaucoup plus difficile de déterminer quand le système a tué l'application. Comme vous l'avez mentionné, une classe 'Application' personnalisée est probablement le meilleur endroit pour le code car il persiste tout au long de la vie de l'application. Effacer la notification sera difficile parce que le système peut décider arbitrairement de tuer le processus d'une application dans des conditions de mémoire insuffisante. Vous pouvez essayer de créer un service pour surveiller l'état, car le système tentera de redémarrer le service plus tard si plus de mémoire est disponible. – Brian

+0

Si vous retirez 'notificationManager.cancel (NOTIFICATION_EX);' de 'onPause', la notification restera dans la barre de notification jusqu'à ce que l'application soit complètement arrêtée. –

8

Pour nouvelle API, vous pouvez utiliser 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); 

Il montrera aussi longtemps que votre application est en cours d'exécution et que quelqu'un ferme manuellement votre application. Vous pouvez toujours annuler votre notification en appelant -

mNotifyMgr.cancel(NOTIFICATION_ID); 
+0

être le contenu de MyActivity.class? @mjosh –

+0

@Sarahcartenz Tout ce que vous voulez vraiment – mjosh

+0

et si je ne définissais pas une telle classe? ou gardez-le vide. Je ne veux pas d'action une fois que la notification est appuyée par exemple. –

3

Cela fonctionne vraiment. J'ai créé une méthode de l'exemple ci-dessus:

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

Il devrait être appelé comme: applyStatusBar ("Test Statusbar", 10);

+0

si je peux demander, quel sera le contenu de ActMain.class? –

Questions connexes