Как я могу получить уведомление, когда новый ребенок добавляется в базу данных Firebase в реальном времени?(Я хочу использовать службы Android вместо FCM) - PullRequest
0 голосов
/ 20 сентября 2018

Это то, чего я достиг!В моем приложении у меня есть кнопка включения уведомлений и кнопка отключения уведомлений.Включите кнопку запуска службы и установите прослушиватель базы данных.Выключите кнопку, чтобы остановить службу и удалить прослушиватель базы данных.

public class NotificationService extends Service {
String CHANNEL_ID = "hostelmate_notification";

DatabaseReference databaseIssue;

ChildEventListener childEventListener;

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent, int flag, int startId) {
    Toast.makeText(this,"Notifications activated",Toast.LENGTH_LONG).show();

    databaseIssue = FirebaseDatabase.getInstance().getReference("issues");
    childEventListener = new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            displayNotification();
        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    };
    databaseIssue.addChildEventListener(childEventListener);

    return START_STICKY;
}

@Override
public void onDestroy() {
    databaseIssue.removeEventListener(childEventListener);
    Toast.makeText(this,"Notifications deactivated",Toast.LENGTH_LONG).show();
    super.onDestroy();
}

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

public void displayNotification(){
    createNotificationChannel();

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
    builder.setSmallIcon(R.drawable.ic_notifications_active_white_24dp);
    builder.setContentTitle("Hostel Mate");
    builder.setContentText("New issue reported!");
    builder.setPriority(NotificationCompat.PRIORITY_HIGH);

    NotificationManagerCompat notificationManagerCompat =NotificationManagerCompat.from(this);
    int notificationId = (int) ((new Date().getTime() / 1000L) % Integer.MAX_VALUE);
    notificationManagerCompat.notify(notificationId, builder.build());
}

private void createNotificationChannel(){
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
        CharSequence name  = "Hostelmate notification";
        String description = "Hi";
        int importance = NotificationManager.IMPORTANCE_DEFAULT;

        NotificationChannel notificationChannel = new NotificationChannel(CHANNEL_ID, name, importance);

        notificationChannel.setDescription(description);

        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        notificationManager.createNotificationChannel(notificationChannel);
    }
}

}

В чем проблема с моим подходом?

Я хочу показывать уведомление только при новомребенок добавлен в базу данных. Но в настоящее время уведомление отображается при запуске самой службы.

Как этого избежать?

1 Ответ

0 голосов
/ 20 сентября 2018

ChildEventListeners запускаются изначально с всеми данными в выбранном месте.Каждый дочерний узел, который существует в этом месте, приведет к одному вызову onChildAdded.Невозможно сказать, чтобы дать вам только «новых» детей.Если вам нужны только определенные элементы в зависимости от текущего времени, вам нужно сделать запрос, который возвращает только новые элементы.Это, вероятно, предполагает включение некоторой метки времени в ваши дочерние узлы и запрос только тех, которые прошли текущее время.

Вместо этого вы можете использовать облачные функции для запуска новых изменений в базе данных, а затем в своей функции.код, использовать Firebase Cloud Messaging для уведомления приложений, которые заинтересованы в новых детях?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...