【问题标题】:FCM push notification not received when app is killed/swiped out应用程序被杀死/刷出时未收到 FCM 推送通知
【发布时间】:2017-02-15 15:26:44
【问题描述】:

我正在将通知从 GCM 迁移到 FCM。在 GCM 中,当应用程序处于前台、后台或被杀死时,我能够收到通知,但在 FCM 中,当应用程序未通过滑动打开/杀死时,我无法收到通知。我错过了什么吗????

AndroidManifest.xml

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

FCMMessageHandler.java

公共类 FcmMessageHandler 扩展 FirebaseMessagingService {

@Override
public void onMessageReceived(RemoteMessage message) {

    // Check if message contains a data payload.
    if (message.getData().size() > 0) {
        Log.d("ABC", "Message data payload: " + message.getData());
    }

sendNotification("test");
}

 private void sendNotification(String message) {

 Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(getNotificationIcon())
                .setColor(getResources().getColor(R.color.button_background))
                //.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))
                .setContentTitle("App")
                .setStyle(new NotificationCompat.BigTextStyle().bigText(message))
                .setDefaults(Notification.DEFAULT_ALL)
                .setPriority(Notification.PRIORITY_MAX)
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
        Notification notification = notificationBuilder.build();
        notification.flags |= Notification.FLAG_AUTO_CANCEL;

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(notificationNumber /* ID of notification */, notification);

}

private int getNotificationIcon() {
    boolean useWhiteIcon = (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP);
    return useWhiteIcon ? R.drawable.ic_notification : R.drawable.ic_launcher;
}

}

json 请求正文:

{
  "notification":{
     "title":"Title",
     "message":"Message.",
     "icon" = "ic_notification",
     "sound" = "default",
     "click_action":"FCM_PLUGIN_ACTIVITY"
  },
  "data":{
     "title":"Title",
     "message":"Message.",
     "icon" = "ic_notification",
     "sound" = "default"
  },
    "to":"chIFk6ljlfdskfdsifosdifnodsifnsdofindsofindsfoindsifvndsnmdkslakjdn2p",
    "priority":"high"
}

【问题讨论】:

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


【解决方案1】:

我用按摩标签把你换成了身体标签。更改服务器中的有效负载。

{         
"to" : "deviceToken",

"notification" : {
  "body" : "Pass body here",
  "title" : "Title For Notification",
  "icon" : " icon ",
  "sound" : "notification sound here"
}

}

