我在Android应用程序中聊天。通过此聊天,我的应用程序中的用户可以通过文本相互通信。
当一个用户(“ Zoey”)向另一个用户(“ Fred”)发送消息时,我希望Fred能够收到有关此消息的通知,即使在Zoey发送消息时,Fred设备上的应用程序已关闭。
我试图创建一种服务,该服务基本上假定每次对数据库引用的更改完成后都进行监听。
@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);
}
答案 0 :(得分:0)
我建议您使用Firebase Cloud Messaging。
https://firebase.google.com/docs/cloud-messaging
这将确保在App处于后台时将通知发送。 如果您使用某项服务,但系统杀死了该应用程序,则在这种情况下,该服务将无法再次启动,并且通知也不会传递给用户。
这是我的经验。经过长时间的服务尝试,我通过FCM提出了一个解决方案,对我来说这很完美。
答案 1 :(得分:0)
该函数的工作方式是侦听数据库中任何状态的变化。
基本上,您会聆听所需参考中的更改,如果更改了参考,则会启动一个功能,该功能将使用发送方和接收方的电话令牌ID并生成通知负载。
要更好地理解,请检查此
例如,在您的用例中,我会这样做
首先,我向用户发送一条消息,然后将其发布到Firebase数据库中时,我触发一个获取发件人令牌ID的函数,并发送并触发一个获取该消息并将其发送给接收者令牌ID的函数,如下所示:通知有效载荷。
接收消息的用户不需要在前台运行该应用程序,它可以在后台运行或被杀死(请确保连接到fcm的应用程序的服务保持运行)