Firebase 处理推送通知(FCM),而应用程序处于后台/杀死-Android

Firebase 处理推送通知(FCM),而应用程序处于后台/杀死-Android,firebase,android-intent,android-activity,firebase-cloud-messaging,deep-linking,Firebase,Android Intent,Android Activity,Firebase Cloud Messaging,Deep Linking,我想要什么:我想要从Firebase控制台发送通知。当应用程序处于后台/kill时,当用户点击推送通知时,它可以转到特定活动。让我们称之为当前提供活动。同样的事情也应该发生,而应用程序将在前台 我的理解:来自firebase docs,当应用程序位于前台时,将在MyFirebaseMessagingService类的onMessageReceived方法中接收来自firebase控制台的推送通知。但是当应用程序处于后台/kill时,MyFirebaseMessagingService类的onMe

我想要什么:我想要从Firebase控制台发送通知。当应用程序处于后台/kill时,当用户点击推送通知时,它可以转到特定活动。让我们称之为当前提供活动。同样的事情也应该发生,而应用程序将在前台

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

我想要的:当应用程序处于后台/kill&用户点击推送通知时,我想将用户重定向到特定活动(当前提供活动

我试过了,但没有找到解决办法

我的代码如下

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());
    }
}
    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);
    }
}
    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");
            }
        });
    }
}
myFirebaseInstancedService.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());
    }
}
    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);
    }
}
    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");
            }
        });
    }
}
ActivityOne.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());
    }
}
    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);
    }
}
    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");
            }
        });
    }
}
公共类活动One扩展了AppCompative活动{
私有最终字符串TAG=“mk”;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_one);
字符串refreshedToken=FirebaseInstanceId.getInstance().getToken();
Intent=getIntent();
if(intent!=null&&intent.getExtras()!=null){
Bundle extras=intent.getExtras();
for(字符串键:extras.keySet()){
Log.e(标记,key+”:“+extras.get(key));
}
}
Log.e(标记“Token:+refreshedToken”);
//sendNotificationToPatner();
}
私有void sendNotificationToPatner(){
Log.e(标记“in sendNotificationToPatner:”);
SendNotificationModel SendNotificationModel=新建SendNotificationModel(“检查”,“我想你”);
RequestNotificaton RequestNotificaton=新RequestNotificaton();
RequestNotificationon.setSendNotificationModel(sendNotificationModel);
RequestNotificationon.setToken(“cJ-y3b3mnYk:APA91bEYTp1LtfpMHp-wdvKkq1_dVYF4DXl1SHWIaw0guwPSoTyFtbcJjPPB6GhP0FuRd9ybJ--BM6W3aFB-2-3KPOBDITx91QV4KH1LAGXSIXHCFAJ5FQLOIZ0T_HDC2bd8hqJrH-F4xèWungfyzanaaGM4xCAA”);
ApiInterface apiService=ApiClient.getClient().create(ApiInterface.class);
2.Call responseBodyCall=apiService.sendChatNotification(requestNotificaton);
enqueue(新的回调函数(){
@凌驾
公共无效响应(改装2.呼叫,改装2.响应){
Log.d(标签“in onResponse”);
}
@凌驾
公共失效失效失效(改型2.Call,可丢弃t){
Log.d(标签“in onFailure”);
}
});
}
}

提前感谢。

解决方案:

  • 如果您正在从firebase控制台发送推送通知&您的应用程序处于后台或已被终止,则不会调用MyFirebaseMessagingService(firebase文档中未提及这一点)

  • 如果您正在从firebase控制台发送推送通知,并且您的应用程序位于前台,则会调用MyFirebaseMessagingService

  • 如果您正在从服务器(我指的是后端,即网站或基于web的仪表板)发送推送通知&您的应用程序位于后台、kill或前台,则会调用MyFirebaseMessagingService


  • 嗯,我来这里是想找到一个不同问题的解决方案,但我可以半途而废地回答你的问题

    如果您正在发送带有数据负载的通知,那么您可以检查特定额外内容的意图。例如,如果在您的控制台(firebase)中有一个带有某个值(“这是我的消息”)的键(“自定义消息”),如下图所示

    您可以在您的启动活动中收听Intent的附加节目,可以是splashscreen或mainactivity

     Intent intent = getIntent(); 
        if (intent.getStringExtras("custom_message") != null) {
          //go to specific activity when notification is opened
        }
       else{
         //open open default launch activity 
        }
    
    现在,我早些时候说过我会半回答你的问题。为什么?这是因为我不知道当通知没有数据负载时,您将如何实现这一点。希望这能帮助别人


    @Maulik Dodia信息也非常有用。感谢

    您可以根据应用程序状态检查数据的准确行为和来自FCM的纯通知。让我检查一下,尽管我已经检查过了。可能是我错过了什么。如果你能在这里的评论中指出我遗漏的东西,对其他开发人员也会更好。@Rakesh