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