0

J'ai essayé la plupart des solutions fournies sur SO. Mais, n'a pas pu résoudre ce problème. Le problème: Lorsque la notification FCM arrive, je démarre le service pour stocker le contenu de la notification dans sqlite. Bien que cela fonctionne lorsque l'application est ouverte, cela ne fonctionne pas lorsque l'application est fermée !!!Impossible de stocker des données dans SQLite ou sharedpreferences lorsque l'application est fermée

Voici ma classe de service que j'utilise pour stocker dans sqlite. ->

public class NotiDataStoreService extends Service { 

    DatabaseHelper db; 
    String messageBody = ""; 

    public Runnable mRunnable = null; 
    public NotiDataStoreService() { 

    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO: Return the communication channel to the service. 
     throw new UnsupportedOperationException("Not yet implemented"); 
    } 

    @Override 
    public int onStartCommand(final Intent intent, int flags, int startId) { 
     final Handler mHandler = new Handler(); 
     mRunnable = new Runnable() { 
      @Override 
      public void run() { 

       db = new DatabaseHelper(NotiDataStoreService.this); 

       messageBody = intent.getStringExtra("messageBody"); 
       addNotification(messageBody); 

       SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("notification_details",Context.MODE_PRIVATE); 
       int noti_counter = sharedPref.getInt("count",0); 
       SharedPreferences.Editor editor = sharedPref.edit(); 
       editor.putInt("count", ++noti_counter).apply(); 
      } 
     }; 
     mHandler.postDelayed(mRunnable, 1000); 

     return super.onStartCommand(intent, flags, startId); 
    } 

    public void addNotification(String messageBody){ 
     File databaseFile = getDatabasePath(Constants.DATABASE_NAME); 
     SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(databaseFile,"", null); 

     ContentValues values = new ContentValues(); 

     values.put("notification", messageBody); 
     // Inserting Row 
     Log.i("hexa:", "notification inserting locally"); 
     db.insert(Constants.TABLE_NOTIFICATIONS, null, values); 
     db.close(); 
    } 
} 

Toute aide sera appréciée. Merci ..! :)

+0

quel type de message que vous envoyer vérifier les données ou la notification de cette https: // stackoverflow .com/questions/44484126/cant-see-action-boutons-sur-notification-quand-app-is-in-background/44484918 # comment75965714_44484918 – Pavan

+0

C'est une notification. et il n'y a aucun problème à recevoir une notification. :) –

+1

FCM dispose de deux types de notification Données et Notification où, dans le cas d'un message de Notification, il n'invoquera pas onMessageReceived lorsque l'application est en arrière-plan, donc c'est un problème bro :) cochez cette https://firebase.google.com/docs/cloud- messagerie/Android/recevoir – Pavan

Répondre

2

De FCM documentation.

Pour recevoir des messages, utilisez un service qui s'étend FirebaseMessagingService. Votre service doit remplacer les rappels onMessageReceived et onDeletedMessages. Il devrait traiter n'importe quel message dans 10 seconds de reçu. Après cela, Android ne garantit pas l'exécution et peut mettre fin à votre processus à tout moment. Si votre application a besoin de plus de temps pour traiter un message, utilisez Firebase Job Dispatcher.

onMessageReceived est prévu pour la plupart des types de messages, avec les exceptions suivantes:

Notification messages livrés lorsque votre app est dans le background. Dans ce cas, le notification est livré au du périphérique system tray. Un utilisateur appuie sur un notification ouvre l'application par défaut.

Messages à la fois notification et data charge utile, à la fois background et foreground. Dans ce cas, le notification est livré à system tray de l'appareil et la charge utile data est livré dans le extras du intent de votre lanceur d'activité.

En résumé:

App state | Notification  | Data    | Both 
---------------------------------------------------------------------------- 
Foreground | onMessageReceived | onMessageReceived | onMessageReceived 
---------------------------------------------------------------------------- 
Background | System tray  | onMessageReceived | Notification: system tray 
                 Data: in extras of the intent. 

SOLUTION:

De la ligne directrice ci-dessus, il semble que l'application client reçoit un message data à la fois onMessageReceived()foreground et background état. Donc, si vous voulez
pour gérer votre message à la fois foreground et background état, alors vous devriez envoyer un message push avec data charge utile.

Voici un bon tutoriel sur la FCM (Notification et Data payload):

Android Push Notifications using Firebase Cloud Messaging FCM & PHP

Espérons que cela aidera ~

+0

Merci beaucoup, Mate! Il a travaillé.je suis passé aux données dans le message et cela a fonctionné comme charme: D. –

+1

Bienvenue le plus cher :) – FAT