android - 当用户应用程序在后台运行时如何显示通知?
问题描述
我正在使用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
用于接收推送通知,您应该知道当应用程序在后台时应用程序不会收到消息。检查这个文档
推荐阅读
- c++ - C++ Libpq Postgresql - 函数主 CLibpq 中引用的未解析的外部符号 PQconnectdb
- javascript - 带有全选复选框和淘汰赛的 JQuery 数据表
- ios - 如何在windows中为ios创建安装文件
- node.js - 我是否正确导出中间件?(TypeError:无法读取未定义的属性“单个”)
- flutter - Flutter BouncingScrollPhysics 在一个 StatefulWidget 中工作,但在一个几乎相同的小部件中不工作
- loops - 从 csv 文件打开有限数量的 url 的批处理文件失败
- c - 链表和真值表的问题
- flutter - Flutter 来回获取类字段值
- typescript - 任意数量的通用参数
- django - Django重定向在身份验证中不起作用