在FCM中单击通知时打开特定活动

时间:2016-11-21 10:39:36

标签: android android-notifications firebase-cloud-messaging firebase-notifications

我正在使用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;

    }
}

5 个答案:

答案 0 :(得分:27)

使用FCM,您可以向客户发送两个types of messages

<强> 1。通知消息:有时被视为&#34;显示消息。&#34;

FCM代表客户端应用自动向最终用户设备显示消息。通知消息具有一组预定义的用户可见键。

<强> 2。数据消息,由客户端应用处理。

客户端应用程序负责处理数据消息。数据消息只有自定义键值对。

根据FCM文件Receive Messages in an Android App

  
      
  • 当您的应用在后台时发送通知。在这种情况下,通知会传递到设备的系统托盘。   用户点按通知会默认打开应用启动器。
  •   
  • 包含通知和数据有效负载的消息,包括后台和前台。在这种情况下,通知会传递到
      设备的系统托盘,数据有效负载在附加功能中提供   您的启动器活动的意图。
  •   

在通知有效内容中设置click_action

因此,如果您要处理在后台到达的邮件,则必须发送带有邮件的click_action

click_actionparameter 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 { }对象发送的密钥,并且在客户端中必须相同才能获取此数据。