【讨论】:

    【解决方案2】:
    private void showNotificationMessage(Context context, String title, String message, Intent intent) {
        notificationUtils = new NotificationUtils(context);
        //intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.putExtra("message", message);
        //intent.putExtra("notification", "noti");
        notificationUtils.showNotificationMessage(title, message, intent);
    }
    
    /**
     * Showing notification with text and image
     */
    private void showNotificationMessageWithBigImage(Context context, String title, String message, Intent intent, String imageUrl) {
        notificationUtils = new NotificationUtils(context);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intent.putExtra("message", message);
        //intent.putExtra("notification", "noti");
        notificationUtils.showNotificationMessage(title, message, intent, imageUrl);
    }
    

    试试这个。我正在这样做。使用通知实用程序。下面是 NotificationUtils 代码

      package com.fourever.imlogistic.Utility;
    
    import android.app.ActivityManager;
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.ComponentName;
    import android.content.ContentResolver;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.media.Ringtone;
    import android.media.RingtoneManager;
    import android.net.Uri;
    import android.os.Build;
    import android.support.v4.app.NotificationCompat;
    import android.text.Html;
    import android.text.TextUtils;
    import android.util.Patterns;
    
    import com.fourever.imlogistic.R;
    import com.fourever.imlogistic.misc.Config;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.List;
    
    
    
    
    /**
     * Created by Ravi on 31/03/15.
     */
    public class NotificationUtils {
    
        private static String TAG = NotificationUtils.class.getSimpleName();
    
        private Context mContext;
    
        public NotificationUtils(Context mContext) {
            this.mContext = mContext;
        }
    
        public void showNotificationMessage(String title, String message, Intent intent) {
            showNotificationMessage(title, message, intent, null);
        }
    
        public void showNotificationMessage(final String title, final String message, Intent intent, String imageUrl) {
            // Check for empty push message
            if (TextUtils.isEmpty(message))
                return;
    
    
            // notification icon
            final int icon = R.drawable.logo;
    
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
            final PendingIntent resultPendingIntent =
                    PendingIntent.getActivity(
                            mContext,
                            0,
                            intent,
                            PendingIntent.FLAG_CANCEL_CURRENT
                    );
    
            final NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
                    mContext);
    
            final Uri alarmSound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE
                    + "://" + mContext.getPackageName() + "/raw/notification");
    
            if (!TextUtils.isEmpty(imageUrl)) {
    
                if (imageUrl != null && imageUrl.length() > 4 && Patterns.WEB_URL.matcher(imageUrl).matches()) {
    
                    Bitmap bitmap = getBitmapFromURL(imageUrl);
    
                    if (bitmap != null) {
                        showBigNotification(bitmap, mBuilder, icon, title, message, resultPendingIntent, alarmSound);
                    } else {
                        showSmallNotification(mBuilder, icon, title, message, resultPendingIntent, alarmSound);
                    }
                }
            } else {
                showSmallNotification(mBuilder, icon, title, message, resultPendingIntent, alarmSound);
                playNotificationSound();
            }
        }
    
    
        private void showSmallNotification(NotificationCompat.Builder mBuilder, int icon, String title, String message, PendingIntent resultPendingIntent, Uri alarmSound) {
    
            NotificationCompat.BigTextStyle inboxStyle = new NotificationCompat.BigTextStyle();
    
            //inboxStyle.addLine(message);
    
            Notification notification;
            notification = mBuilder.setSmallIcon(icon).setTicker(title).setWhen(0)
                    .setAutoCancel(true)
                    .setContentTitle(title)
                    .setContentIntent(resultPendingIntent)
                    .setSound(alarmSound)
                    .setStyle(inboxStyle.bigText(message))
                    .setSmallIcon(R.drawable.app_icon)
                    .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), icon))
                    .setContentText(message)
                    .build();
    
            NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(Config.NOTIFICATION_ID, notification);
        }
    
        private void showBigNotification(Bitmap bitmap, NotificationCompat.Builder mBuilder, int icon, String title, String message, PendingIntent resultPendingIntent, Uri alarmSound) {
            NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
            bigPictureStyle.setBigContentTitle(title);
            bigPictureStyle.setSummaryText(Html.fromHtml(message).toString());
            bigPictureStyle.bigPicture(bitmap);
            Notification notification;
            notification = mBuilder.setSmallIcon(icon).setTicker(title).setWhen(0)
                    .setAutoCancel(true)
                    .setContentTitle(title)
                    .setContentIntent(resultPendingIntent)
                    .setSound(alarmSound)
                    .setStyle(bigPictureStyle)
                    .setSmallIcon(R.drawable.app_icon)
                    .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), icon))
                    .setContentText(message)
                    .build();
    
            NotificationManager notificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(Config.NOTIFICATION_ID_BIG_IMAGE, notification);
        }
    
        /**
         * Downloading push notification image before displaying it in
         * the notification tray
         */
        public Bitmap getBitmapFromURL(String strURL) {
            try {
                URL url = new URL(strURL);
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setDoInput(true);
                connection.connect();
                InputStream input = connection.getInputStream();
                Bitmap myBitmap = BitmapFactory.decodeStream(input);
                return myBitmap;
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }
    
        // Playing notification sound
        public void playNotificationSound() {
            try {
                Uri alarmSound = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE
                        + "://" + mContext.getPackageName() + "/raw/notification");
                Ringtone r = RingtoneManager.getRingtone(mContext, alarmSound);
                r.play();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        /**
         * Method checks if the app is in background or not
         */
        public static boolean isAppIsInBackground(Context context) {
            boolean isInBackground = true;
            ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
            if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
                List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
                for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
                    if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                        for (String activeProcess : processInfo.pkgList) {
                            if (activeProcess.equals(context.getPackageName())) {
                                isInBackground = false;
                            }
                        }
                    }
                }
            } else {
                List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
                ComponentName componentInfo = taskInfo.get(0).topActivity;
                if (componentInfo.getPackageName().equals(context.getPackageName())) {
                    isInBackground = false;
                }
            }
    
            return isInBackground;
        }
    
        // Clears notification tray messages
        public static void clearNotifications(Context context) {
            NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.cancelAll();
        }
    
        public static long getTimeMilliSec(String timeStamp) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                Date date = format.parse(timeStamp);
                return date.getTime();
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return 0;
        }
    }
    

    使用 isAppIsInBackground 方法代码。它可以帮助你

    【讨论】:

    • showNotificationMessage 方法是从代码中的什么位置调用的?,应用程序被杀死时不会触发 onMessageReceived 方法。
    猜你喜欢
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    相关资源
    最近更新 更多