我正在使用 fcm 控制台向所有安装了我的应用的设备发送消息,通知没有任何额外的有效负载,只有通知消息.
I am using the fcm console to send messages to all of devices that have my app installed, the notifications don't have any extra payload only the notification message.
我想知道是否有一种简单的方法可以知道是否通过 FCM 通知点击打开了 Activity.
I want to know if there is a simple way to know if an Activity was opened from an FCM notification click.
通过扩展 FirebaseMessagingService
服务并自行创建通知来解决此问题.
There is a solution for that by extending the FirebaseMessagingService
service and creating a notification by yourself.
我想知道是否有另一种解决方案,无需扩展服务或将额外内容传递给通知.
I want to know if there is another solution without extending the service or passing extras to the notification.
用于从通知点击打开活动的 Intent 是否传递了任何额外内容?
Is there any extra that is being passed with the Intent that is used for opening the activity from the notification click?
我希望你知道基于 FCM 的消息传递创建了两种类型的通知
I hope you know that FCM based messaging created two types of notification
首先,我们通过onMessageReceived()
方法创建的通知,这里需要注意的是,如果应用在前台,onMessageReceived()
会被触发.
Firstly, the notification that we create from on onMessageReceived()
method, the point to note here is that onMessageReceived()
will be triggered if the app is in foreground.
其次,当应用处于后台时,FCM 会创建自己的默认通知,在这种情况下,onMessageReceived()
不会被拦截,因此我们无法自行设置待处理的 Intent.
Secondly, FCM creates its own default notification when app is in background, in this case onMessageReceived()
is not intercepted and hence we cannot set a pending intent on our own.
注意:当您向您的应用发送通知"推送消息时,如果触发了我的数据"消息 onMessageReceived()
,上述类型就会发挥作用无论应用在前台还是后台(从 FCM 控制台发送的通知都是通知"类型的推送消息)
Note : the above mentioned types comes to play when you are sending a "notification" push message to your app in the case of a me "data" message onMessageReceived()
is triggered irrespective of the app being in foreground or background (the notifications sent from FCM console are "notifications" type push messages)
回到你的问题,不清楚你是从 FCM 控制台发送推送消息还是发出 FCM 服务器请求,所以让我们在这里做案例.
Coming back to your question, it is not clear if you're sending a push message from FCM console or making a FCM server request, so let's make cases here.
当app在前台时onMessageReceived()
会被拦截使用下面的代码接收数据负载
when app is in foreground onMessageReceived()
will be intercepted
use the code below to receive the data payload
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
//Displaying data in log
//It is optional
//Calling method to generate notification
sendNotification(remoteMessage.getData());
}
//This method is only generating push notification
//It is same as we did in earlier posts
private void sendNotification(Map<String, String> messageBody) {
Intent intent = new Intent(this, SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(
this,
0,
setNotificationRoute(messageBody),
PendingIntent.FLAG_UPDATE_CURRENT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(android.R.drawable.sym_def_app_icon)
.setContentTitle(messageBody.get("title"))
.setContentText(messageBody.get("text"))
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, notificationBuilder.build());
}
private Intent setNotificationRoute(Map<String, String> messageBody) {
Intent intent = null;
String type = messageBody.get("type");
if (type != null) {
switch (type) {
case "android": //intercept your payload here to create swit
intent = new Intent(this, MainActivity.class);
break;
default:
break;
}
}
return intent;
}
}
如果应用程序在后台,则在通知点击应用程序将在默认"活动上打开,您可以通过在活动的意图过滤器的应用程序清单中添加以下行来将任何活动设置为默认活动:
and if app is in background, then on notification click app will be opened on a "default" activity, you can set any activity as a default one by adding the following lines in the app manifest in the activity's intent filter:
<category android:name="android.intent.category.DEFAULT" />
在此活动中,您可以调用以获取额外的意图,然后获取数据有效负载以决定您需要登陆哪个活动.代码如下
inside this activity you can call to get intent extras and then get the data payload to decide on which activity you need to land on. The code is below
.
.
.
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
setNotificationRoute(getIntent().getExtras());
.
.
}
private void setNotificationRoute(Bundle extras) {
String type = extras.getString("type");
Intent intent = null;
if (type != null) {
switch (type) {
case "message":
String room = extras.getString("room");
intent = new Intent(this, MainActivity.class);
startActivity(intent);
break;
default:
break;
}
}
}
从 FCM 服务器发送的消息:上面从 FCM 控制台发送的消息与将以下 json 正文作为 post 请求发送到 FCM 服务器相同:
Message sent from FCM Server: the message sent from FCM consolse above is same as sending the below json body as post request to FCM server:
{
"notification": {
"title": "Hi Tester",
"text": "News for testing",
"sound": "default",
"badge": 0
},
"data":{
"type": "credits"
},
"priority": "high",
"to": "{{device_token}}"
}
在这种情况下拦截通知的过程将是相同的.
the process of intercepting the notifications will be same for this case.
这篇关于确定是否从 FCM 通知单击打开了活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!