firebase messaging when Notification clicked to open my Activity

孤人 提交于 2020-01-02 05:35:07

问题


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.


回答1:


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!




回答2:


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); 



回答3:


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
            }
        }
    }



回答4:


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();
    }


来源:https://stackoverflow.com/questions/40131791/firebase-messaging-when-notification-clicked-to-open-my-activity

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!