使用Firebase的Android服务无法正常运行

时间:2018-05-17 12:15:35

标签: android firebase firebase-realtime-database android-service

我正在构建一个具有聊天功能的应用。我正在使用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 :(得分:1)

如果应用不在前台,Android可能会停止您的服务。这样做是为了在不使用应用程序时节省资源。它还可能阻止您的应用程序进行任何联网,甚至完全终止应用程序进程。除了将其作为前台服务之外,您无法阻止此操作。前台服务可能不是为您的案例做的最好的事情,对您的用户来说也不是最好的事情。

Read more about limitations on background services

最好使用Firebase Cloud Messaging在可能感兴趣的内容发生变化时通知您的应用。