web-dev-qa-db-fra.com

Notifications Push lorsque l'application est fermée

Savez-vous s'il est possible de recevoir des notifications d'un message Google Cloud lorsque l'application est complètement fermée? 

Je sais si c'est ouvert ou en arrière-plan oui, mais est-ce que cela peut être programmé de manière à les recevoir? 

MODIFIER:

Je continue sans recevoir de notifications lorsque l'application est fermée. 

J'ai joint le code au cas où j'aurais une erreur et que je ne la regarde pas.

MANIFESTE

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.frab"
Android:versionCode="1"
Android:versionName="1.0" >

<uses-sdk
Android:minSdkVersion="14"
Android:targetSdkVersion="19" />
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.ACCESS_NETWORK_STATE" />
<uses-permission Android:name="Android.permission.GET_ACCOUNTS" />
<uses-permission Android:name="Android.permission.WAKE_LOCK" />
<uses-permission Android:name="com.google.Android.c2dm.permission.RECEIVE" />
<uses-permission Android:name="com.frab.permission.C2D_MESSAGE" />
<uses-permission Android:name="Android.permission.READ_CONTACTS" />
<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission Android:name="Android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission Android:name="Android.permission.VIBRATE" />
<permission
Android:name="com.frab.permission.C2D_MESSAGE"
Android:protectionLevel="signature" />

<meta-data
Android:name="com.google.Android.gms.version"
Android:value="@integer/google_play_services_version" />

<application
Android:allowBackup="true"
Android:icon="@drawable/ic_launcher"
Android:label="@string/app_name"
Android:theme="@style/AppTheme" >
<activity
Android:name="com.frab.MainActivity"
Android:label="@string/app_name" >
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />

<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<receiver
Android:name=".GGMBroadcastReceiver"
Android:permission="com.google.Android.c2dm.permission.SEND" >
<intent-filter>
<action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
<action Android:name="com.google.Android.c2dm.intent.REGISTRATION" />
<category Android:name="com.something" />
</intent-filter>
</receiver>

<service Android:name=".GCMIntentService" />
</application>

</manifest>

RÉCEPTEUR DE DIFFUSION

package com.something;

import Android.app.NotificationManager;
import Android.app.PendingIntent;
import Android.content.Context;
import Android.content.Intent;
import Android.os.Bundle;
import Android.support.v4.app.NotificationCompat;
import Android.util.Log;

import com.activities.SignIn;
import com.google.Android.gcm.GCMBaseIntentService;
import com.objects.Globals;

public class GCMIntentService extends GCMBaseIntentService {
private static final String TAG = "GGM <-----> FRAB";
private Bundle extras;

public GCMIntentService() {
super(Globals.SENDER_ID);
}

@Override
public void onDestroy() {
Log.d(TAG, "terminando servicio");
}

@Override
protected void onRegistered(Context context, String registrationId) {
Log.i(TAG, "onRegistered: registrationId=" + registrationId);
}

@Override
protected void onUnregistered(Context context, String registrationId) {
Log.i(TAG, "onUnregistered: registrationId = " + registrationId);
}
@Override
protected void onMessage(Context context, Intent data) {
extras = data.getExtras();
String message = extras.getString("msg");
Log.d("******", message);
sendNotification(message);
}

@Override
protected void onError(Context arg0, String errorId) {
Log.e(TAG, "onError: errorId = " + errorId);
}    
}

package com.something;

import Android.app.Activity;
import Android.content.ComponentName;
import Android.content.Context;
import Android.content.Intent;
import Android.support.v4.content.WakefulBroadcastReceiver;

public class GGMBroadcastReceiver extends WakefulBroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
// Explicitly specify that GcmIntentService will handle the intent.
ComponentName comp = new ComponentName(context.getPackageName(), GCMIntentService.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}

Lorsque l'application est ouverte:OK

Lorsque l'application est en arrière-plan: Ok

Lorsque l'application est fermée de manière forcée par l'utilisateur: les notifications n'arrivent pas

Quel est le problème?

Merci beaucoup.

26
user3757628

Oui, il est possible de "recevoir des notifications du message Google Cloud lorsque l'application est complètement fermée".

Enfait, un récepteur de diffusion est le mécanisme utilisé par GCM pour remettre des messages . Vous devez avoir implémenté un BroadcastReceiver et le déclarer dans le fichier AndroidManifest.xml.

Veuillez vous reporter à l'extrait de code suivant.

AndroidManifest.xml

<receiver
    Android:name=".GcmBroadcastReceiver"
    Android:permission="com.google.Android.c2dm.permission.SEND" >
    <intent-filter>
        <!-- Receives the actual messages. -->
        <action Android:name="com.google.Android.c2dm.intent.RECEIVE" />
        <category Android:name="com.google.Android.gcm.demo.app" />
    </intent-filter>
</receiver>
<service Android:name=".GcmIntentService" />

Code Java

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        // Explicitly specify that GcmIntentService will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(),
                GcmIntentService.class.getName());
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}

Lorsque GCM envoie un message à votre appareil, BroadcastReceiver le reçoit et appelle la fonction onReceive(), dans laquelle vous pouvez démarrer un service pour réellement exécuter la tâche prévue à votre place.

L'exemple de code ci-dessus utilise une BroadcastReceiver spécialisée appelée WakefulBroadcastReceiver, qui permet de s'assurer que le périphérique ne se met pas en veille pendant que le service fonctionne.

Reportez-vous à la page Android officielle pour consulter le même site: https://developer.Android.com/google/gcm/client.html

