Страницы

Поиск по вопросам

четверг, 5 марта 2020 г.

не отправляется Notification

#android #android_notification #pendingintent


Есть сервис, по расписанию качает новости, после загрузки отправляет уведомление
- Notification. В последнее время начал замечать что сервис отрабатывает, однако уведомление
не отправляет. Повесил логи в аналитику, метод отправки сообщения вызывается - однако
сообщение не доходит (Причем может через раз отправлять, может день не отправлять а
потом день все нормально). Что может быть не так, код прилагается.

public void sendMessage(int countNews){
    Resources resources = getResources();
    Intent i = NewsListActivity.newIntent(this);
    PendingIntent pi = PendingIntent.getActivity(this, 1, i, 0);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
            .setTicker(resources.getString(R.string.get_new_news))
            .setSmallIcon(R.drawable.ic_notif_logo)
            .setLargeIcon(BitmapFactory.decodeResource(res, R.mipmap.ic_launcher))
            .setNumber(countNews)
            .setContentTitle(resources.getString(R.string.get_new_news))
            .setContentText(resources.getQuantityString(R.plurals.news_plurals, countNews,
countNews))
            .setContentIntent(pi)
            .setAutoCancel(true);

    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
    notificationManager.notify(1, mBuilder.build());
}


Не может это быть из-за того что PendingIntent у Notification по requestCode совпадает
с PendingIntent сервиса - последний для периодического запуска через AlarmManager.

чтобы не пересекались ID у PendingIntent исправил код:

public void sendMessage(int countNews){
    Resources resources = getResources();
    Intent i = NewsListActivity.newIntent(this);
    PendingIntent pi = PendingIntent.getActivity(this, NOTIFICATION_INTENT_ID, i,
PendingIntent.FLAG_CANCEL_CURRENT);

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
            .setTicker(resources.getString(R.string.get_new_news))
            .setSmallIcon(R.drawable.ic_notif_logo)
            .setLargeIcon(BitmapFactory.decodeResource(resources, R.mipmap.ic_launcher))
            .setNumber(countNews)
            .setContentTitle(resources.getString(R.string.get_new_news))
            .setContentText(resources.getQuantityString(R.plurals.news_plurals, countNews,
countNews))
            .setContentIntent(pi)
            .setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
            .setAutoCancel(true);

    NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
    notificationManager.notify(NOTIFICATION_ID, mBuilder.build());
}


сутки сообщения отправлялись отлично, все работало, ночью новости скачались - сообщения
нет, днем еще подгрузились - опять сообщение не пришло. Как будто аппарат очень крепко
"уснул" и не принимает уведомления...
Причем на втором аппарате с Android 5.1 уведомления приходят - на Android 6.0 вышеописанная
картина.
    


Ответы

Ответ 1



С 6 андроида из-за Doze для точных уведомлений следует использовать методы: If you need to set alarms that fire while in Doze, use setAndAllowWhileIdle() or setExactAndAllowWhileIdle(). https://developer.android.com/training/monitoring-device-state/doze-standby.html

Ответ 2



Очень похоже, что проблема из-за режима Doze (как раз появился в 6.0). Примерно происходит так: Телефон лежит неподвижно без подзарядки Система переходит в режим Doze Отрабатывает сервис, но Doze игнорирует wake lock и нотификация не срабатывает. То есть в окошко, которое дает для работы Doze сервис успевает отработать, а все дальше уже нет (примерно так, не видя весь код сложно сказать точнее). Проверить можно внеся приложение в "белый список" (Настройки -> Батарея -> меню -> Экономия зараяда батареи -> все приложения -> клик и выбрать не экономить батарею) и проверив повторяется ли описанное в вопросе поведение.

Комментариев нет:

Отправить комментарий