5

The firebase is working fine , pushing the notification on the status bar but my challange is when the notification is clicked , I want it to take me to my Custom Activity not the default launcher , How do I go about it?

public class CustomActivity extends AppCompatActivity {

private static final String TAG = "CustomActivity";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    TextView mymessage = (TextView) findViewById(R.id.mymessage);

    // If a notification message is tapped, any data accompanying the notification
    // message is available in the intent extras. In this sample the launcher
    // intent is fired when the notification is tapped, so any accompanying data would
    // be handled here. If you want a different intent fired, set the click_action
    // field of the notification message to the desired intent. The launcher intent
    // is used when no click_action is specified.
    //
    // Handle possible data accompanying notification message.
    // [START handle_data_extras]
    if (getIntent().getExtras() != null) {
        for (String key : getIntent().getExtras().keySet()) {
            String value = String.valueOf(getIntent().getExtras().get(key));
            Log.d(TAG, "Key: " + key + " Value: " + value);
            //
            Toast.makeText(getApplicationContext() , value , Toast.LENGTH_SHORT).show();


        }

        //Toast.makeText(getApplicationContext() , String.valueOf(getIntent().getExtras().get("message")) , Toast.LENGTH_SHORT).show();


    }
    // [END handle_data_extras]

    Button subscribeButton = (Button) findViewById(R.id.subscribeButton);
    subscribeButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // [START subscribe_topics]
            FirebaseMessaging.getInstance().subscribeToTopic("news");
            // [END subscribe_topics]

            // Log and toast
            String msg = getString(R.string.msg_subscribed);
            Log.d(TAG, msg);
            Toast.makeText(CustomActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });

    Button logTokenButton = (Button) findViewById(R.id.logTokenButton);
    logTokenButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Get token
            String token = FirebaseInstanceId.getInstance().getToken();

            // Log and toast
            String msg = getString(R.string.msg_token_fmt, token);
            Log.d(TAG, msg);
            Toast.makeText(CustomActivity.this, msg, Toast.LENGTH_SHORT).show();
        }
    });
}

This is my Custom activity that I want to open when the notification is clocked . The Notification is from Firebase cloud messaging.

public class MyFirebaseMessagingService extends FirebaseMessagingService {

private static final String TAG = "MyFirebaseMsgService";

/**
 * Called when message is received.
 *
 * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
 */
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // [START_EXCLUDE]
    // There are two types of messages data messages and notification messages. Data messages are handled
    // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
    // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
    // is in the foreground. When the app is in the background an automatically generated notification is displayed.
    // When the user taps on the notification they are returned to the app. Messages containing both notification
    // and data payloads are treated as notification messages. The Firebase console always sends notification

    // [END_EXCLUDE]

    // TODO(developer): Handle FCM messages here.
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());
        System.out.print("Message data payload :" + remoteMessage.getData());

    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        System.out.print("Message Notification Body :" + remoteMessage.getNotification().getBody());
    }



    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.


}
// [END receive_message]



/**
 * Create and show a simple notification containing the received FCM message.
 *
 * @param messageBody FCM message body received.
 */
private void sendNotification(String messageBody) {
    Intent intent = new Intent(this, CustomActivity.class);
    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.drawable.ic_stat_ic_notification)
            .setContentTitle("FCM Message")
            .setContentText(messageBody)
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setContentIntent(pendingIntent);

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

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
}

}

This is the service listening to the Notifications from the firebase.

Frank van Puffelen
  • 565,676
  • 79
  • 828
  • 807
