gpt4 book ai didi

android - 确定 Activity 是否从 FCM 通知点击打开

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:26:31 26 4
gpt4 key购买 nike

我正在使用 fcm 控制台向所有安装了我的应用程序的设备发送消息,通知没有任何额外的负载,只有通知消息。

我想知道是否有一种简单的方法可以知道是否通过 FCM 通知点击打开了 Activity。

通过扩展 FirebaseMessagingService 服务并自行创建通知,有一个解决方案。

我想知道是否有另一种解决方案,无需扩展服务或向通知传递额外内容。

用于从通知点击打开 Activity 的 Intent 是否传递了任何额外信息?

最佳答案

我希望您知道基于 FCM 的消息传递创建了两种类型的通知

首先,我们通过onMessageReceived()方法创建的通知,这里需要注意的一点是,如果应用程序在前台,就会触发onMessageReceived() .

其次,当应用程序处于后台时,FCM 会创建自己的默认通知,在这种情况下,onMessageReceived() 不会被拦截,因此我们无法自行设置挂起的 Intent。

注意:在我的“数据”消息 onMessageReceived() 被触发的情况下,当您向您的应用程序发送“通知”推送消息时,上述类型开始发挥作用无论应用程序处于前台还是后台(从 FCM 控制台发送的通知是“通知”类型的推送消息)

回到您的问题,不清楚您是从 FCM 控制台发送推送消息还是向 FCM 服务器发出请求,所以让我们在这里举例说明。

  1. FCM 控制台发送的消息:
    从 FCM 通知面板的高级部分发送数据负载,如下所示

enter image description here

当app在前台时onMessageReceived()会被拦截使用下面的代码接收数据负载

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;
}
}

如果应用程序在后台,则在通知点击应用程序时将在“默认” Activity 上打开,您可以通过在 Activity 的 Intent 过滤器的应用程序 list 中添加以下行来将任何 Activity 设置为默认 Activity :

<category android:name="android.intent.category.DEFAULT" />

在此 Activity 中,您可以调用以获取 intent extra,然后获取数据负载以决定您需要登陆哪个 Activity。代码如下

    .
.
.

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;
}
}
}
  1. 从FCM服务器发送的消息:从上面的FCM控制台发送的消息与将下面的json正文作为post请求发送到FCM服务器相同:

    { 
    "notification": {
    "title": "Hi Tester",
    "text": "News for testing",
    "sound": "default",
    "badge": 0
    },
    "data":{
    "type": "credits"
    },
    "priority": "high",
    "to": "{{device_token}}"
    }

对于这种情况,拦截通知的过程是相同的。

关于android - 确定 Activity 是否从 FCM 通知点击打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47334177/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com