我正在构建一个具有聊天功能的应用。我正在使用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) {
}
});
}
}
}
}
答案 0 :(得分:1)
如果应用不在前台,Android可能会停止您的服务。这样做是为了在不使用应用程序时节省资源。它还可能阻止您的应用程序进行任何联网,甚至完全终止应用程序进程。除了将其作为前台服务之外,您无法阻止此操作。前台服务可能不是为您的案例做的最好的事情,对您的用户来说也不是最好的事情。
Read more about limitations on background services
最好使用Firebase Cloud Messaging在可能感兴趣的内容发生变化时通知您的应用。