在应用程序处于后台/终止时处理推送通知 (FCM) - Android

Mau*_*dia 2 deep-linking android-intent android-activity firebase firebase-cloud-messaging

我想要什么:我想从Firebase Console发送通知。当应用程序处于后台/终止状态并且用户点击推送通知时,它可以转到特定活动。我们称之为Current Offers Activity。当应用程序处于前台时,应该会发生同样的事情。

我的理解:firebase docs,当应用程序处于前台时,将从Firebase 控制台发送的推送通知将在类的onMessageReceived方法中接收MyFirebaseMessagingService。但是当应用程序在后台/终止时,不会调用类的onMessageReceived方法MyFirebaseMessagingService

我想要什么:当应用程序处于后台/终止和用户点击推送通知时,我想将用户重定向到特定活动(当前优惠活动)。

我试过这个答案,但我没有得到解决方案。

我的代码如下。

MyFirebaseMessagingService.java

    public class MyFirebaseMessagingService extends FirebaseMessagingService {

    private final String TAG = "mk";

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

        Log.e(TAG, "Message Body: " + remoteMessage.getNotification().getBody());
    }
}
Run Code Online (Sandbox Code Playgroud)

MyFirebaseInstanceIDService.java

    public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

    private final String TAG = "mk";

    @Override
    public void onTokenRefresh() {

        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        Log.e(TAG, "MyFirebaseInstanceIDService Token: " + refreshedToken);
    }
}
Run Code Online (Sandbox Code Playgroud)

ActivityOne.java

    public class ActivityOne extends AppCompatActivity {

    private final String TAG = "mk";

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

        String refreshedToken = FirebaseInstanceId.getInstance().getToken();

        Intent intent = getIntent();

        if (intent != null && intent.getExtras() != null) {

            Bundle extras = intent.getExtras();

            for (String key : extras.keySet()) {
                Log.e(TAG, key + " : " + extras.get(key));
            }
        }

        Log.e(TAG, "Token: " + refreshedToken);

        //sendNotificationToPatner();
    }

    private void sendNotificationToPatner() {

        Log.e(TAG, "in sendNotificationToPatner: ");

        SendNotificationModel sendNotificationModel = new SendNotificationModel("check", "i miss you");

        RequestNotificaton requestNotificaton = new RequestNotificaton();
        requestNotificaton.setSendNotificationModel(sendNotificationModel);

        requestNotificaton.setToken("cJ-y3b3mnYk:APA91bEYTp1LtfpMHp-wdvKkq1_dVYF4DXl1SHWIaw0guwPSoTyFtbcJjPPB6GhP0FuRd9ybJ--BM6W3aFB-2-3KpVOBDITX91QV4kH1lAgxsIxHcfaj5FQLOIZ0t_HDC2bd8hqJrH-F4x_wuunJfYzanAagm4xcaA");

        ApiInterface apiService = ApiClient.getClient().create(ApiInterface.class);
        retrofit2.Call<ResponseBody> responseBodyCall = apiService.sendChatNotification(requestNotificaton);

        responseBodyCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
                Log.d(TAG, "in onResponse");
            }

            @Override
            public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
                Log.d(TAG, "in onFailure");
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Mau*_*dia 6

解决方案:

  1. 如果您从 firebase 控制台发送推送通知并且您的应用程序在后台或被终止,则不会调用MyFirebaseMessagingService(firebase 文档中没有提到这一点)

  2. 如果您从 firebase 控制台发送推送通知并且您的应用程序在前台,那么MyFirebaseMessagingService将被调用。

  3. 如果您从您的服务器发送推送通知(我的意思是后端,即网站或一些基于 Web 的仪表板)并且您的应用程序在后台或终止或在前台,那么MyFirebaseMessagingService将被调用。


小智 5

好吧,我来到这里寻找不同问题的解决方案,但我可以中途回答你的问题。

如果您正在发送带有数据负载的通知,那么您可以检查特定额外内容的意图。例如,如果在您的控制台 (firebase) 中,您有一个键 ('custom_message') 和一些值 ("This is my message"),如下图所示

在此处输入图片说明

您可以在启动活动中收听 Intent 的附加内容,可以是启动画面或主要活动。

 Intent intent = getIntent(); 
    if (intent.getStringExtras("custom_message") != null) {
      //go to specific activity when notification is opened
    }
   else{
     //open open default launch activity 
    }
Run Code Online (Sandbox Code Playgroud)

现在,之前我说过我会回答你的问题。为什么?这是因为我不知道当通知没有数据有效负载时您将如何实现这一点。希望这可以帮助某人。

@Maulik Dodia 信息也非常有用。赞赏