public class MyService extends Service {
FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference().child("notify");
// NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
return null;
}
@Override
public void onCreate() {
super.onCreate();
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String value = dataSnapshot.getValue().toString();
NotificationCompat.Builder mBuilder =
(NotificationCompat.Builder) new NotificationCompat.Builder(getApplicationContext())
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Society")
.setContentInfo(value)
.setVibrate(new long[]{500, 500}).setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setContentText(value);
NotificationManager mNotifyMgr =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotifyMgr.notify(001, mBuilder.build());
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(getApplicationContext(), "Service started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
}
我想创建一个服务,在将新子项添加到firebase中的“notify”标记时显示通知。 问题是当服务第一次启动时,“notify”标记下的所有子进程都会通过通知构建器得到通知。 此外,在特定的一组句点之后,即使在通知标记下没有创建新的子节点,此过程也会重复。 我想仅显示添加到“notify”标记的最新子项的通知。
答案 0 :(得分:0)
当您向Firebase参考添加ChildEventListener
时,onChildAdded
被称为一次给予给定资源的每个孩子。否则,您将如何填充ListView
或RecyclerView
? ; - )
我建议您在JSON结构中添加createdAt
和updatedAt
字段(使用ISO 8601格式)。然后,您可以在添加事件侦听器后创建query个元素。
然而it is a bad idea keep a listener running on a background service,因为你会长时间打开一个插座,耗尽设备电池。