Wanjala Alex
  • 141
  • 2
  • 13
  • 2
    If I understand you correctly you want to [Launch Activity when Notification is Clicked](http://stackoverflow.com/a/13716784/1889768). – Abbas Oct 19 '16 at 13:00
  • yes to launch the CustomActivity . the above is the source. My Main activity is a SplashActivity and when the notification is clicked it lanches it instead of CustomActivity . Complete project is here https://github.com/firebase/quickstart-android/tree/master/messaging – Wanjala Alex Oct 19 '16 at 13:11
  • 1
    If you want a different Activity to open then replace the `Activity` in `Intent` with your custom `Activity`. – Abbas Oct 19 '16 at 13:17
  • OP - Have you tried it yet? @Abbas pretty much answered what you need to do. – AL. Oct 19 '16 at 14:37
  • I want to go to particular activity .. Wt to do when My App is in background ? @Abbas – Nikunj Paradva Oct 20 '16 at 05:16
  • @NikunjParadva Assuming by background you mean not yet destroyed? If so then it depends on your specification: if you don't want duplicate Activitys then modify them to `singleTask` or `singleInstance`. You will receive intent in your `Activity`'s `onNewIntent()`, otherwise simply follow the code in above mentioned link. – Abbas Oct 20 '16 at 05:35
  • @NikunjParadva You might also have to fiddle around a bit with intent flags too. – Abbas Oct 20 '16 at 05:36
  • @Abbas when My App was destroyed then ...i send push notification from fcm consol then... i want to set particular activity on push notification's click Wt to do for that!! – Nikunj Paradva Oct 20 '16 at 05:39

4 Answers4

2
private void showNotification(String msg) {
    //Creating a notification
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setSmallIcon(R.drawable.ic_launcher);
    Intent intent = new Intent().setClassName("packagename", "packagename.YourActivityname"); // give any activity name which you want to open
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    builder.setContentIntent(pendingIntent);
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher));
    builder.setContentTitle("FireBase");
    builder.setContentText(msg);
    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    notificationManager.notify(1, builder.build());
}

I hope it might help you!

Kinjal
  • 1,195
  • 4
  • 13
  • 24
1

I found the answer . Its simple only adding this code on my launcher screen and saving the data as I close the launcher screen and go to the intended activity.

    //When Notification is tapped
    if (getIntent().getExtras() != null) {
        //init message
        String message = String.valueOf(getIntent().getExtras().get("message"));
        String title = String.valueOf(getIntent().getExtras().get("title"));
        //save the message
        MySharedPreference.save(getApplicationContext() , "message" , message);
        MySharedPreference.save(getApplicationContext() , "title" , title);
        startActivity(new Intent(getApplicationContext() , MainActivity.class));
        finish();
    }
Wanjala Alex
  • 141
  • 2
  • 13
0

Try this

 Intent notificationIntent =new Intent(context,ActionActivity.class);
    // set intent so it does not start a new activity
       notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
       PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
       this.notification.setLatestEventInfo(context, title, message, intent);
       this.notification.flags |= Notification.FLAG_AUTO_CANCEL;
      // you can also add other property like vibrate or sound
      notificationManager.notify(0, notification); 
Govinda P
  • 3,261
  • 5
  • 22
  • 43
  • I need it to work when the app is in background since a service is running is background getting the notifications . Thanks – Wanjala Alex Oct 19 '16 at 13:14
0

Inside your FirebaseMessagingService...

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "From: " + remoteMessage.getFrom());
    NotificationPublisher.getInstance().showNotification(this, remoteMessage);

 }

Then in your NotificationPublisher...

public static final String EXTRA_CHAT_NOTIFICATION = "com.myProject.chat_notification";
 public void showNotification(Context context, RemoteMessage remoteMessage) {
    Intent intent = new Intent();

    if (remoteMessage.getData().get("notification_type") != null) {
        Intent i = new Intent("broadCastName");
        i.putExtra("type", remoteMessage.getData().get("notification_type"));
        i.putExtra("trip_id", remoteMessage.getData().get("trip_id"));
        i.putExtra("status", remoteMessage.getData().get("status"));
        context.sendBroadcast(i);
        return;
    }

    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent = new Intent(context, MainActivity.class);
    HashMap<String, String> dataHash = new HashMap<>(remoteMessage.getData());
    intent.putExtra(EXTRA_CHAT_NOTIFICATION, dataHash);

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context)
            .setSmallIcon(R.drawable.ic_noti)
            .setLargeIcon(R.drawable.ic_noti)
            .setColor(ContextCompat.getColor(context, R.color.white))
            .setContentTitle(remoteMessage.getData().get("title"))
            .setContentText(remoteMessage.getData().get("content"))
            .setAutoCancel(true)
            .setSound(defaultSoundUri)
            .setDefaults(Notification.DEFAULT_VIBRATE)
            .setPriority(NotificationCompat.PRIORITY_MAX)
            .setContentIntent(pendingIntent);

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

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

And finally in your MainActivity onCreate() handle the incoming data...

// Handle possible data accompanying notification message.
    // [START handle_data_extras]
    if (getIntent().getExtras() != null) {
        for (String key : getIntent().getExtras().keySet()) {
            Object value = getIntent().getExtras().get(key);
            Log.d(TAG, "Key: " + key + " Value: " + value);
            if(key.equals(NotificationPublisher.EXTRA_CHAT_NOTIFICATION)) {
                // TODO: Start myCustomActivity
            }
        }
    }
dianakarenms
  • 2,609
  • 1
  • 22
  • 22