问题描述
我正在创建一个在 android studio 中使用 firebase 的聊天应用程序,我的所有活动都正常工作,期待我的后台通知,我想要的是,当其他用户发送消息以及用户看不见消息和应用程序运行时,用户会收到通知在背景中。 我会尝试这个,但我在用户聊天(看到消息)和用户应用程序在后台运行(未看到消息)时都收到通知
这是我的代码
apiService= Client.getClient("https://fcm.googleapis.com/").create(APIService.class);
userref =to.getStringExtra("id");
firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
sendmsg.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String textmsg=inputmsg.getText().toString();
if(!textmsg.equals("")){
String rand=randomString(10);
sendmessage(firebaseUser.getUid(),userref,textmsg,currentDate,currenttime,rand);
getnotifiactions(rand);
}
else{
Toast.makeText(chatscreen.this,"ENTER SOMETHING TO SEND ",Toast.LENGTH_SHORT).show();
}
inputmsg.setText("");
}
});
private void sendmessage(String sender,String receiver,String message,String currentd_d,String currenttime,String no){
DatabaseReference reference1= FirebaseDatabase.getInstance().getReference();
HashMap<String,Object> hashMap=new HashMap<>();
hashMap.put("sender",sender);
hashMap.put("receiver",receiver);
hashMap.put("message",message);
hashMap.put("date",currentd_d);
hashMap.put("time",currenttime);
hashMap.put("isseen",false);
hashMap.put("msgid",no);
reference1.child("Chats").push().setValue(hashMap);
}
private void seenmessage(String userid)
{
reference= FirebaseDatabase.getInstance().getReference("Chats");
seenlisterner=reference.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull @NotNull DataSnapshot snapshot)
{
for(DataSnapshot dataSnapshot:snapshot.getChildren())
{
Chat cht=dataSnapshot.getValue(Chat.class);
if(cht.getReceiver().equals(firebaseUser.getUid()) && cht.getSender().equals(userid) )
{
HashMap<String,Object> hashMap=new HashMap<>();
hashMap.put("isseen",true);
dataSnapshot.getRef().updateChildren(hashMap);
} } }
@Override
public void onCancelled(@NonNull @NotNull DatabaseError error)
{
}
}); }
private void getnotifiactions(String msgid) {
reference= FirebaseDatabase.getInstance().getReference();
Query query = reference.child("Chats").orderByChild("msgid").equalTo(msgid);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
for(DataSnapshot ds:snapshot.getChildren()) {
Chat ct=ds.getValue(Chat.class);
if(ct.getIsseen().equals(true)){
Toast.makeText(chatscreen.this,"Online",Toast.LENGTH_SHORT).show();
}
else
{
Toast.makeText(chatscreen.this,"OFFLINE",Toast.LENGTH_SHORT).show();
sendnotification(ct.getReceiver(),ct.getMessage());}
}
}
@Override
public void onCancelled(@NonNull @NotNull DatabaseError error) {
}
});
}
private void sendnotification(String receiver,String msg) {
DatabaseReference tokens=FirebaseDatabase.getInstance().getReference("Token");
Query query=tokens.orderByKey().equalTo(receiver);
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull @NotNull DataSnapshot snapshot) {
for(DataSnapshot dataSnapshot:snapshot.getChildren()){
String fuserid=firebaseUser.getUid();
Token token=dataSnapshot.getValue(Token.class);
Data data=new Data(firebaseUser.getUid(),R.mipmap.ic_launcher," "+msg,"New MESSAGES",userref);
Sender sender=new Sender(data,token.getToken());
apiService.sendNotification(sender).enqueue(new Callback<Myresponse>() {
@Override
public void onResponse(Call<Myresponse> call,Response<Myresponse> response) {
if(response.code()==200){
if(response.body().success != 1){
Toast.makeText(chatscreen.this,"Failed",Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onFailure(Call<Myresponse> call,Throwable t) {
}
});
}
}
@Override
public void onCancelled(@NonNull @NotNull DatabaseError error) {
}
});
}
我只想要用户应用在后台运行时的通知,而不是用户与其他用户聊天时的通知。 有谁知道如何解决这个问题?请帮帮我!
解决方法
如果您使用 FirebaseCloudMessaging
接收推送通知,您应该知道应用在后台时不会收到消息。检查这个docs