Unable to insert record into SQLite Database from Firebase Message Service when app is in background or closed state

前端 未结 2 1603
南旧
南旧 2021-01-21 03:40

I am trying out Firebase Notifications. I was able to get the Notification to work properly using this documentation. The message was received and I was able to send a notifica

相关标签:
2条回答
  • 2021-01-21 04:22

    Notifications will be delivered to your app's onMessageReceived only when the app is in the foreground. When your app is backgrounded or not running, the system will handle the notification and display it in the system tray.

    The Firebase documentation explains it as:

    Notification message - FCM automatically displays the message to end-user devices on behalf of the client app. Notification messages have a predefined set of user-visible keys.

    Data message - Client app is responsible for processing data messages. Data messages have only custom key-value pairs.

    Since you want your code to always be invoked, you'll need to send data messages. You cannot send data messages from the Firebase Console. But if you already send messages from an app server, the process for sending data messages and notification messages is the same there. The only difference is in the JSON structure, where a data messages doesn't have a notification object. From the documentation on data messages

    {
       "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
       "data" : {
         "Nick" : "Mario",
         "body" : "great match!",
         "Room" : "PortugalVSDenmark"
       },
    }
    
    0 讨论(0)
  • 2021-01-21 04:36

    To save data received on onMessgeReceived() to SQLite database even when your app is in the background (no activity running), you can do the following:

    1) Create a class that extends IntentService, e.g:

    public class SQLService extends IntentService {
        private final static String MESSAGE_ID = "message_id";
    
        private MySQLiteDbAdapter mySQLiteAdapter;
    
        public SQLService() {
            super("test-service");
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            // initialize SQLite adapter here using getApplicationContext()
            this.mySQLiteAdapter = new MySQLiteDbAdapter(getApplicationContext());
    
        }
    
        @Override
        protected void onHandleIntent(Intent intent) {
    
            // fetch data to save from intent
            Message message = new Message();
            Message.setMessage_id(intent.getStringExtra(MESSAGE_ID));
            ...
            // save 
            this.mySQLiteAdapter.add(message);
    
        }
    }
    

    2) Launch the service class from onMessageReceived() method or a method within your extension of the Firebase service, e.g.:

    @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
    
            if (remoteMessage.getData() != null) {
    
                Intent intent = new Intent(this, SQLService.class);
                // add data to intent
                intent.putExtra(MESSAGE_ID, remoteMessage.getData().get(MESSAGE_ID));
                ...
                // start the service
                startService(intent);
    
            }
        }
    

    3) Register the service in your AndroidManifest.xml:

    <application
      ...
            <service
                android:name=".SQLService"
                android:exported="false"/>
      ...
    

    For more in-depth explanation see https://guides.codepath.com/android/Starting-Background-Services

    0 讨论(0)
提交回复
热议问题