21
Sahil Bajaj

Lorsque l'application est fermée définitivement par l'utilisateur: les notifications n'arrivent pas

C'est une fonctionnalité de la plateforme Android. Forcer l'arrêt d'une application par l'utilisateur met celle-ci à l'état arrêté et aucun de ses codes n'est exécuté, y compris les récepteurs de diffusion déclarés dans le manifeste. Ce n'est que lorsque l'utilisateur lance explicitement l'application qu'elle est mise dans un état où les destinataires sont renvoyés.

Pour en savoir plus: http://www.doubleencore.com/2014/06/effects-Android-application-termination/

18
laalto

Cela ne fonctionnera pas si vous supprimez l'application depuis le gestionnaire de tâches, mais si vous faites simplement glisser le curseur de manière récente. J'ai essayé de faire sur WhatsApp en le tuant et en demandant à quelqu'un de m'envoyer un msg, et je n'ai reçu aucune notification. Ensuite, j'ai lancé l'application et j'ai reçu une notification.

5
berserk

Je viens de terminer une application GCM . Cela fonctionne toujours bien si vous fermez l'application. Le fait est que vous devriez déjà avoir déjà ouvert l'application pour une fois . Créez deux classes pour atteindre cet objectif: GcmBroadcastReceiver et GcnIntentService. Pour plus d'informations http://developer.Android.com/google /gcm/index.html

Voici le truc

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    // Explicitly specify that GcmIntentService will handle the intent.
    ComponentName comp = new ComponentName(context.getPackageName(),
            GcmIntentService.class.getName());
    // Start the service, keeping the device awake while it is launching.
    startWakefulService(context, (intent.setComponent(comp)));
    setResultCode(Activity.RESULT_OK);

}
}

la classe en cours d'extension est WakeFulBroadcastReceiver. Il existe une autorisation WAKE_LOCK dans votre fichier Manifest.xml. Cela permet d’utiliser PowerManagerWakeLocks pour empêcher le processeur de dormir ou l’éclairage de l’écran . Toutefois, si vous étendez la BroadcastReceiver, cela ne fonctionnera pas après la fermeture de l’application. 

<uses-permission Android:name="Android.permission.WAKE_LOCK" />
2
SandyQi

L'API Firebase a deux types de messages, ils les appellent:

  • notification
  • les données

trouver plus d'informations de ici

IMPORTANT: Vous ne pouvez pas envoyer de messages de charge de données à partir de Firebase Console, la console ne distribuant qu'un message de notification. J'ai donc indiqué comment envoyer une notification Push à l'aide de postman, veuillez suivre les étapes ci-dessous pour cela.

Vous devez envoyer des messages Push avec une charge de données à cause de la charge de données - Peu importe que votre application soit au premier plan ou en arrière-plan ou qu'elle soit supprimée, ces messages seront toujours remis à la méthode onMessageReceived ().

Dans Android 8.0 Oreo si l'application est fermée, la notification n'est pas reçue. En raison du mode DOZE et de l'optimisation de la batterie, il vous suffit de désactiver l'optimisation de la batterie pour toutes les applications ou une application particulière. 

Désactivez l'optimisation de la batterie pour votre application en procédant comme suit:

Paramètres >> Batterie >> Optimisation de la batterie >> trouvez votre application >> sélectionnez >> si optimisé, cliquez sur ne pas optimaliser >> essayez d'envoyer une notification

Envoyer une notification Push en utilisant postman 

Étape 1: https://fcm.googleapis.com/fcm/send

Étape 2: Définissez ces deux éléments dans Header

Autorisation: clé = AIzaSyBuRl1Ikz3VXFvU7xW9mmg51lJ3uDSH

Content-Type: application/json 

Étape 3: Envoyez ce json

{
 "to" : "eb9HgFulyzU:APA91bFMLReWWwilNFfJ1fnXZ0A2PhJAYsabg-UcK_dHgHQcstTzcxLs4_mqgOmZtUiyLMne4JaOG7f8KH7pWxB7JugOGCCYgjd4fUynRBKZvNUgjaj2UdJB2Ux8VocszuUydCX",
 "data" : {
     "message" : "First Notification",
     "title": "Push Notification",
     "key_1" : "Key 1 value",
     "key_2" : "Hello"
 }
}

J'espère que cela t'aides..

Prendre plaisir :) :)

2
Dhaval Jivani

Après quelques tests sur ce problème, j'ai découvert que son comportement était différent en ce qui concerne la fermeture de l'application. Si vous fermez l'application alors que le câble est connecté à l'appareil, il bloque chaque notification de fermeture de l'application . Cependant, si vous retirez le câble de l'appareil et fermez l'application, l'envoi de la notification fonctionne à nouveau, comme il se doit!

Si vous recevez un message contextuel "En attente du débogueur", redémarrez simplement le périphérique, puis envoyez une notification de test!

1
Zez3

J'avais le même problème sur le téléphone Oneplus. Comme mentionné par de nombreuses personnes ci-dessus, le problème était l'arrêt brutal de l'application. Dans mon cas, cela a été fait en raison du paramètre "Gestion des applications récentes", comme indiqué ci-dessous. Une fois que je l'ai changé en "Normal clear", tout a bien fonctionné.

 enter image description here

0
Paresh

J'ai essayé un autre téléphone et le second a parfaitement fonctionné, même lorsqu'il était éteint. Le premier avait une pièce qui ne permettait pas d’être avertie de la fermeture de l’application ...

0
user3757628