3

Я реализовал FCM в своем проекте. Push-уведомление работает так, как ожидается, onMessageReceived вызывается при получении уведомления. Это верно, когда приложение находится на переднем плане.FCM показывает дублирующее уведомление, когда приложение находится в фоновом режиме

Однако, когда приложение работает в фоновом режиме, в системном трее всегда отображать дубликат уведомления, когда один приходит (например, когда уведомлению принимается, система отображения лоток 2 Уведомление A)

Как это исправить?

EDIT: добавлен код

Я продлил FirebaseMessagingService класс и иметь это в onMessageReceived метод

Это единственная часть в проекте, где я NotificationManager.

Кроме того, я попытался добавить журнал этого метода. onMessageReceived вызывается, когда приложение находится на переднем плане. Он не вызван, когда приложение находится в фоновом режиме

@Override 
public void onMessageReceived(RemoteMessage remoteMessage) 
{ 
    RemoteMessage.Notification notification = remoteMessage.getNotification(); 

     Intent intent = new Intent(this, MainActivity.class); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, 
       PendingIntent.FLAG_ONE_SHOT); 

     String title = notification.getTitle(); 
     String message = notification.getBody(); 

     NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
       .setSmallIcon(R.mipmap.ic_launcher) 
       .setContentTitle(title) 
       .setContentText(message) 
       .setAutoCancel(true) 
       .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE) 
       .setContentIntent(pendingIntent); 


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

     notificationManager.notify(0, notificationBuilder.build()); 
} 
+1

Показывает, как вы создаете и показываете уведомления –

+1

, когда приложение находится в фоновом режиме, автоматически генерирует уведомление, если оно находится в формате уведомлений по умолчанию. –

+0

@VivekMishra означает, что система генерирует 2 одинаковых уведомления? или он получает 2 уведомления? Я смущен, почему, когда приложение находится на переднем плане, я получаю только уведомление, но когда в фоновом режиме он внезапно становится дублированным – kishidp

ответ

0

У меня была такая же проблема с «дублированием». Это может быть всего лишь обходным путем, потому что я не мог получать уведомления о том, что приложение было на переднем плане без проблемы «дублирования». Вместо этого я реализовал WakefulBroadcastReceiver, когда переключился на android: экспортирован на «false», он начал вести себя.

AndroidManifest.xml 
    <receiver 
     android:name="PACKAGE.MyWakefulBroadcastReceiver" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     </intent-filter> 
    </receiver> 

MyWakefulListenerService.java 
    public class MyWakefulBroadcastReceiver extends WakefulBroadcastReceiver { 

     private final String TAG = "MyWakefulListener"; 

     public void onReceive(Context context, Intent intent) { 
      sendNotification(context); 
     } 
    } 
0

Такая же проблема. Я изменил AndroidManifest.xml, потому что я запрашивал разрешения на старый GCM, как это ...

<uses-permission android:name="mypackage.permission.C2D_MESSAGE" /> 
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" /> 

<permission 
    android:name="mypackage.permission.C2D_MESSAGE" 
    android:protectionLevel="signature" /> 

Таким образом, удаление его из манифеста и удалить и переустановить приложение, моя проблема была решена.

4

Чтобы справиться с Push-уведомления вручную использовать handleIntent (намерение) из FirebaseMessagingService. Этот метод вызывается, когда приложение находится на переднем плане, фоне и убитом состоянии. Чтобы избежать дублирования, не вызывайте super.handleIntent (намерение). Это предотвратит автоматическое push-уведомление при приложении в BG или в убитом состоянии.

Это сработало для меня.