Receiving notifications on android

Push уведомления в Android. Грабли, костыли и велосипеды

На написание данной статьи меня подтолкнула задача, которая была поставлена передо мной в одном из рабочих проектов: реализовать Push-уведомления в приложении. Казалось, все просто: штудируешь документацию, примеры и вперед. К тому же, опыт работы с уведомлениями уже был. Но не тут то было…

Сервис, в рамках которого реализовано приложение под Android, предъявляет довольно жесткие требования к работе Push-уведомлений. Необходимо в пределах 30-60 секунд оповестить пользователя о некотором действии. При успешном оповещении с устройства пользователя отправляется запрос на сервер с соответствующим статусом. Из документации известно, что сервис GCM (Google Cloud Messaging) не гарантирует доставку PUSH-уведомлений на устройства, поэтому в качестве backdoor варианта, при нарушении этих временных рамок, наш сервис уведомляет пользователя с помощью SMS сообщения. Поскольку стоимость SMS сообщения существенно выше чем PUSH-уведомления, необходимо максимально сократить поток SMS сообщений на клиентские устройства.

Проштудировав документацию и прикрутив пуш-уведомления, мы разослали нескольким клиентам первую сборку приложения для теста и стали ждать. Результаты были примерно следующими:

  • при активном Wifi соединении все работает идеально: уведомления доставляются, клиенты рады.
  • при активном мобильном интернете началось самое веселье.

Некоторые клиенты писали, что испытывают задержки в доставке пушей, либо получали одновременно и PUSH и SMS, что достаточно не практично. Другие писали, что вовсе не получали уведомлений, а только SMS. У третьих, как и у нас на тестовых устройствах, все было ок. Собрав с недовольных клиентов максимально возможную информацию, стали разбираться в проблеме и вывели следующий список ограничений (этот список позже вылился в полноценный FAQ):

  • включенный режим Энергосбережения (например, Stamina на устройствах Sony) влияет на работу Push уведомлений;
  • у пользователя обязательно должен быть минимум 1 активный Google аккаунт на устройстве;
  • необходимо удостовериться в том, что на устройстве установлена актуальная версия приложения “Сервисы Google Play”;
  • проверить, не отключены ли уведомления для приложения (галочка на страничке приложения в настройках телефона);
  • проверить, не ограничена ли работа фонового режима для приложения (настройка расположена в меню «Использование данных»);
  • в документации к GCM указано, что уведомления рассылаются только по определенным портам, поэтому настройки роутера, файервола и антивируса так же стоит учитывать.

Разослав данную памятку по всем клиентам, мы снова стали ждать результатов. И они оказались снова «не очень». Стали копать дальше.

На данном этапе очень сильно помогла статья, написанная ребятами из Mail.ru. В ней очень подробно описаны тонкости реализации GCM на клиентской стороне, а так же моменты, в связи с которыми отказываются работать Push уведомления в мобильных сетях. В конечном счете было принято решение о том, чтобы держать свое соединение с сервером в связке с GCM.

Перед тем, как приступить к решению, стоить выделить несколько очень важных моментов, которые позволяют сузить круг потенциально «нерабочих» устройств:

  • проблема возникает только при подключении к мобильному интернету;
  • по данным клиентов, проблема возникает на версии андроида 4 и выше.

И так, перейдем к реализации.

Бывалый разработчик под Android сходу скажет, что решений задачи как минимум 2: использовать Service или AlarmManager. Мы попробовали оба варианта. Рассмотрим первый из них.

Для того, чтобы создать неубиваемый системой сервис, который постоянно будет висеть в фоне и выполнять нашу задачу, мы использовали метод:

  • notificationId — некоторый уникальный идентификатор уведомления, который будет выведен в статус баре и в выезжающей шторке;
  • notification — само уведомление.

В данном случае обязательным условием является отображение уведомления в статус баре. Такой подход гарантирует то, что сервису будет дан больший приоритет (поскольку он взаимодействует с UI частью системы) в момент нехватки памяти на устройстве и система будет выгружать его одним из последних. Нам это уведомление не нужно, поэтому мы воспользовались следующим велосипедом: достаточно запустить одновременно с первым сервисом второй и для обоих сервисов в качестве notificationID использовать одно и тоже значение. Затем убить второй сервис. При этом уведомление пропадет из статус бара, но функциональные и приоритетные возможности первого сервиса останутся.

Читайте также:  Beyond oasis android rus

Реализовав данный подход, мы отправили сборку на тест. По результатам выяснилось, что система все-таки выгружает сервис, а по логам мы видели, как происходили существенные временные разрывы при запросе данных в фоне с нашего сервера. Поэтому приступили к реализации второго варианта — AlarmManager.

