我正在开发一个使用 Firebase Messaging 和 Room 数据库 的应用。
这是数据库初始化的方式
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
并实例化数据库,一切都很正常!
现在的问题是,当用户 kill
应用程序时...
为了简单起见,把这个应用程序想象成 Whatsapp... 应用程序已被杀掉,但是正在监听消息的 service (MyFirebaseMessagingService)
仍在运行(应该是这样的)。
当一个新消息到达时,MyFirebaseMessagingService
尝试使用调用 AppDatabase.getInstance()
将其保存到数据库中,由于初始化数据库的最初 context
引用不存在了,因为应用程序已被杀死,所以会出现崩溃。
在寻找如何解决这个问题时,我发现每个服务 this
实际上都派生自 context
,因此我立即尝试使用 MyFirebaseMessagingService
上下文来初始化数据库,但是,真正拥有访问服务上下文的 MyFirebaseMessagingService::onCreate
直到第一条消息到达才会触发。
我唯一能想到的解决办法是创建一个全新的服务,bindService()
它到 MainActivity,并使用该新服务的上下文来创建 AppDatabase 实例... 但这似乎完全是杀鸡焉用牛刀。
所以我的问题是,如何初始化 Room Database,以便 MyFirebaseMessagingService
可以在应用程序被杀掉的情况下仍然使用它?