我正在使用App,我需要在其中显示通知。 对于通知,我使用的是FireBase云消息传递(FCM)。 当应用程序处于后台时,我可以获得通知。
但是当我点击通知时,它会重定向到 home.java 页面。我希望它重定向到 Notification.java 页面。
那么,请告诉我如何在点击通知中指定活动。 我正在使用两项服务:
1)的 MyFirebaseMessagingService
2)的 MyFirebaseInstanceIDService
这是MyFirebaseMessagingService类中 onMessageReceived()方法的代码示例。
public class MyFirebaseMessagingService extends FirebaseMessagingService {
private static final String TAG = "FirebaseMessageService";
Bitmap bitmap;
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.d(TAG, "From: " + remoteMessage.getFrom());
// Check if message contains a data payload.
if (remoteMessage.getData().size() > 0) {
Log.d(TAG, "Message data payload: " + remoteMessage.getData());
}
// Check if message contains a notification payload.
if (remoteMessage.getNotification() != null) {
Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
}
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
}
/**
* Create and show a simple notification containing the received FCM message.
*/
private void sendNotification(String messageBody, Bitmap image, String TrueOrFalse) {
Intent intent = new Intent(this, Notification.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("Notification", TrueOrFalse);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
.setLargeIcon(image)/*Notification icon image*/
.setContentTitle(messageBody)
.setStyle(new NotificationCompat.BigPictureStyle()
.bigPicture(image))/*Notification with Image*/
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setContentIntent(pendingIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}
/*
*To get a Bitmap image from the URL received
* */
public Bitmap getBitmapfromUrl(String imageUrl) {
try {
URL url = new URL(imageUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoInput(true);
connection.connect();
InputStream input = connection.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(input);
return bitmap;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
}
答案 0 :(得分:27)
使用FCM,您可以向客户发送两个types of messages:
<强> 1。通知消息:有时被视为&#34;显示消息。&#34;
FCM代表客户端应用自动向最终用户设备显示消息。通知消息具有一组预定义的用户可见键。
<强> 2。数据消息,由客户端应用处理。
客户端应用程序负责处理数据消息。数据消息只有自定义键值对。
根据FCM文件Receive Messages in an Android App
- 当您的应用在后台时发送通知。在这种情况下,通知会传递到设备的系统托盘。 用户点按通知会默认打开应用启动器。
- 包含通知和数据有效负载的消息,包括后台和前台。在这种情况下,通知会传递到
设备的系统托盘,数据有效负载在附加功能中提供 您的启动器活动的意图。
在通知有效内容中设置click_action
:
因此,如果您要处理在后台到达的邮件,则必须发送带有邮件的click_action
。
click_action
是parameter of the notification payload
如果要打开应用并执行特定操作,请在通知有效内容中设置click_action
,并将其映射到要启动的活动中的意图过滤器。
例如,将click_action
设置为OPEN_ACTIVITY_1
以触发如下所示的意图过滤器:
<intent-filter>
<action android:name="OPEN_ACTIVITY_1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
FCM有效负载如下所示:
{
"to":"some_device_token",
"content_available": true,
"notification": {
"title": "hello",
"body": "test message",
"click_action": "OPEN_ACTIVITY_1"
},
"data": {
"extra":"juice"
}
}
答案 1 :(得分:6)
当应用处于背景意图时,必须在启动器活动中传递。因此,它会打开您的启动器活动。现在您检查启动器活动中的Intent中是否有数据,然后启动所需的活动。
答案 2 :(得分:3)
<强>的AndroidManifest.xml 强>
<activity android:name="YOUR_ACTIVITY">
<intent-filter>
<action android:name="com.example.yourapplication_YOUR_NOTIFICATION_NAME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
您的FirebaseMessagingService.java文件onMessageReceived方法:
public void onMessageReceived(RemoteMessage remoteMessage){
String title=remoteMessage.getNotification().getTitle();
String message=remoteMessage.getNotification().getBody();
String click_action=remoteMessage.getNotification().getClickAction();
Intent intent=new Intent(click_action);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder notificationBuilder=new NotificationCompat.Builder(this);
notificationBuilder.setContentTitle(title);
notificationBuilder.setContentText(message);
notificationBuilder.setSmallIcon(R.mipmap.ic_launcher);
notificationBuilder.setAutoCancel(true);
notificationBuilder.setContentIntent(pendingIntent);
NotificationManager notificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0,notificationBuilder.build());
}
您的云计算功能/服务器代码:
notification: {
title: "TITLE OF NOTIFICATION",
body: "NOTIFICATION MESSAGE",
sound: "default",
click_action: "com.example.myapplication_YOUR_NOTIFICATION_NAME"
}
答案 3 :(得分:1)
打开 MyFirebaseMessagingService.java 文件
在该文件中有一个 sendNotification()方法,您必须在Intent中指定您需要导航到的活动,如下所示
Intent intent = new Intent(this, YourActivityName.class);
如果您要发送多个通知并且想要点击特定通知导航到不同的活动,您可以使用任何条件语句来实现它,我的建议是使用 switch case ,如图所示以下
private void sendNotification(String messageBody, Bitmap image, String TrueOrFalse) {
Intent intent = new Intent();
switch(condition) {
case '1': intent = new Intent(this, ActivityOne.class);
break;
case '2': intent = new Intent(this, ActivityTwo.class);
break;
case '3': intent = new Intent(this, ActivityThree.class);
break;
default : intent = new Intent(this, DefaultActivity.class);
break;
}
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("Notification", TrueOrFalse);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
}
使用此逻辑,您可以在FCM中的通知单击中打开特定活动。 这对我来说非常适合。 谢谢
答案 4 :(得分:0)
这是最容易理解的方法。
发送通知有效载荷为
的数据有效载荷时 notification: {
title: "Your order status.",
body: orderStatusDetail,
clickAction: "ShopFragment"
},
data: {
ORDER_ID: orderId
}
通知clickAction将是您用来将数据传递到Activity中的过滤器,什么数据? data: { }
对象发送的数据附加到有效载荷上。
因此,clickAction将触发清单中的意图过滤器,因此首先我们需要创建它
<activity
android:name=".activity.MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="ShopFragment"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
现在,我们将意图过滤器设置为与clickAction相同的名称,执行此操作将触发,只要我们在通知选项卡上按通知,就会启动该意图过滤器,以及与此意图过滤器相关的活动。>
然后,只需在MainActivity上使用intent.getStringExtra("ORDER_ID")
,即可在数据有效负载中额外发送String。
在这种情况下,请确保 ORDER_ID 是我们从data { }
对象发送的密钥,并且在客户端中必须相同才能获取此数据。