AlarmManager — это класс, который предоставляет работу с, грубо говоря, «будильником». Он позволяет указать время, по достижении которого система отправит широковещательное уведомление, которое позволит пробудить наше приложение и даст ему возможность выполнить необходимые действия. В работе этого метода есть некоторые ограничения, и их необходимо обработать:

  • данные о «будильниках» будут стерты после перезагрузки устройства;
  • данные о «будильниках» будут стерты после обновления приложения.

Первыми граблями, на которые мы наступили, был метод

который позволяет установить повторяющийся с некоторым интервалом «будильник». Прикрутив данный способ, стали тестировать, и тесты показали обратное — «будильник» не повторялся. Стали разбираться в чем дело, посмотрели документацию. И именно там нашли ответ на вопрос — начиная с 19 API lvl (Kitkat) абсолютно все «будильники» в системе стали разовыми. Вывод — всегда читайте документацию.

Эти грабли не были поводом для расстройства, ведь решение задачи довольно простое — запускать единоразовый «будильник» и после срабатывания переустанавливать его. При реализации этого подхода мы наткнулись на следующие грабли — оказалось, что для разных уровней API необходимо по разному устанавливать будильники, при этом в документации ничего сказано не было. Но данная проблема решилась достаточно просто — методом «тыка» и «гугления». Ниже представлен пример кода, позволяющий правильно устанавливать «будильники»:

Хочу обратить внимание на флаг AlarmManager.RTC_WAKEUP — именно с помощью него система позволит нашему приложению «проснуться» при неактивном экране, когда устройство находится в заблокированном состоянии.

Данный подход с «будильникам» дал нам нужный результат — приложение в фоне корректно опрашивает сервер на наличие новых данных. Сейчас мы дорабатываем алгоритм. На данный момент реализуем и тестируем следующую оптимизацию, которая позволит сузить круг устройств и тем самым уменьшить нагрузку на сервер:

  • в сообщении, отправленном средствами GCM на устройство, содержится некоторый уникальный ID;
  • получив данные GET запросом в фоновом режиме проверяем, существуют ли уже запись с таким ID на устройстве;
  • если локально на устройстве таких данных нет, мы запоминаем этот ID и время его получения T1;
  • ждем PUSH с таким же ID, при получении запоминаем время T2 и проверяем разницу между T2 и T1;
  • если разница составляет больше некоторого временного критерия (значения), то на устройстве наблюдается проблема с доставкой уведомлений и для корректной работы сервиса необходимо постоянно запрашивать данные в фоновом режиме с сервера (критерий советую выбирать исходя из решаемой задачи. В нашем случае, был выбран критерий равный 5 минутам);
  • данную разницу стоит вычислять несколько раз, например 5-10 раз, только после этого делать вывод о том, что устройство действительно содержит проблему с получением Push уведомлений (таким образом исключается ситуация банального разрыва соединения, таймаута и пр.);
  • необходимо прогонять данный алгоритм периодически (например, раз в неделю, или после обновления ОС на устройстве).

Всем добра. И поменьше подобных костылей.

Источник

How to Fix It When Notifications Are Not Showing up on Android

Find out why you’re not getting notifications and how to restore them

Notifications may not show up on your Android device in any one of several different ways:

  • The Android device isn’t providing any notifications at all.
  • Only specific apps aren’t issuing notifications when you know they should.
  • You receive notifications when an app first launches but then they stop.
  • Notifications only stop working when you only have a cellular or Wi-Fi connection.
Читайте также:  Ttf как открыть андроид

This article walks you through some of the ways to fix it when notifications are not showing up on your Android device.

Before you start troubleshooting why you aren’t receiving any app notifications, always confirm you’re connected to at least one network (cellular or Wi-Fi), and you have an internet connection. Open your mobile browser and try to search Google for anything. If Google Search doesn’t work, you likely have a network connection issue and you’ll need to troubleshoot your Wi-Fi network or mobile data connection first.

Cause of Notifications Not Showing up on Android

There are many different causes for not receiving notifications on your Android.

  • Do Not Disturb or Airplane Mode is turned on.
  • Either system or app notifications are disabled.
  • Power or data settings are preventing apps from retrieving notification alerts.
  • Outdated apps or OS software can cause apps to freeze or crash and not deliver notifications.

Notifications not showing up can occur at any time, and it isn’t always simple to pinpoint the problem.

How to Fix No Notifications on Android

Check That Do Not Disturb is not enabled. This may seem obvious, but forgetting Do Not Disturb is enabled is one of the most common causes for not receiving notifications. If this setting is on (that is, enabled), turn it off and notifications will start working again.

