推送通知需要打开特定活动



在Android应用程序上,我需要在单击推送通知时打开特定活动。我直接从火力基地 FCM 控制台发送消息。我做了下面的配置,有一些条件来打开不同的活动。当应用程序位于前台时,它工作正常。

当应用程序位于前台时,单击收到的通知后,它会根据给定条件打开相应的活动。一切正常。

但是,当应用程序在后台运行时,单击推送通知时,它会打开主要活动。此外,显示的消息是我在 FCM 的通知有效负载中给出的消息(不是在 FCM 控制台的数据有效负载/附加部分中给出的消息(。

我需要应用程序在应用程序在后台时在单击推送通知时打开特定活动。

我不能直接从 FCM 控制台执行此操作吗?

请告知

public class MyFireBaseMessagingService extends FirebaseMessagingService {

private static final String TAG = "FCM Service";
private static int count = 0;

@Override
public void onNewToken(@NonNull String s) {
super.onNewToken(s);
Log.e(TAG, "onNewToken: " + s);
}

@Override
public void onMessageReceived(@NonNull RemoteMessage remoteMessage) {
Map<String,String> opendata = remoteMessage.getData();
String actionValue = opendata.get("openactivity");

Intent intent=new Intent();
assert actionValue != null;
switch (actionValue) {
case "Activity1":
intent = new Intent(this, Activity1.class);
break;
case "Activity2":
intent = new Intent(this, Activity2.class);
break;
}

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("pushnotification","True");
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationManager mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_LOW;
NotificationChannel mChannel = new NotificationChannel("MyID", "Myapp", importance);
mChannel.setDescription(remoteMessage.getData().get("message"));
mChannel.enableLights(true);
mChannel.setLightColor(Color.RED);
mChannel.enableVibration(true);
mNotifyManager.createNotificationChannel(mChannel);
}
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, "MyID");
mBuilder.setContentTitle(remoteMessage.getData().get("title"))
.setContentText(remoteMessage.getData().get("message"))
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.maft_logo))
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setColor(Color.parseColor("#FFD600"))
.setContentIntent(pendingIntent)
.setChannelId("Myid")
.setPriority(NotificationCompat.PRIORITY_LOW);

mNotifyManager.notify(count, mBuilder.build());
count++;
}
}

清单

<service
android:name=".MyFireBaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>

如果通知单击应用背景状态,则会打开应用启动器活动。在启动器活动中,您需要检查通知中是否有任何待处理的意图并执行它。

在您的启动器活动(主活动(中尝试此操作。

Intent intent=new Intent();
Intent fromIntent = getIntent();
if (fromIntent.getExtras()!=null){
try {
Map<String,String> opendata = remoteMessage.getData();
String actionValue = opendata.get("openactivity");
switch (actionValue){
case "Activity1":
intent=new Intent(this, Activity1.class);
break;
case "Activity2":
intent=new Intent(this, Activity2.class);
break;
default: 
intent = new Intent(MainActivity.this, DefaultActivity.class);
break
}
} catch(Exception e){
intent = new Intent(MainActivity.this, DefaultActivity.class);
}
} else{
intent = new Intent(MainActivity.this, DefaultActivity.class);
}
startActivity(intent);

当您的应用在后台时,该方法onMessageReceived永远不会调用,系统通知会自动显示在通知托盘上,因此您需要在主活动中实现一些逻辑(与onMessageReceived方法相同(以将用户导航到目标屏幕。

有两种类型的通知:

  1. 数据电文通知 另一种是
  2. 正常通知

在从服务器发送的数据消息通知中,当您的应用被杀死时,我们在 onMessageReceive 方法中获得了有效负载。 但是,如果通知从其他类似控制台触发并且您的应用程序被杀死,那么您会收到默认通知,onMessageReceive方法中没有回调。

为了进行测试,您可以在onMessageReceive方法中设置日志,但当应用程序被终止并且您从控制台触发通知时,但是由于数据消息而使用服务器 你在 onMessageTReceive 中得到了回调。

在您的情况下一切正常,您必须尝试使用实际服务器

我最近发现,有关通知的几乎所有内容都由云消息传递功能管理。您不需要在 onMessageReceived 中创建NotificationManager。该函数预设标题和正文。它还可以设置单击通知时要打开的活动。

您只需要包含与通知一起发送的有效负载参数"click_action"。您的有效负载需要如下所示:

return admin.messaging().sendToTopic(
topicId,
{
notification: {
title: "Custom title",
body:   "Custom body",
click_action: "DestinationActivity"
}, 
data: {
"payload": myPayload
}
}

有关云功能的更多信息,请单击此处。

现在转到项目的清单并找到目标活动。进行以下更改(确保将导出的属性设置为 true(:

<activity
android:name="DestinationActivity"
android:exported="true">
<intent-filter>
<action android:name="DestinationActivity" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>

Intent 过滤器从有效负载中选取 click_action 参数,因此任何以"目标活动"作为其单击操作的通知都应由目标活动处理。我开始认为甚至不需要覆盖onMessageReceived方法。FCM使它变得非常方便。

相关内容

  • 没有找到相关文章

最新更新