Android app is not receiving FCM notification when closed

17,732

Solution 1

There was no issue with the code. I was using Mi note 4, and somehow it does not show notification in Mi4 when app is closed. I tested with other android device and its working fine.

Thanks to Tim Castelijns and Frank van Puffelen for participating in the conversation.

Solution 2

There's good solution and explanation about that issue here. You need to set high priority for notification to tell android react immediately, otherwise it takes couple of minutes to display received notification.

Share:
17,732
Anup Das Gupta
Author by

Anup Das Gupta

Updated on June 05, 2022

Comments

  • Anup Das Gupta
    Anup Das Gupta almost 2 years

    I am checking Firebase Cloud Messaging to send notification. Have implemented it already and its receiving notification when app is in open state. But if I close app, its no longer gives notification. Is there any solution for this.

    Code:

    WebRequest wRequest;
    wRequest = WebRequest.Create("https://fcm.googleapis.com/fcm/send");
    wRequest.Method = "post";
    wRequest.ContentType = " application/json;charset=UTF-8";
    wRequest.Headers.Add(string.Format("Authorization: key={0}", AppId));
    
    wRequest.Headers.Add(string.Format("Sender: id={0}", SenderId));
    
    string postData = "{\"registration_ids\":[\"" + regIds + "\"], \"data\": "+ value +"}";
    
    Byte[] bytes = Encoding.UTF8.GetBytes(postData);
    wRequest.ContentLength = bytes.Length;
    
    Stream stream = wRequest.GetRequestStream();
    stream.Write(bytes, 0, bytes.Length);
    stream.Close();
    
    WebResponse wResponse = wRequest.GetResponse();
    

    Messaging service-

    public class MessagingService extends FirebaseMessagingService {
        @Override
        public void onMessageReceived(RemoteMessage remoteMessage) {
            Map<String, String>  data = remoteMessage.getData();
            sendNotification(data);
        }
    
        public void showMessage(Map<String, String>  serverData) {
            Intent i = new Intent(this,MainActivity.class);
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    
            PendingIntent pendingIntent = PendingIntent.getActivity(this,0,i,PendingIntent.FLAG_UPDATE_CURRENT);
    
            NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                    .setAutoCancel(true)
                    .setContentTitle(serverData.get("Title"))
                    .setContentText(serverData.get("Message"))
                    .setSmallIcon(R.drawable.common_google_signin_btn_icon_dark)
                    .setContentIntent(pendingIntent);
    
            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
            manager.notify(Integer.parseInt(serverData.get("ItemId")),builder.build());
        }
    
        private void sendNotification(Map<String, String>  serverData) {
            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_UPDATE_CURRENT);
    
            long[] pattern = {500,500,500,500,500};
    
            Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    
            NotificationCompat.Builder notificationBuilder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
                    .setSmallIcon(R.drawable.common_google_signin_btn_icon_dark)
                    .setContentTitle(serverData.get("Title"))
                    .setContentText(serverData.get("Message"))
                    .setAutoCancel(true)
                    .setVibrate(pattern)
                    .setLights(Color.BLUE,1,1)
                    .setSound(defaultSoundUri)
                    .setContentIntent(pendingIntent);
    
            NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            notificationManager.notify(Integer.parseInt(serverData.get("ItemId")), notificationBuilder.build());
        }
    
    }
    

    Main activity-

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
           FirebaseMessaging.getInstance().subscribeToTopic("test");
            FirebaseInstanceId.getInstance().getToken();
        }
    }
    

    Manifest-

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="test.com.firebasenotify">
        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
    
            <service android:name=".MessagingService">
                <intent-filter>
                    <action android:name="com.google.firebase.MESSAGING_EVENT" />
                </intent-filter>
            </service>
            <service android:name=".InstanceIDService">
                <intent-filter>
                    <action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
                </intent-filter>
            </service>
    
        </application>
    
    </manifest>
    
  • Burhanuddin Rashid
    Burhanuddin Rashid over 7 years
    For MI you need to put app in auto-start mode in Security to get notification when app is closed
  • Nikhil Gaur
    Nikhil Gaur over 7 years
    if you see the code there no notification object. He is only sending data object
  • Sjd
    Sjd over 7 years
    you need to send notification object as well.
  • Nikhil Gaur
    Nikhil Gaur over 7 years
    but if we will send notification object then it will not hit onMessageReceived and notification will be handled by android itself and will be displayed in notification tray (without your client app). And if we send without notification object but data object is there then it will always hit onMessageReceived.
  • ioan
    ioan over 7 years
    This is probably valid only if the user comes back to the application.
  • sandeepmaaram
    sandeepmaaram about 7 years
    Thanks man, in redmi prime2 also getting same problem. Did you find any solution for this problem in MI devices?
  • Android Developer
    Android Developer over 4 years
    Vivo,opp also get the same problem any solution please give