web-dev-qa-db-fra.com

Comment afficher une icône dans la barre d'état lorsque l'application est en cours d'exécution, y compris en arrière-plan?

Je veux mettre une icône dans la barre d'état chaque fois que mon application s'exécute, y compris lorsqu'elle s'exécute en arrière-plan. Comment puis-je faire ceci?

27

Vous devriez pouvoir le faire avec Notification et NotificationManager. Cependant, il est difficile d'obtenir un moyen garanti de savoir quand votre application ne fonctionne pas.

Vous pouvez obtenir les fonctionnalités de base de ce que vous désirez en faisant 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 se trouver quelque part où vous êtes certain d'être viré au démarrage de votre application. Peut-être dans la méthode onCreate () de l'objet d'application personnalisé de votre application.

Cependant, après cela, les choses sont délicates. La mise à mort de l'application peut survenir à tout moment. Vous pouvez donc essayer de mettre quelque chose dans onTerminate () de la classe Application aussi, mais il n'est pas garanti d'être appelé.

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

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

19
Greg Giacovelli

Pour une 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 s'affiche tant 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);
9
mjosh

Jetez un œil au Guide de développement " Création de notifications de barre d'état ".

Une façon d'atteindre l'objectif de conserver l'icône uniquement lorsque l'application est en cours d'exécution est d'initialiser la notification dans onCreate() et d'appeler cancel(int) dans votre onPause() méthode uniquement 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);
    }
}
6
Brian

Ça marche vraiment. J'ai créé une méthode à partir 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 doit être appelé comme: applyStatusBar ("Statusbar Test", 10);

4
Luiz Lima