java - 在后台将 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 实例,但我不知道它是否会工作,而且持久性似乎也不合逻辑。这是我唯一的选择吗?
解决方案
推荐阅读
- powershell - 在 PowerShell 中显示事件类型
- haskell - 匹配对列表的函数类型签名时出错
- mongodb - 如何在contanier中连接mongodb
- rrdtool - Check_Mk RRD 文件平均值不匹配
- node.js - 主机节点 API 在线
- swiftui - 为什么 scaleToFill 没有填满整个屏幕?
- c++ - 别名信息可以简化这个程序集吗
- android - 如何在 Android Kotlin 中创建 BottomSheet
- blockchain - 在币安智能链中部署合约时面临错误
- java - 使 netbeans 调试器从新的 dist 文件运行