但是,即使没有将任何子级添加到数据库中,该代码也会在每天每个应用程序启动和多次显示通知
请帮助我解决此问题,我已尝试使用onDatabaseChange
方法,但正在发生同一件事
if (mChildEventListener == null) {
mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Intent intent = new Intent(getBaseContext(),MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(getBaseContext(), 0, intent,
PendingIntent.FLAG_ONE_SHOT);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationCompat.Builder mnotificationBuilder = new NotificationCompat.Builder(getBaseContext())
.setSmallIcon(R.mipmap.ic_chat)
.setContentTitle("You may have New Messages !!")
.setContentText("Check Chat Room > Received > New Message")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
notificationManager.notify(0, mnotificationBuilder.build());
}
答案 0 :(得分:0)
将ChildEventListener
附加到某个位置时,该位置上所有现有子节点的onChildAdded
都会立即被调用。因此,听起来代码正在按预期工作。
这听起来还像您是在尝试仅通知用户新个子节点,这可能意味着它们尚未见过子节点。
执行此操作的一种简单方法是跟踪您显示给用户的最新子节点。例如,通过将该节点的密钥存储在shared preferences of the app中。然后,在加载应用程序时,您将从共享的首选项中读取密钥,然后从那里开始检索节点。
Query query = FirebaseDatabase.getInstance().getReference("messages").orderByKey();
SharedPreferences prefs = getSharedPreferences(MY_PREFS_NAME, MODE_PRIVATE);
String last_seen_message_key = prefs.getString("last_seen_message_key", null);
if (last_seen_message_key != null) {
query = query.startAt(last_seen_message_key)
}
query.addChildEventListener(...
有关此的更多信息,请参见: