Amine
Amine

Reputation: 941

How to fix notification not showing up when app is running?

I made a test app that has Firebase implemented, i'm using the notifications composer from Firebase, it works okay but not as intended since the notification only shows up when the app isn't active (on the screen) and i need it to show up even when the app is active and running

MainActivity.java

package com.gci.gestioncapteursincendie;

import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.TextView;

import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.iid.FirebaseInstanceId;
import com.google.firebase.iid.InstanceIdResult;

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView= findViewById(R.id.textViewToken);
        FirebaseInstanceId.getInstance().getInstanceId()
                .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
                    @Override
                    public void onComplete(@NonNull Task<InstanceIdResult> task) {
                      if(task.isSuccessful()){
                          String token = task.getResult().getToken();
                          System.out.println("token:"+token);
                          textView.setText("Token : " + token);
                        }
                        else
                      {
                          textView.setText("Token Not Generated");
                      }
                    }
                });
    }

}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.gci.gestioncapteursincendie">

    <!-- Granting Internet access permission to app -->
    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:name="com.gci.gestioncapteursincendie.FirebaseActivity"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <service
            android:name=".FirebaseMessagingServiceExtended"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Edit: added manifest

Upvotes: 3

Views: 7049

Answers (2)

Mehrnoosh
Mehrnoosh

Reputation: 899

You must set show_in_foreground to Ture in the object that you are sending to SDK.

                 const objNotification = {
                    title: ‘xxxxxx’,
                    body: ‘xxxxx’,
                    sound: 'default',
                    priority: 'high',
                    show_in_foreground: true,
                  };
                  const myMessage = JSON.stringify(objNotification);

                  let message;

                    message = {
                      notification: {
                        title: ‘xxxxxx’,
                        body: `xxxxx`,
                      },
                      data: {
                        custom_notification: myMessage,
                      },
                      token: registrationToken,
                    };

                    admin.messaging().send(message)
                      .then((response) => {
                        res.status(200).send({ success: true, result: response, });
                      })
                      .catch((error) => {
                        console.log('Error sending message:', error);
                        res.status(400).send({ success: false, result: error });
                      });

Upvotes: 0

Masoom Badi
Masoom Badi

Reputation: 996

When the app is closed, your notifications are processed by the Google Service process, which take care of displaying your notifications as required, including the default click action (opening the app) and the notification icon.

When the app is in foreground, the received messages are processed by the app, and since there’s no logic to handle it, nothing will happen!

You can create a custom FirebaseMessagingService which implement the onMessageReceivedand then create the notification in it..

public class NotificationService extends FirebaseMessagingService { 
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);
    Notification notification = new NotificationCompat.Builder(this)
     .setContentTitle(remoteMessage.getNotification().getTitle())
     .setContentText(remoteMessage.getNotification().getBody())
     .setSmallIcon(R.mipmap.ic_launcher)
     .build();

    NotificationManagerCompat manager = NotificationManagerCompat.from(getApplicationContext());
    manager.notify(some_int_number (eg : 123), notification);
   }
 }

And add this to your manifest file

<service android:name=”.NotificationService”>
  <intent-filter>
    <action android:name=”com.google.firebase.MESSAGING_EVENT”/>
  </intent-filter>
</service>

Also make sure you give proper permission in manifest file. After implementing try again, you should see the notification while your app is in foreground.

Upvotes: 3

Related Questions