обрабатывать push-уведомления (FCM), когда приложение находится в фоновом режиме / убить - Android - PullRequest
0 голосов
/ 04 июля 2018

Что я хочу: Я хочу отправить уведомление с Консоль Firebase . Когда приложение находится в фоновом режиме / убивает, и когда пользователь нажимает Push Notification , оно может перейти к определенной активности. Давайте назовем это Активность текущих предложений . То же самое должно произойти, пока приложение будет на переднем плане.

Что я понял: Из документы Firebase , когда приложение находится на переднем плане, push-уведомления, отправленные из Консоль Firebase , будут получены в методе onMessageReceived MyFirebaseMessagingService класс. Но когда приложение находится в фоновом режиме / kill, метод onMessageReceived класса MyFirebaseMessagingService не будет вызван.

Что я хочу: Когда приложение находится в фоновом режиме / убивает и пользователь нажимает на push-уведомление, я хочу перенаправить пользователя к определенной активности ( Активность текущих предложений ).

Я пытался этот ответ , но я не получил решение.

Мой код похож на ниже.

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

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

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

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 11 августа 2018

Я приземлился здесь в поисках решения другого вопроса, но я могу ответить на ваш вопрос на полпути.

Если вы отправляете уведомление с данными полезной нагрузки, то вы можете проверить намерения для конкретных дополнений. Например, если в вашей консоли (firebase) у вас есть ключ ('custom_message') с некоторым значением ("Это мое сообщение"), как показано на рисунке ниже

enter image description here

Вы можете прослушать дополнительные материалы Intent во время запуска, которые могут быть заставкой или основной активностью.

 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 info также очень полезна. Оценил

0 голосов
/ 09 августа 2018

Решение:

  1. Если вы отправляете push-уведомление с консоли Firebase и ваше приложение находится в фоновом режиме или отключено, то MyFirebaseMessagingService не будет вызываться. (Это не упоминается в документации по пожарной базе)

  2. Если вы отправляете push-уведомление с консоли Firebase и ваше приложение находится на переднем плане, тогда будет вызываться MyFirebaseMessagingService .

  3. Если вы отправляете push-уведомления со своего сервера (я имею в виду back-end, т. Е. Веб-сайт или некоторую веб-панель мониторинга), а ваше приложение работает в фоновом режиме, в режиме ожидания или на переднем плане, тогда MyFirebaseMessagingService будет позвони.

...