当 Firebase 通知到达并且我打开了应用程序时,如何处理它?

Posted

技术标签:

【中文标题】当 Firebase 通知到达并且我打开了应用程序时,如何处理它?【英文标题】:How can I handle a notification from Firebase when it arrives and I have the app open? 【发布时间】:2021-11-20 01:03:10 【问题描述】:

我想在通知到达时更新活动,但我无法获取用户所在的当前活动。 我正在使用 FirebaseMessagingService。

Code

【问题讨论】:

"我无法获取用户所在的当前活动" 为什么不呢?是什么阻止你这样做? 如何获取当前活动?也许我做错了。 可能是这样。您获得帮助的最佳机会是向我们展示您已经尝试过的内容。没有它,我们不可能比这里的最佳结果做得更好:google.com/… 我刚刚上传了一张代码图片。谢谢!!! 您应该始终使用 markdown 在编辑器中添加代码,而不是作为图像,如果需要,人们可以更轻松地进行编辑 【参考方案1】:

更好的方法是让您感兴趣的活动注册广播接收器,并让您的服务在消息到达时发送广播。

【讨论】:

【参考方案2】:

您必须考虑到,当收到通知时,应用程序可能处于前台或后台,并且处理方式会有所不同。

您无法从该服务获取活动,相反,您必须告诉它在单击通知时哪个活动出现在前台并获取“附加”数据。

例如在通知服务器(nodejs)中使用这样的配置:

var message = 
        notification: 
            title: title,
            body: text
        ,
        data: 
            title: title,
            body: text,
            latitude: latitude,
            longitude: longitude,
            name: name
        ,
        android: 
            priority: 'high',
            notification: 
                sound: 'default',
                clickAction: '.PetNotificationActivity'
            ,
        ,
        apns: 
            payload: 
                aps: 
                    sound: 'default'
                ,
            ,
        ,
        tokens: registrationTokens
    ;

在该示例中,PetNotificationActivity 是我希望在打开通知时将其置于前台的活动。

并且,在 PetNotificationActivity 中类似这样的内容(用于后台/封闭应用案例):

public class PetNotificationActivity extends AppCompatActivity 

    ....

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_pet_notification);
        Bundle bundle = getIntent().getExtras();

        if (bundle != null) 
            String latitudeValue = bundle.getString("latitude");
            String longitudeValue = bundle.getString("longitude");
            String nameValue = bundle.getString("name");
            ...
        
    

在服务中是这样的(对于前台情况):

public class PetNotificationService extends FirebaseMessagingService 

    ...

    @Override
    public void onMessageReceived(@NonNull RemoteMessage remoteMessage) 
        super.onMessageReceived(remoteMessage);

        if (remoteMessage.getData().size() > 0) 
            sendNotification(remoteMessage);
        
    

    private void sendNotification(RemoteMessage remoteMessage) 
        String title = remoteMessage.getData().get("title");
        String messageBody = remoteMessage.getData().get("body");
        String latitude = remoteMessage.getData().get("latitude");
        String longitude = remoteMessage.getData().get("longitude");
        String name = remoteMessage.getData().get("name");

        Intent intent = new Intent(this, PetNotificationActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("latitude", latitude);
        intent.putExtra("longitude", longitude);
        intent.putExtra("name", name);

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
                intent, PendingIntent.FLAG_ONE_SHOT);

        ...

        NotificationCompat.Builder notificationBuilder =
                new NotificationCompat.Builder(this, channelId)
                        ...
                        .setContentIntent(pendingIntent);

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

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
            NotificationChannel channel = new NotificationChannel(channelId,
                    "Channel human readable title",
                    NotificationManager.IMPORTANCE_DEFAULT);
            notificationManager.createNotificationChannel(channel);
        
        notificationManager.notify(0, notificationBuilder.build());
    

Handling messages 上的 FCM 文档

【讨论】:

以上是关于当 Firebase 通知到达并且我打开了应用程序时,如何处理它?的主要内容,如果未能解决你的问题,请参考以下文章

当推送通知到达(未收到)设备时调用委托

当通知到达并且应用程序在后台没有用户交互时,如何在 React Native 中执行操作?

当用户点击 Flutter App 中的 Firebase 通知时如何打开链接?

在收到 Firebase 通知时打开应用 (FCM)

Firebase 推送通知的打开率显示没有数据

当 iOS 应用程序被暂停/杀死并且用户点击通知时如何处理 Firebase 推送通知?