@MishaBabets

Уведомления в спящем режиме / Notifications in sleep mode?

Добрый день. Я новичок в программировании. Пишу программу, которая по заданному пользователем времени делает запрос в базу данных сайта, получает JSON ответ, парсит его и выводит в уведомления. Изначально я делал через Service + TimerTask, но проблема была в том, что когда устройство в спящем режиме, уведомления не приходят. Я пробовал будить устройство таким образом перед отправкой запроса в базу:
PowerManager powerManager = (PowerManager) getApplicationContext().getSystemService(POWER_SERVICE);
        PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
        wakeLock.acquire()

и эта схема не работала, уведомления по прежнему не приходили в спящем режиме. Но приходили, когда телефон был на зарядке, или подключен ко компьютеру. Как будить процессор без зарядки, я так и не нашел. Решил попробовать через AlarmManager с ключом RTC_WAKEUP :
Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.SECOND, timeUpdate);
        time = calendar.getTimeInMillis();

        am = (AlarmManager) getApplicationContext().getSystemService(ALARM_SERVICE);
        intentAlarm = new Intent(getApplicationContext(), TimeNotification.class);
am.cancel(pendingIntent);
    am.setRepeating(AlarmManager.RTC_WAKEUP, time, timeUpdate * 1000, pendingIntent);

Это тоже не помогло, к тому же уведомления стали приходить странно, иногда приходят иногда нет, а если не приходят, то накапливаются. Т.е. стоит период обновления 1 мин, если телефон выключен 5 мин, то сразу после включения приходит первое уведомления, и как только сбрасываю его, приходит следующее и так 5 раз. Хотя, номер в уведомлениях стоит одинаковый:
Notification.Builder builder = new Notification.Builder(mContext.getApplicationContext());

                    Intent notificationIntent = new Intent(mContext.getApplicationContext(), ShowNotification.class);
                   
                    PendingIntent contentIntent = PendingIntent.getActivity(mContext.getApplicationContext(),
                            0, notificationIntent,
                            PendingIntent.FLAG_CANCEL_CURRENT);

                    builder.setContentIntent(contentIntent)
                            .setSmallIcon(R.drawable.notification) 
                            .setTicker(mContext.getString(R.string.notifTicker))
                            .setWhen(System.currentTimeMillis())
                            .setAutoCancel(true)
                            .setSound(uri)
                            .setOnlyAlertOnce(true)
                            .setPriority(1)
                            .setDefaults(Notification.DEFAULT_VIBRATE)
                            .setContentTitle(mContext.getString(R.string.notifTitle))
                            .setContentText(mContext.getString(R.string.notifText)); 

                    Notification notification = builder.build();


                    NotificationManager notificationManager = (NotificationManager) mContext.getApplicationContext()
                            .getSystemService(Context.NOTIFICATION_SERVICE);
                    notificationManager.notify(<b>101</b>, notification);
                }

Когда работало через TimerTask такого не было, уведомления приходили по одному.

Потом я понял, что по сути Service мне не нужен, и можно запускать только AlarmManager, и была мысль, что сервис сам по себе не работает в спящем режиме. Но без сервиса тоже не заработало.

Уважаемые коллеги, есть идеи как можно реализовать пробуждение процессора. Возможно есть какая-то системная очередь, в которую можно поставить свое уведомление, и оно выполнится, при пробуждении CPU, или как-то отслеживать пробуждение CPU, либо еще какие-то мысли как правильно реализовать такого типа задачу?

PS: Если стоит небольшой период обновления, то иногда уведомления приходят сами, т.е. период - 1 мин, а может прийти через 10 или 30, значит какие-то процессы так или иначе будят CPU, + как-то будят CPU уведомления типа СМС или Viber.

PPS: В манифесте естественно указал
<uses-permission android:name="android.permission.WAKE_LOCK" />
  • Вопрос задан
  • 2074 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Copperfield
Android dude
Попробуйте WakefulBroadcastReceiver
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы