16

I wrote a very simple android app to test firebase push notification and I get one notification twice.

this is the manifest service:

<service
        android:name="com.google.firebase.messaging.FirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    <service
        android:name="com.google.firebase.iid.FirebaseInstanceIdService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

this is the app gradle:

    compile 'com.google.android.gms:play-services:9.0.0'
    compile 'com.google.firebase:firebase-core:9.0.0'
    compile 'com.google.firebase:firebase-messaging:9.0.0'
}
apply plugin: 'com.google.gms.google-services'

and here is the project level gradle:

classpath 'com.google.gms:google-services:3.0.0'
MatejMecka
  • 1,448
  • 2
  • 24
  • 37
Siavash Abdoli
  • 1,852
  • 3
  • 22
  • 38

6 Answers6

10

It looks like you are using com.google.android.gms:play-services:9.0.0 (which includes play-services-gcm) and com.google.firebase:firebase-messaging:9.0.0

FCM from firebase-massaging automatically registers an Instance ID token (device ID) so if you have logic that registers for a token in your app it is likely that you are registering twice. This could account for you receiving multiple notifications. More generally though you should not use FCM and GCM in the same app for exactly this reason. So if you are going to use FCM you should remove GCM from your app.

Also, using play-services includes all the play-services-x APIs like play-services-gcm and play-services-drive etc. So always use the split libraries like play-services-x instead of just play-services.

Arthur Thompson
  • 9,087
  • 4
  • 29
  • 33
  • If the device is registered twice in a production app . Please suggest solution for it? – Nitin Feb 27 '18 at 07:28
  • You also need to make sure you clean your build to remove all GCM related classes This worked for me https://stackoverflow.com/questions/48785262/receiving-the-fcm-notifications-multiple-times-on-nougat/49177709#49177709 – amitfr Mar 08 '18 at 16:18
5

For me it was a 3th party sdk that was using GCM while our app was using FCM. Registering with both services will give you two notifications.

(Also I was calling super.onMessageReceived(remoteMessage) in my FirebaseMessagingService causing a third notification to appear :p

Tom Bevelander
  • 1,686
  • 1
  • 22
  • 31
2

The accepted answer did not work for me. Below is what worked:

I used data-messages instead of display-messages so that even if the app is in foreground or background, the only single notification will appear.

Replace

{
      "to": "/topics/journal",
      "notification": {
        "title" : "title",
        "text": "data!",
        "icon": "ic_notification"
       }
}

With

{
  "to": "/topics/dev_journal",
   "data": {
       "text":"text",
       "title":"",
       "line1":"Journal",
       "line2":"刊物"
   }
} 

Reference : How to handle notification when app in background in firebase

TharakaNirmana
  • 10,237
  • 8
  • 50
  • 69
  • YES! The second example fires the onbackgroundmessage function.. more here: https://github.com/firebase/quickstart-js/issues/71 – Martin Zvarík Jun 11 '18 at 21:53
1

I was having the same problem when application was in background or closed (and sending both notification and data). Caused by requesting old GCM permissions in AndroidManifest.xml

Take a look at https://stackoverflow.com/a/44435980/1533285

jlbofh
  • 433
  • 5
  • 7
1

I had to remove

<receiver android:name="com.google.android.gms.gcm.GcmReceiver" 
android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"> 
  <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
  <category android:name="${applicationId}" /> 
  </intent-filter> 
</receiver>

from AndroidManifest.xml

This worked for me, thanks

Khushboo Tahir
  • 627
  • 9
  • 9
0

Use in build gradle file

compile 'com.google.firebase:firebase-core:10.2.1'
compile 'com.google.firebase:firebase-messaging:10.2.1'

and use handleIntent() in receiver.

jmizv
  • 1,172
  • 2
  • 11
  • 28
Mahesh
  • 95
  • 1
  • 4