2017-02-15 204 views
0

我正在將通知從GCM遷移到FCM。在GCM中,當應用程序處於前景,背景或死亡狀態時,我可以收到通知,但在FCM中,當應用程序沒有通過刷卡打開/殺死時,我無法收到通知。我錯過了什麼嗎?當應用程序被殺/被刷出時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" 
} 
+0

如果(!NotificationUtils.isAppIsInBackground(getApplicationContext()))檢查此條件,並根據該 –

+0

哪些設備你的代碼,你的測試? –

+0

@Vishnu,samsung S7 mobile和Nexus 5仿真器 – Jignesh

回答

0
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。以下是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方法代碼。它可以幫助你

+0

showNotificationMessage方法是從您的代碼中的哪個位置調用的,onMessageReceived方法在應用程序被終止時不會觸發。 – Jignesh

0

我得到你r使用按摩標籤女巫r替換身體標籤。更改服務器中的有效負載

{   
"to" : "deviceToken", 

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

}

+0

嘗試過,仍然無法正常工作.. – Jignesh