Добрый день. Я новичок в программировании. Пишу программу, которая по заданному пользователем времени делает запрос в базу данных сайта, получает 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" />