web-dev-qa-db-fra.com

android notification en arrière-plan si l'application est fermée?

J'essaie d'afficher une notification dans la barre de notifications Android Android même si mon application est fermée.

J'ai essayé de chercher, mais je n'ai pas eu de chance de trouver de l'aide.

Un exemple de ceci est une application de nouvelles. Même si l'écran du téléphone est éteint ou que l'application d'actualités est fermée, il peut toujours envoyer une notification pour les actualités récentes et l'afficher dans la barre de notification.

Comment pourrais-je procéder dans ma propre application?

16
Jack K Fouani

Vous devez créer un service qui gère vos nouvelles et affiche des notifications lorsqu'il sait qu'il s'agit de nouvelles ( Service Doc ). Le service s'exécutera en arrière-plan même si votre application est fermée. Vous avez besoin d'un BroadcastReciever pour exécuter le service en arrière-plan une fois la phase de démarrage terminée. ( Démarrer le service après le démarrage ).

Le service construira vos notifications et les enverra via le NotificationManager .

EDIT: Cet article peut convenir à vos besoins

16
Idipaolo

La réponse sélectionnée est toujours correcte, mais uniquement pour les appareils exécutant Android 7 versions et inférieures. À partir de Android 8+, vous ne pouvez plus avoir de service en cours d'exécution) en arrière-plan pendant que votre application est inactive/fermée.
Donc, cela dépend maintenant de la façon dont vous configurez vos notifications à partir de votre serveur GCM/FCM. Assurez-vous de le définir sur la priorité la plus élevée. Si votre application est en arrière-plan ou simplement inactive et que vous n'envoyez que des données de notification, le système traite votre notification et l'envoie dans la barre des notifications.

3
Bamerza

J'ai utilisé cette réponse pour écrire un service, et à titre d'exemple, vous devez appeler ShowNotificationIntentService.startActionShow(getApplicationContext()) dans l'une de vos activités:

import Android.app.IntentService;
import Android.content.Intent;
import Android.content.Context;
public class ShowNotificationIntentService extends IntentService {
    private static final String ACTION_SHOW_NOTIFICATION = "my.app.service.action.show";
    private static final String ACTION_HIDE_NOTIFICATION = "my.app.service.action.hide";


    public ShowNotificationIntentService() {
        super("ShowNotificationIntentService");
    }

    public static void startActionShow(Context context) {
        Intent intent = new Intent(context, ShowNotificationIntentService.class);
        intent.setAction(ACTION_SHOW_NOTIFICATION);
        context.startService(intent);
    }

    public static void startActionHide(Context context) {
        Intent intent = new Intent(context, ShowNotificationIntentService.class);
        intent.setAction(ACTION_HIDE_NOTIFICATION);
        context.startService(intent);
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        if (intent != null) {
            final String action = intent.getAction();
            if (ACTION_SHOW_NOTIFICATION.equals(action)) {
                handleActionShow();
            } else if (ACTION_HIDE_NOTIFICATION.equals(action)) {
                handleActionHide();
            }
        }
    }

    private void handleActionShow() {
        showStatusBarIcon(ShowNotificationIntentService.this);
    }

    private void handleActionHide() {
        hideStatusBarIcon(ShowNotificationIntentService.this);
    }

    public static void showStatusBarIcon(Context ctx) {
        Context context = ctx;
        NotificationCompat.Builder builder = new NotificationCompat.Builder(ctx)
                .setContentTitle(ctx.getString(R.string.notification_message))
                .setSmallIcon(R.drawable.ic_notification_icon)
                .setOngoing(true);
        Intent intent = new Intent(context, MainActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(context, STATUS_ICON_REQUEST_CODE, intent, 0);
        builder.setContentIntent(pIntent);
        NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        Notification notif = builder.build();
        notif.flags |= Notification.FLAG_ONGOING_EVENT;
        mNotificationManager.notify(STATUS_ICON_REQUEST_CODE, notif);
    }
}
0
VSB