Служба Android, использующая Firebase, не работает должным образом - PullRequest
0 голосов
/ 17 мая 2018

Я создаю приложение с функциями чата. Я использую Firebase в качестве базы данных и пытаюсь добавить службу, которая уведомляет вас, когда вы получаете сообщение, когда вы находитесь за пределами приложения, и останавливается, как только вы получаете уведомление один раз для пользователя, с которым вы общаетесь, но по какой-то причине. Когда я запускаю сервис, он запускается один раз, затем останавливается и не ждет уведомлений, кто-нибудь знает почему? рассматриваемый код

public class Pmessginfnotifiysvc extends Service {
   Thread thread;
   FirebaseAuth auth12;
   Boolean first;
   long stop;
   DatabaseReference databaseReference;
   ValueEventListener valueEventListener;
   @Nullable
   @Override
   public IBinder onBind(Intent intent) {
      return null;
   }

   @Override
   public int onStartCommand(Intent intent, int flags, int startId) {
       thread = new Thread(new msgtracker());
       thread.setPriority(Thread.MAX_PRIORITY);
       thread.start();
       return START_STICKY;
   }
   private class msgtracker implements Runnable{

       public msgtracker(){}

       @Override
       public void run() {
           if (!thread.isInterrupted()){
               auth12 = FirebaseAuth.getInstance();
               databaseReference = FirebaseDatabase.getInstance().getReference().child("Users").child(auth12.getCurrentUser().getUid());
            databaseReference.child("PChat").addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    first = true;
                    stop = dataSnapshot.getChildrenCount();
                    for (final DataSnapshot kid:dataSnapshot.getChildren()) {
                        final DatabaseReference db = FirebaseDatabase.getInstance().getReference().child("Chat").child(kid.getValue().toString());
                        valueEventListener = new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (!first){
                                    MyNotificationManager.getInstance(getApplicationContext()).displayNotification("TvTime",kid.getKey() + " Has Sent You A Message!");
                                    db.removeEventListener(valueEventListener);
                                    stop--;
                                }
                                else {
                                    first = false;
                                }
                                if (stop == 0){
                                    thread.interrupt();
                                    stopSelf();
                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        };
                        first = true;
                        db.addValueEventListener(valueEventListener);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    }
}

}

1 Ответ

0 голосов
/ 17 мая 2018

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

Подробнее об ограничениях на фоновые услуги .

Лучше использовать Firebase Cloud Messaging, чтобы уведомлять ваше приложение, когда что-то изменилось и может заинтересовать его.

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