我正在使用FCM推送通知。当点击通知时,我正在传递启动新活动的意图。当应用程序处于前台时,应用程序正常工作并且意图启动新活动,但是当应用程序处于后台时,它不会启动新活动,而是启动默认活动的实例。
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
//Displaying data in log
//It is optional
Log.d(TAG, "From: " + remoteMessage.getFrom());
Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
//Calling method to generate notification
sendNotification(remoteMessage.getNotification().getBody());
}
private void sendNotification(String messageBody) {
Intent intent = new Intent(this, SecActivity.class);
intent.putExtra("started_from","notification");
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle("Firebase Push Notification")
.setContentText(messageBody)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}
}
答案 0 :(得分:0)
希望您在收到消息时尝试启动mainactivity。当应用程序从后台恢复时,您当前的活动将被清除。 从FLAG_ACTIVITY_CLEAR_TOP的文档: 如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是将关闭其上的所有其他活动,并将此Intent传递给(现在开启) top)旧活动作为新的意图。
尝试删除此标记。
答案 1 :(得分:0)
我也有同样的问题,但我设法解决了这个问题,
在清单中提到的默认活动中,在onCreate中执行此操作
if (bundle != null) {
if ((String) bundle.get("tag") != null) {
String tag = (String) bundle.get("tag");
if (tag.equals("abc")) {
Intent intent = new Intent(SplashActivity.this, MessageDetailsActivity.class);
startActivity(intent);
} else if (tag.equals("def")) {
openSpecificActivity(tag, (String) bundle.get("id"));
}
} else {
Intent i = new Intent(SplashActivity.this, HomeActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
}
}
答案 2 :(得分:0)
使用此:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
答案 3 :(得分:0)
我得到了一个解决方案。 只需将下面的代码放在启动器活动的oncreate方法中。
if (bundle != null) {
String value = bundle.getString("key");
if (value != null) {
startActivity(new Intent(MainActivity.this, secActivity.class));
}
}
当应用程序处于后台或被杀时,FCM将不会调用onmessagerecieved方法,但它会将数据发送到系统托盘以显示通知。因此,当用户单击时,数据载入(从fcm控制台发送)将不会由onmessagerecieved方法处理。通知,它将启动app的默认活动,datapayload将通过intent传递。所以在启动器活动的oncreate方法中进行更改(如上所述)即使应用程序处于后台或被杀,我们也可以获得datapayload。(ex键由fcm发送当应用程序处于前台datapayload时,将由fcm服务的onmessagerecieved方法处理。
答案 4 :(得分:0)
基于安蒂尼奥的回答
https://stackoverflow.com/a/37845174/4454119
为什么会这样?
FCM(Firebase云消息传递)中有两种类型的消息:
display-messages:只有当您的应用处于前台时,这些消息才会触发onMessageReceived()回调
数据消息:即使您的应用处于前台/后台/已杀死,这些消息也会触发onMessageReceived()回调 Firebase团队还没有开发用于向您的设备发送数据消息的UI。
所以你需要使用数据消息..
答案 5 :(得分:0)
在FCM中,您有两种类型的消息
当您希望FCM处理代表客户端应用程序显示通知时,请使用通知消息。如果要在客户端应用程序中处理消息,请使用数据消息。
如果您需要在将消息发送到系统托盘之前处理消息,最好使用数据消息,对于这些类型的消息,回调首先到达onMessageRecieved方法,然后再转到系统托盘。
答案 6 :(得分:0)
为您服务
"to": token,
"notification": {
"title": "Title,
"body": "Body"
},
"data" : {
"update": "yes"
}
在ANDROID KOTLIN中
val intent = Intent(this,MainActivity::class.java)
intent.putExtra("update","yes")
......