Restart your phone. Most of the issues that cause a lack of notification on Android can be resolved by restarting your phone. This is because even if the issue is a frozen or crashed app, a bad network connection, or anything else, restarting the phone may automatically resolve those issues and avoid a long troubleshooting process.

Make sure you haven’t disabled system notifications. There are many ways you can customize notifications on an Android device. These include customizing notification sounds, hiding notifications on the Android lock screen, or turning off notifications entirely. Always check system notifications settings first before you look for problems elsewhere.

If you aren’t sure when the problem started with not receiving notifications on your Android, check the notification history to pinpoint exactly when the problem started. This may help you identify when you may have installed a new app or performed a system update.

Make sure you haven’t turned off app notifications. If you aren’t receiving notifications from a specific app, the most likely culprit is the notification settings for that app. Every app has its own set of permissions to access Android features, and notifications are one of those. Make sure notifications are enabled for the apps you want.

Check your battery-saving settings. You can adjust power settings on your Android to disable apps or app features when the battery drops below a certain level. Battery Saver Mode is a common culprit for notification issues. Also, make sure you don’t have a battery saver app running which may be blocking app notifications when your battery is low.

Clear app cache and data. In addition to settings, almost every app has its own cache and app data storage area where it stores information about your usage and activity. This data can get corrupt or too large, leading to unusual app behavior such as notifications stopping. Clearing app cache and data often resolve these issues.

Update your apps. When apps are outdated, certain features may stop working. Often this will prevent all or some notifications from popping up. Make sure all of your apps are updated and enable automatic updates of all apps via the Google Play Store app.

Confirm you haven’t restricted your app from running in the background. If you’re not getting notifications from a specific app, it’s possible the app isn’t allowed to run in the background. Almost any app with a notifications feature has to run in the background for notifications to work.

Читайте также:  Для маленьких детей для андроид

Clear your Android cache partition. While clearing app data cache may fix app notification issues, your Android itself has its own cache area. Data stored there can also get corrupted and may lead to notification problems for all apps. Clearing the cache partition will fix these issues.

Check your Mobile Data Usage settings. Newer versions of the Android OS include the ability to disable app access to mobile data when you’re approaching a specific data limit each month. This is also known as Data Saving Mode. Double-check these settings to ensure you didn’t enable it accidentally or forgot to disable it. Not only will this feature disable notifications, but it’ll stop most apps from working at all.

Install all system updates for your Android device. If all else has failed, it’s possible your Android OS is out of date. Android OS updates often include new features which affect notifications. If you haven’t updated your phone in a while, apps that rely on those new features for issuing notifications will stop working.

If you’re not receiving text notifications on your Android phone, try the fixes above regarding general notifications not showing up. In addition, make sure you haven’t muted a particular contact or conversation; it’s also possible you haven’t properly disconnected Bluetooth headphones after recent use. Make sure notifications are allowed for the Messages app, and try setting a new notification sound for your Messages.

If you’re not getting app notifications on your iPhone, go to Settings > Notifications > Show Previews and select Always. Then, scroll down and choose apps individually and make sure Allow Notifications is toggled on. If you’re still having trouble, try restarting your iPhone and check your cellular and Wi-Fi connections.

Источник

Receiving Notifications in android studio

I am trying to send a notification to the user to remind him to do a specific thing using my app at 10AM each day.

My problem is that I am receiving the notification only when I open this app at 10AM. and since then each time I open the app I receive a notification. so if I opened it at 10:03AM I will receive a notification.

here is my MainActivity:

I am calling my method using onCreate() method

Note: I am also receiving a notification when i install the app for the first time!

2 Answers 2

Firstly, do not use setInexactRepeating if you want to try to get your app notification at exactly 10am. Use setRepeating instead:

Secondly, another possible issue is, if this problem is occurring on a specific phone (normally phones with aggressive power management like Huawei, Nokia, etc), disable the battery management for that app. These phones are known to be notorious in killing background apps that will also remove it from sending notifications.

There are solutions for specific phones on there:

Phone Settings > Advanced Settings > Battery Manager > Protected apps – check for your app as Protected

Phone Settings > Apps > Your app > Battery > Power-intensive prompt [x] and Keep running after screen off [x]

Phone settings > Apps > Advanced (At the bottom) > Ignore optimisations > Press Allowed > All apps > Find your app on the list and set to Allow

Phone settings > Battery > App launch and then set your app to “Manage manually” and make sure everything is turned on.

Phone settings > Battery > Launch and then set your app to “Manage manually” and make sure everything is turned on.

For other branded phones, look for something along that line.

I just noticed your edit that you get a notification even though installing for the first time. Maybe add on something like this to your calendar:

Источник

Оцените статью