Developer
Developer

Reputation: 21

Android FCM push notification, how to handle background event

Someone please help to solve it.

mRegistrationBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            // checking for type intent filter
            if (intent.getAction().equals(Config.REGISTRATION_COMPLETE)) {
                // gcm successfully registered
                // now subscribe to `global` topic to receive app wide notifications
                FirebaseMessaging.getInstance().subscribeToTopic(Config.TOPIC_GLOBAL);
                displayFirebaseRegId();
                System.out.println("If condition :" + Config.REGISTRATION_COMPLETE + "::" + Config.PUSH_NOTIFICATION);

            } else if (intent.getAction().equals(Config.PUSH_NOTIFICATION)) {
                // new push notification is received
                String message = intent.getStringExtra("message");

                showAlertDialog(MainActivity.this, "Alert", message, true);
                txtMessage.setTextColor(Color.GREEN);
                Picasso.with(context).load(message).into(iImageView);
              //  txtMessage.setText(message);
                System.out.println("Else condition :" + Config.REGISTRATION_COMPLETE + "::" + Config.PUSH_NOTIFICATION);
            }
        }
    };

This is the code written in main activity, if the app is in the foreground it goes to else if part, if the app is in the background, it does not even enter into onBroadcastReceiver method, then how can I handle background event?

Upvotes: 1

Views: 1519

Answers (4)

Developer
Developer

Reputation: 21

Able to handle push notifications foreground and background events , created a method for notification in Service class and in mainactivity added the below code

if (getIntent().getExtras() != null) {
        System.out.println("Coming to if method");
        String sMessage = getIntent().getStringExtra("message");
        String sImageUrl = getIntent().getStringExtra("image");
        String sPhoto = getIntent().getStringExtra("photo");
        System.out.println("Result :" +sMessage + "::" + sImageUrl + "::" + getIntent().getStringExtra("is_background"));
        for (String key : getIntent().getExtras().keySet()) {
            String value = getIntent().getExtras().getString(key);
            if (key.equals("is_background") && value.equalsIgnoreCase("True")) {
                txtMessage.setText("Success :" + sMessage);
                Picasso.with(this).load(sPhoto).into(imageView);
            }
        }
    }

Upvotes: 1

Nasimxon
Nasimxon

Reputation: 131

You can use downstream service of FCM

public class FCMMessageHandler extends FirebaseMessagingService {

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        Map<String, String> data = remoteMessage.getData();
        String from = remoteMessage.getFrom();
        String title = data.get("title");
        String content = data.get("content");

        // here you need parse a message and ....
  }

    // Creates notification based on title and body received
    private void createNotification(String title, String content, long id, Intent intent) {
        Context context = getBaseContext();
        PendingIntent pendingIntent = PendingIntent.getActivity(context, 1, intent, 0);
        android.support.v4.app.NotificationCompat.Builder mBuilder =
                new NotificationCompat.Builder(context)
                        .setSmallIcon(R.mipmap.ic_launcher).setContentTitle(title)
                        .setContentIntent(pendingIntent)
                        .setAutoCancel(true)
                        .setContentText(content);

        NotificationManager mNotificationManager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        mNotificationManager.notify((int) id, mBuilder.build());
    }
}

Add to Manifest.xml

<service
        android:name=".firebase.FCMMessageHandler"
        android:exported="false">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT" />
        </intent-filter>
    </service>

    <meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
        android:resource="@drawable/common_google_signin_btn_icon_dark" />

    <meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
        android:resource="@color/colorAccent" />

Upvotes: 1

Mohammed Farhan
Mohammed Farhan

Reputation: 1138

So Inorder to change notification icon you add this in your android manifest.

 <meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />

Change icon form resources.

This is the simplest method to change notification icon. You can change notification color by adding

<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

and follow this answer in Stack Overflow to open particular activity on click of notification. Read fcm documentation Here

Upvotes: 0

Anil
Anil

Reputation: 1087

You can use

 private void generateNotification(Context context, String message) {
    int icon = R.mipmap.app_icon;
    final int soundResId = R.raw.notification_sound;
    try {
        Intent intent = new Intent(this, TragetActivityName.class);
        intent.putExtra("usedfor", "");
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT);
        Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.driver_app_ico)
                .setContentTitle("Application name")
                .setContentText(message)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

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

        notificationManager1.notify(0 /* ID of notification */, notificationBuilder.build());
    } catch (Exception e) {
    }
}

Upvotes: 0

Related Questions