首页 > 解决方案 > 在后台将 FCM 通知保存在 Room DB 中

问题描述

我正在开发一个具有 Room 数据库并使用 Firebase Cloud Messaging 接收通知的 android 应用程序。我试图实现的是一种将通知保存到数据库中的方法,以便用户可以随时看到它们。

我已经为应用程序在前台运行时收到的通知完成了此操作,但在关闭时没有。

我拥有的消息服务代码如下:

    public class MyFirebaseMessagingService extends FirebaseMessagingService {

        private static final String TAG = "MyFirebaseMessagingServ";
        public static int NOTIFICATION_ID = 1;

        /**
         * Executed when a notification message is received
         * @param remoteMessage
         */
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {

            generateNotification(remoteMessage.getNotification().getBody(),
                    remoteMessage.getNotification().getTitle());


            MyNotificacion noti = new MyNotificacion();
            noti.setTitulo(remoteMessage.getNotification().getTitle());
            noti.setContenido(remoteMessage.getNotification().getBody());
            //other data

            //Creating the instance here didn't work either
            //MyDatabase db = Room.databaseBuilder(getApplicationContext(),
            //        MyDataBase.class, DATABASE_NAME)
            //        .build();

            MyDatabase db = MyApp.database;
            if (db != null) new InsertNotiAsyncTask(db.getMyNotificacionDao()).execute(noti);
            //all this does is invoking the insert method in the corresponding Dao
        }
        
        //other methods
    }

这是我的应用程序类:

    public class MyApp extends Application {

        public static MyDatabase database;

        @Override
        public void onCreate() {
            super.onCreate();

            database = MyDatabase.getInstance(MyApp.this);
        }
    }

这是数据库类:

    @Database(entities = {MyNotificacion.class}, version = 1)
    public abstract class MyDatabase extends RoomDatabase {

        public static final String DATABASE_NAME = "my_db";

        private static MyDatabase instance;
        public static MyDatabase getInstance(final Context contexto){
            if(instance == null){
                instance = Room.databaseBuilder(
                        contexto.getApplicationContext(),
                        MyDatabase.class,
                        DATABASE_NAME
                ).build();
            }
            return instance;
        }

        public abstract MyNotificacionDao getMyNotificacionDao();
    }

主要问题是获取数据库实例需要上下文。我已将此方法作为一种解决方法,因此我可以从不是活动的类中执行此操作,但在应用程序关闭时收到通知时它根本不起作用。

有没有其他方法可以实现这一目标?

到目前为止,我认为我可以使用共享首选项保存 db 实例,但我不知道它是否会工作,而且持久性似乎也不合逻辑。这是我唯一的选择吗?

标签: javaandroidfirebase-cloud-messagingandroid-room

解决方案


推荐阅读