Получайте уведомления GCM, даже когда приложение закрыто (проведите пальцем по экрану)

Вот код, который используется как BroadcastReceiver внутри моей MainActivity

    mRegistrationBroadcastReceiver = new BroadcastReceiver() {

        //When the broadcast received
        //We are sending the broadcast from GCMRegistrationIntentService

        @Override
        public void onReceive(Context context, Intent intent) {
            //If the broadcast has received with success
            //that means device is registered successfully
            if(intent.getAction().equals(GCMRegistrationIntentService.REGISTRATION_SUCCESS)){
                //Getting the registration token from the intent
                String token = intent.getStringExtra("token");
                //Displaying the token as toast
                Toast.makeText(getApplicationContext(), "Registration token:" + token, Toast.LENGTH_LONG).show();

                //if the intent is not with success then displaying error messages
            } else if(intent.getAction().equals(GCMRegistrationIntentService.REGISTRATION_ERROR)){
                Toast.makeText(getApplicationContext(), "GCM registration error!", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(getApplicationContext(), "Error occurred", Toast.LENGTH_LONG).show();
            }
        }
    };

Я следовал этому руководству о GCM

https://www.simplifiedcoding.net/android-push-notification-using-gcm-tutorial/


comment
Я думаю, что закрытие приложения путем выдвижения - это принудительное закрытие приложения, поэтому оно не получит сообщение GCM, если пользователь снова не запустит приложение. Пожалуйста, смотрите мой ответ в предыдущем ТАК вопрос   -  person Android Enthusiast    schedule 22.05.2016
comment
Я сделал это с помощью WakefulBroadcastReceiver.   -  person renzvader    schedule 22.05.2016
comment
Вы можете получать сообщения GCM (теперь FCM), независимо от того, открыто ваше приложение или закрыто. Я бы посоветовал не писать свой собственный WakefulBroadcastReceiver, используйте предоставленный GcmListenerService или еще более простой в использовании FirebaseMessagingService. См. образец: github.com/firebase/quickstart-android/tree/master/messaging.   -  person Arthur Thompson    schedule 23.05.2016
comment
@acer как ты это решил?   -  person natsumiyu    schedule 07.11.2016


Ответы (2)


Закрытие приложения, сдвинув его (более известное как пролистывание), не убивает приложение полностью. Ознакомьтесь с этим ответом в сообществе энтузиастов Android, чтобы получить более подробное описание. Вы можете видеть, что там упоминается, что:

.. Это не приведет к остановке служб напрямую.

Поскольку прослушивателями уведомлений GCM являются Services, это фактически означает, что все еще существует вероятность того, что ваше приложение может по-прежнему получать их, независимо от того, удалено ли оно.

Хотя результат считывания приложения также может различаться в зависимости от устройства, на котором оно запущено, его можно убить/принудительно остановить или, как указано выше, остановить фоновые процессы.

Однако, если в результате приложение будет убито/принудительно остановлено, как указано в ответе по ссылке выше:

Ибо остановка — это полное уничтожение приложения: все процессы останавливаются, все службы останавливаются, удаляются все уведомления, удаляются все предупреждения и т. д.

В результате приложение вообще не будет получать никаких уведомлений, поскольку оно было разработано для Android, начиная с версии 3.1, как указано в этом ответить:

Приложения, находящиеся в остановленном состоянии, не получают широковещательные намерения.

Остановленное состояние:

когда приложение первоначально установлено (до того, как пользователь запустит что-то в приложении) или после принудительной остановки. Подробнее об этом можно узнать здесь: http://developer.android.com/about/versions/android-3.1.html#launchcontrols

Надеюсь, это как-то поможет прояснить некоторые вещи. Ваше здоровье! :D

person AL.    schedule 25.05.2016

Вы можете попробовать с помощью GcmListenerService Когда вы закрываете приложение, выдвигая его, служба по-прежнему активируется в фоновом режиме, и вы можете получать push-уведомления. Если пользователь вручную не принудительно остановит приложение, эта служба поможет вам.

person Dhaval    schedule 25.05.2016
comment
Есть некоторые устройства, которые были разработаны так, что когда вы закроете приложение, это будет то же самое, что принудительно остановить их (см. мой ответ здесь). - person Cecil Paul; 17.12.2019
comment
Существуют также устройства, на которых, даже если приложение все еще просто смахивается, даже если оно не закрывается принудительно, само устройство не позволяет ему получать сообщения. Другие говорят, что этого не может быть, потому что такие приложения, как WhatsApp, смогли это сделать. Причина, по которой я узнал об этом до сих пор, заключается в том, что производители устройств внесли в белый список большинство известных приложений, чтобы это было возможно. Это нигде не задокументировано, потому что (IMO) это тема, которая также зависит от устройства и над которой FCM не имеет полного контроля. - person Cecil Paul; 17.12.2019