我有一个使用firebaserecycleradapter/view
在屏幕上显示数据的应用。效果很好,但我有一个问题。当我发送突发新闻通知时,当用户点击通知时,我的新闻应用程序会打开,但在加载最新消息之前需要一段时间。
我想在通知的onMessageReceived
中加载背景中的数据(其中也包含数据),这样当用户打开新闻活动时,最新的新闻项目已经可用。代码如下:
public void onMessageReceived(RemoteMessage remoteMessage) {
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
processData(remoteMessage);
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
}
private void processData(RemoteMessage rm){
// This is the exact same ref and query that is used by the firebaserecycleradapter
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("all_news");
Query q = ref.orderByChild("mStatus").equalTo(2).limitToLast(100);
q.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// Nothing. The idea is just to read the data upfront so that fetch appears faster
Long count = dataSnapshot.getChildrenCount();
Log.d(TAG, "ProcessData Count" + count);
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Nothing
}
});
}
ProcessData
被调用,onDataChanged
也被调用,所以我知道这里正在读取数据。但是当我打开应用程序并使用相同的数据库引用转到活动时,活动似乎再次读取数据!为什么会这样?
答案 0 :(得分:2)
在挖掘了更多内容之后,我发现addListenerForSingleValueEvent
正在从缓存中读取而不是从firebase服务器读取,因为我在Application类中设置了FirebaseDatabase.getInstance().setPersistenceEnabled(true);
。
我现在已删除了整个ProcessData
函数,而是在我的活动中的KeepSynced(true)
路径上调用了databasereference
。
该应用程序正如我预期的那样工作。
感谢所有回复。
答案 1 :(得分:0)
首先你需要在FCM中使用数据消息,因为当你使用通知消息时,当应用程序在后台时,onMessageReceived永远不会被调用。
当调用onMessageReceived时,获取新闻ID并启动为您下载新闻内容的意向服务。下载完成后,在该意向服务中创建通知。现在由您自己将新闻内容存储在数据库中,共享pref或通过通知将其传递给待处理的意图。我希望它会对你有所帮助。