我正在构建具有聊天功能的应用程序。我正在使用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) {

                }
            });
        }
    }
}


}

最佳答案

如果应用程序不在前台,则Android可能会停止您的服务。这样做是为了在不使用应用程序时节省资源。它还可能会阻止您的应用程序进行任何联网,甚至完全杀死应用程序进程。除了使其成为前台服务之外,您无法采取任何措施来阻止这种情况。前台服务可能不是针对您的情况的最佳选择,也不是针对您的用户的最佳选择。

Read more about limitations on background services

最好在某些变化感兴趣时使用Firebase Cloud Messaging通知您的应用程序。

10-07 19:33
查看更多