我在Android应用程序中聊天。通过此聊天,我的应用程序中的用户可以通过文本相互通信。
当用户("Zoey"(向其他用户("Fred"(发送消息时,我希望Fred收到有关该消息的通知,即使Fred设备上的应用程序在Zoey发送消息时已关闭。
我尝试创建一个服务,该服务基本上假设每次对我的数据库引用进行更改时都会侦听。
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// Toast.makeText(getApplicationContext(),"service created: "+staticUSERNAME,Toast.LENGTH_LONG).show();
databaseReference = FirebaseDatabase.getInstance().getReference().child("Notifications");
notificationManager = NotificationManagerCompat.from(this);
createNotificationChannels();
addUserStateListener();
Toast.makeText(getApplicationContext(),"service started ",Toast.LENGTH_LONG).show();
//add5();
return START_STICKY;
}
private void addUserStateListener() {
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
Toast.makeText(getApplicationContext(), "DATE CHANGED.", Toast.LENGTH_LONG).show();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
databaseReference.addValueEventListener(valueEventListener);
}
我建议您使用Firebase Cloud Messaging。
https://firebase.google.com/docs/cloud-messaging
这将保证当应用程序在后台运行时将发送通知。如果您使用某项服务并且系统被终止,则在以下情况下,服务将无法重新启动,并且不会向用户发送通知。
这是我的经验。 经过长时间的服务尝试,我用FCM做了一个解决方案,这对我来说是完美的。
它应该如何与侦听数据库中任何状态更改的函数一起工作。
基本上,您侦听所需引用中的更改,如果该引用发生更改,您将启动一个函数,该函数将获取发送方和接收方的电话令牌 ID 并进行通知有效负载。
为了更好地理解,请检查这个
FCM 通知
例如,在您的用例中,我会这样做
首先,我向用户发送一条消息,然后在将该消息发布到 Firebase 数据库时,我会触发一个函数,该函数获取发送方令牌 ID,并发送并触发一个函数,该函数获取该消息并将其作为通知有效负载发送到接收方令牌 ID。
接收消息的用户不需要将应用置于前台,它可以在后台或被终止(确保连接到 fcm 的应用的服务保持运行(