如何添加fcm通知?

时间:2017-06-14 16:38:56

标签: android firebase push-notification firebase-cloud-messaging

当app在后台时,如何在收件箱样式中添加fcm通知?

当我添加以下代码时,我在应用程序打开时获得了收件箱样式

但如果应用是后台,则会显示单独的通知

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private static final String TAG = "MyFirebaseMsgService";

    Integer notify_no = 0;

    Integer numMessages = 0;

    DBHelper db = new DBHelper(this);

    private final int notificationID = 237;
    private static int value = 0;
   // Notification.InboxStyle inboxStyle = new Notification.InboxStyle();
    //Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.newlogo);


        // TODO(developer): Handle FCM messages here.

        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());
           /* Integer badge = Integer.parseInt(remoteMessage.getData().get("badge"));
            Log.d("notificationNUmber",":"+badge);
            setBadge(getApplicationContext(), badge);*/
        }

        // Check if message contains a notification payload.
        if (remoteMessage.getNotification() != null) {
            Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }



        Intent intent = new Intent();
        intent.setAction("com.ksoft.propreka.CUSTOM_INTENT");
        sendBroadcast(intent);

        db.insertNotification(remoteMessage.getNotification().getBody(),remoteMessage.getData().get("room_id"));

        //EventBus.getDefault().post(remoteMessage.getNotification().getBody());
        //

        try {
            if (remoteMessage.getNotification() != null) {
                sendNotification(remoteMessage.getData().get("text"));
            } else if (!remoteMessage.getData().isEmpty()) {
                sendNotification(remoteMessage.getData().get("text"));
            }
        } catch (Exception e) {
            Log.d("json error", e.toString());
        }

        //sendNotification(remoteMessage.getData().get("text"));
        Log.d("test",":test notification");
        //createpushnotification();

        // 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.
     *
     * @param messageBody FCM message body received.
     */
    public void sendNotification(String messageBody) {

        Intent intent = new Intent(this,Main2Activity.class);
        intent.putExtra("messages","messages");
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        intent.putExtra("fcm_notification", "Y");

        PendingIntent pendingIntent = PendingIntent.getActivity(this,0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT);




        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setContentTitle("Propreka")
                .setSmallIcon(R.mipmap.new_logo)
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(Uri.parse("content://settings/system/notification_sound"))
                .setVibrate(new long []{100,2000,500,2000})
                .setContentIntent(pendingIntent);


        NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
        inboxStyle.setBigContentTitle(getResources().getString(R.string.app_name));
        Integer msg_count  = db.message_count();
        Integer chat_count = db.chat_count();
        inboxStyle.setSummaryText(" "+msg_count+" messages from "+chat_count+" chat");

        ArrayList<ArrayList> Newchat = db.getNotifications();

        for (ArrayList s : Newchat) {

            inboxStyle.addLine(s.get(0).toString());
        }

        notificationBuilder.setStyle(inboxStyle);
        NotificationManager notificationManager =(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0, notificationBuilder.build());

        /*Intent resultIntent = new Intent(getBaseContext(), Main2Activity.class);
        resultIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        resultIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        PendingIntent piResult = PendingIntent.getActivity(this, 1, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationManager nManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.new_logo)
                .setContentTitle(getResources().getString(R.string.app_name))
                .setContentText(messageBody)
                .setVibrate(new long []{0,100,10,100})
                .setContentIntent(piResult);
        NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
       // String[] events = new String[6];

        inboxStyle.setBigContentTitle(getResources().getString(R.string.app_name));

        ArrayList<ArrayList> Newchat = db.getNotifications();

        for (ArrayList s : Newchat) {

            inboxStyle.addLine(s.get(0).toString());
        }

        mBuilder.setStyle(inboxStyle);
        nManager.notify(getResources().getString(R.string.app_name),0 ,mBuilder.build());*/


    }
    public void createpushnotification()
    {
        Log.i("Start", "notification");

   /* Invoking the default notification service */
        NotificationCompat.Builder  mBuilder = new NotificationCompat.Builder(this);

        mBuilder.setContentTitle("New Message");
        mBuilder.setContentText("You've received new message.");
        mBuilder.setTicker("New Message Alert!");
        mBuilder.setSmallIcon(R.mipmap.new_logo);

   /* Increase notification number every time a new notification arrives */
        mBuilder.setNumber(++numMessages);

   /* Add Big View Specific Configuration */
        NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();

        String[] events = new String[6];
        events[0] = new String("This is first line....");
        events[1] = new String("This is second line...");
        events[2] = new String("This is third line...");
        events[3] = new String("This is 4th line...");
        events[4] = new String("This is 5th line...");
        events[5] = new String("This is 6th line...");

        // Sets a title for the Inbox style big view
        inboxStyle.setBigContentTitle("Big Title Details:");

        // Moves events into the big view
        for (int i=0; i < events.length; i++) {
            inboxStyle.addLine(events[i]);
        }

        mBuilder.setStyle(inboxStyle);

   /* Creates an explicit intent for an Activity in your app */
        Intent resultIntent = new Intent(this, Main2Activity.class);

        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addParentStack(Main2Activity.class);

   /* Adds the Intent that starts the Activity to the top of the stack */
        stackBuilder.addNextIntent(resultIntent);
        PendingIntent resultPendingIntent =stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);

        mBuilder.setContentIntent(resultPendingIntent);
        NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

   /* notificationID allows you to update the notification later on. */
        mNotificationManager.notify(notificationID, mBuilder.build());
    }
}

如何添加收件箱样式?

2 个答案:

答案 0 :(得分:0)

有两种类型的FCM消息。

  • 通知消息。
  • 数据讯息。

FCM

发送数据信息,然后它将出现在您的通话方式中。

当在后台应用时,FCM不会调用onMessageReceived方法。 而不是显示默认通知。

答案 1 :(得分:0)

使用数据有效负载发送通知数据并使用此类向手机显示。

例如:

使用通知有效负载

this.getFullCourseBySlug(slug)
   .switchMap(course => this.getTeacherIdsPerCourse(course))
   .map(([teacherIds, course]) => {
      const arrayOfObservables = new Array<Observable>();
      for(let id of teacherIds) {
         arrayOfObservables.push(this.getTeacher(id)
                                      .map(teacher => course.teachers.push(teacher)));
      }
      return Observable.combineLatest(arrayOfObservables):
    })

当应用处于后台时,此数据会显示firebase对手机的默认通知,但当应用处于前台时,系统会调用来自{ "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...", "notification" : { "body" : "great match!", "title" : "Portugal vs. Denmark", "icon" : "myicon" } } 的{​​{1}}方法。

使用数据有效负载

每次发送通知onMessageReceived方法都会被调用。因此,您可以根据需要构建通知。

FirebaseMessagingService

有关详细信息,请访问官方文档here