将Android服务上下文用于房间数据库



我正在使用同时使用 firebase Messaging ROOM DATABASE 的应用程序。

这就是DB的初始化

的方式
public static AppDatabase getInstance(final Context appContext) {
    if (INSTANCE == null) {
        INSTANCE = Room.databaseBuilder(appContext, AppDatabase.class, "dbname.db")
                // prepopulate the database after onCreate was called
                .addCallback(rdc)
                .build();
    }
    return INSTANCE;
}

MainActivity上的某个地方,第一个调用AppDatabase并实例化,所有数据库都可以正常工作,并且dandy!

现在,当用户kill应用程序...

时,问题开始

为了简单起见,想想这个应用程序,例如 whatsapp ...应用程序被杀死,但是正在聆听消息的service (MyFirebaseMessagingService)仍在运行(如它应该(。

当新消息到达并且MyFirebaseMessagingService试图将其保存到数据库中,并通过呼叫AppDatabase.getInstance()将崩溃发生崩溃,因为巫婆上的初始context引用数据库的创建不再存在,因为该应用程序已被杀死。

搜索如何解决此问题,我了解到每个服务this实际上都是从context派生的,因此我立即尝试使用MyFirebaseMessagingService上下文来初始化数据库,但是,您真正可以访问服务上下文的MyFirebaseMessagingService::onCreate无法获得。开火,直到第一条消息到达

我唯一能想到的解决方案是创建一个全新的服务,即bindService(),它将其用于主动脉,并使用新服务上下文来创建AppDatabase实例...但是看来完全过高了。

所以我的问题是,如何以MyFirebaseMessagingService仍然可以使用它的方式来初始化房间数据库,即使该应用被杀死?

getApplicationContext()在构造函数函数中不可用。但是它可以在onStartCommand()功能中可用。我认为这是在服务中构建/打开数据库的好地方。

,因为 FirebaseMessagingService是我们应该在那里拥有getApplicationContext()的服务,因此您应该使用它来创建DB的实例并执行必要的操作,其他选项是创建服务或编写自定义广播接收器。

首先:从系统上下文(notification_service(中,您尝试使用使用应用程序上下文访问或创建数据库的空间。但是在那一刻,应用程序上下文可能是无效的。也许只是因为该应用被杀死。因此,您会出现不错的崩溃。

第二,有些日志会很好。坠机。它可能使人们无法猜测。

第三:(再次猜测(也许您应该尝试工作经理。类似:您收到数据>开始工作。将在那一刻可靠地运行,不必在那一刻运行。这里可以从这里开始的好地方

最新更新