我正在将Firebase云消息传递中的通知检索到我的android应用中。但是问题是当我的应用打开或处于运行状态时,这种情况下只有我的应用正在检索通知。如果我不使用我的应用程序,或者我的应用程序未打开,并且我发送了任何推送通知,说明该通知未在我的应用程序内检索。
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
super.onMessageReceived(remoteMessage);
mFirestore = FirebaseFirestore.getInstance();
if (remoteMessage.getData() != null) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
sendNotificationAPI26(remoteMessage);
else
sendNotification(remoteMessage);
}
}
private void sendNotification(RemoteMessage remoteMessage) {
isNotificationMatching = false;
Intent intent = new Intent(this, Dashboard.class);
intent.putExtra("notificationFragment", "showNotifications");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
final Map<String, String> data = remoteMessage.getData();
String title = data.get("title");
String description = data.get("description");
String url = data.get("url");
String code = data.get("code");
String actual_price = data.get("actual_price");
String deal_price = data.get("deal_price");
String key = data.get("key");
final String id = data.get("id");
mFirestore.collection("notifications").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
if (document.getData().get("id").equals(id)) {
isNotificationMatching = true;
break;
}
}
if (!isNotificationMatching) {
postDataToFirebaseServer(data);
}
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.app_logo)
.setContentText(title)
.setAutoCancel(true)
.setSound(defaultSoundUri);
builder.setContentIntent(pendingIntent);
NotificationManager noti = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
noti.notify(new Random().nextInt(), builder.build());
}
private void postDataToFirebaseServer(Map<String, String> data) {
Map<String,Object> postDataMap = new HashMap<>();
postDataMap.put("title", data.get("title"));
postDataMap.put("description", data.get("description"));
postDataMap.put("url", data.get("url"));
postDataMap.put("id", data.get("id"));
postDataMap.put("code", data.get("code"));
postDataMap.put("actual_price", data.get("actual_price"));
postDataMap.put("deal_price", data.get("deal_price"));
postDataMap.put("key", data.get("key"));
postDataMap.put("timestamp", FieldValue.serverTimestamp());
mFirestore.collection("notifications").add(postDataMap).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
// Toast.makeText(getA.this, "Success", Toast.LENGTH_SHORT);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
String error = e.getMessage();
// Toast.makeText(Testing.this, "Failed", Toast.LENGTH_SHORT);
}
});
}
private void sendNotificationAPI26(RemoteMessage remoteMessage) {
Intent intent = new Intent(this, Dashboard.class);
intent.putExtra("notificationFragment", "showNotifications");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
final Map<String, String> data = remoteMessage.getData();
String title = data.get("title");
String description = data.get("description");
String url = data.get("url");
String code = data.get("code");
String actual_price = data.get("actual_price");
String deal_price = data.get("deal_price");
String key = data.get("key");
final String id = data.get("id");
mFirestore.collection("notifications").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
if (document.getData().get("id").equals(id)) {
isNotificationMatching = true;
break;
}
}
if (!isNotificationMatching) {
postDataToFirebaseServer(data);
}
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
NotificationHelper helper;
Notification.Builder builder;
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
helper = new NotificationHelper(this);
builder = helper.getLootBoxNotification(title, description, url, id, code, actual_price, deal_price, key, defaultSoundUri);
helper.getManager().notify(new Random().nextInt(), builder.build());
builder.setContentIntent(pendingIntent);
}
}
我希望当我的应用程序关闭时或当时未处于运行状态时,发送的任何推送通知也将在应用程序内部进行检索。
答案 0 :(得分:0)
此问题已在此处得到解答:How to handle notification when app in background in Firebase
希望对您有所帮助!祝好运!