Firebase消息:当通知被点击时打开我的活动

5

firebase 已经很好地工作了,将通知推送到状态栏,但我的问题是当通知被点击时,我希望它带我进入我的自定义活动而不是默认的启动器,我该怎么做?

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

这是我想在通知被点击时打开的自定义活动。该通知来自Firebase云消息传递。

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

这是监听来自Firebase通知的服务。


2
如果我理解正确,您想要在通知被点击时启动活动 - Abbas
1
如果你想打开不同的活动,则将Intent中的Activity替换为你自定义的Activity - Abbas
OP - 你试过了吗?@Abbas 已经基本回答了你需要做的事情。 - AL.
@NikunjParadva 假设您所说的背景是指尚未被销毁?如果是这样,那么这取决于您的规格说明:如果您不想要重复的 Activity,则将它们修改为“singleTask”或“singleInstance”。您将在Activity的onNewIntent()方法中接收到Intent,否则只需按照上述链接中提供的代码即可。 - Abbas
@NikunjParadva 你可能还需要调整一下意图标志。 - Abbas
显示剩余3条评论
4个回答

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

我希望这能对你有所帮助!


这在应用程序后台时将无法工作!!有任何解决方案吗 @kinjal - Nikunj Paradva

1

我找到了答案。很简单,只需要在我的启动屏幕上添加这段代码,并在关闭启动屏幕并进入预定的活动时保存数据。

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

请问您能否解释一下您是从哪里发送这些消息的,标题意图值是什么? - Dolly Rosy

0

在你的FirebaseMessagingService中...

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

 }

然后在您的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());
}
}

最后,在你的MainActivity的onCreate()方法中处理传入的数据...
// 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
            }
        }
    }

0

试试这个

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

我需要它在应用程序处于后台时工作,因为服务正在后台运行并获取通知。谢谢。 - Wanjala Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接