#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 сервис успевает отработать, а все дальше уже нет (примерно так, не видя весь код сложно сказать точнее). Проверить можно внеся приложение в "белый список" (Настройки -> Батарея -> меню -> Экономия зараяда батареи -> все приложения -> клик и выбрать не экономить батарею) и проверив повторяется ли описанное в вопросе поведение.
Комментариев нет:
Отправить комментарий