实际上,我正在尝试在单击push-notification
时将意图传递给activity
,并且当应用程序存在于foreground
中时,它工作正常。但是当应用程序在后台运行时,尽管我收到push-notification
没有任何问题,但通过单击该通知,我并没有在activity
中得到意图。我试图在SO
中提出一些问题,并尝试添加像PendingIntent.FLAG_UPDATE_CURRENT
这样的标志, PendingIntent.FLAG_ONE_SHOT
,然后有意(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP )
但他们都没有帮助。请帮我解决这个问题,过去两天脖子很痛。
清单.XML:
<activity android:name=".activities.ProfileHolder"
android:windowSoftInputMode="adjustPan"
android:screenOrientation="portrait"
android:exported="true"
android:launchMode="singleTop"
>
<intent-filter>
<action android:name="profile" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
节点.js中的通知代码:
var message = {
to: u.fcm_token,
collapse_key: 'white', //anything can be given
data: {
type:"likes",
post_owner_username:data.like_post_owner_username,
owner_post_time:data.like_post_owner_time
},
priority: 'high',
notification: {
title: 'Infinity',
body:notif_data,
sound: "default",
click_action: "profile",
tag:"Hey Bro" //if specified then current msg would be replaced by new msg
}
};
fcm.send(message, function(err, response){
if (err) {
console.log(err);
} else {
console.log("Successfully sent with response: ", response);
}
});
Firebase消息服务类 :
/Varibales for notifications
String title, body, post_owner_username, post_owner_time, notif_commenter_username, notif_comment_time, follower_username,messager_username,type,action;
@Override
public void onMessageReceived(final RemoteMessage remoteMessage) {
title=remoteMessage.getNotification().getTitle();
body=remoteMessage.getNotification().getBody();
type=remoteMessage.getData().get("type");
action=remoteMessage.getNotification().getClickAction();
Log.d("type",type);
Log.d("type-2",title);
if(type.equals("likes")){
post_owner_username=remoteMessage.getData().get("post_owner_username");
post_owner_time=remoteMessage.getData().get("owner_post_time");
}
else if(type.equals("comments")||type.equals("comment_likes")){
post_owner_username=remoteMessage.getData().get("post_owner_username");
post_owner_time=remoteMessage.getData().get("owner_post_time");
notif_commenter_username=remoteMessage.getData().get("commenter_username");
notif_comment_time=remoteMessage.getData().get("comment_time");
}
else if(type.equals("follow")){
follower_username=remoteMessage.getData().get("follower_username");
}
else if(type.equals("messaging")){
messager_username=remoteMessage.getData().get("sender_username");
}
//Showing Notification
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(getApplicationContext(), Constants.CHANNEL_ID)
.setSmallIcon(R.drawable.new_icon)
.setContentTitle(title)
.setContentText(body);
Intent i = new Intent(action);
Bundle b = new Bundle();
if (type.equals("likes")) {
b.putString("post_owner_username", post_owner_username);
b.putString("post_owner_time", post_owner_time);
b.putString("what", "show_notification_post");
b.putString("Open","starred");
// i.putExtra("Open", "starred");
}
else if (type.equals("comments")) {
b.putString("post_owner_username",post_owner_username);
b.putString("post_owner_time", post_owner_time);
b.putString("notif_commenter_username", notif_commenter_username);
b.putString("notif_comment_time",notif_comment_time);
b.putString("what", "show_notification_post");
b.putString("Open","starred");
//i.putExtra("Open", "starred");
}
else if (type.equals("comment_likes")) {
b.putString("post_owner_username", post_owner_username);
b.putString("post_owner_time", post_owner_time);
b.putString("notif_commenter_username", notif_commenter_username);
b.putString("notif_comment_time", notif_comment_time);
b.putString("what", "show_notification_post");
b.putString("Open","starred");
// i.putExtra("Open", "starred");
}
else if (type.equals("follow")||type.equals("follow_request")) {
b.putString("searchUsername", follower_username);
b.putString("Open","search_profile");
//i.putExtra("Open", "search_profile");
}
else if(type.equals("messaging")){
b.putString("Open","messaging");
b.putString("msg_username",messager_username);
}
i.putExtras(b);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_SINGLE_TOP );
//ctx.startActivity(i);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, i, PendingIntent.FLAG_UPDATE_CURRENT);
/*
* Setting the pending intent to notification builder
* */
mBuilder.setContentIntent(pendingIntent);
NotificationManager mNotifyMgr =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
if (mNotifyMgr != null) {
mBuilder.setAutoCancel(true);
mNotifyMgr.notify(1, mBuilder.build());
}
}
我认为问题是因为您正在从 FCM 控制台发送通知!
从文档中
"当你的应用在用户设备上的后台运行时,通知 交付到系统托盘。当用户单击 通知,应用启动器将打开您的应用。如果你愿意,你可以 还可以添加客户端消息处理以在应用中接收通知 当它已经在用户设备上的前台时。
您应该尝试使用 FCM API 发送通知
假设我认为您在使用 API 时不应该发送通知参数,只需发送数据参数并解析您的 onMessageReceived 中的数据,如果您发送通知,它将传递到系统托盘
如何在 Firebase 中应用在后台运行时处理通知