Сервис Android с таймерзадачей и блокировкой пробуждения приостанавливает свою работу при выключенном экране

#android #service #timertask #wakelock #powermanager

Вопрос:

Привет всем разработчикам Android, я хочу задать вопрос о том, что сводит меня с ума в последние несколько недель, и я не могу заставить его работать должным образом.

У меня есть приложение для Android, которое запускает службу, в которой есть цикл, который запускается каждые несколько секунд и должен работать бесконечно и никогда не останавливаться, даже если экран выключен. эта служба будет работать независимо от того, открыт пользовательский интерфейс приложения или нет. он запускается, даже если стек задач был очищен.

Я реализовал все это, используя службу и временную задачу внутри класса обслуживания, как это:

             Timer timer = new Timer();
            TimerTask timerTask = new TimerTask() {
                public void run() {
                  //Do something that will run again and again every time that the timer is called. every 10 seconds.
                }
            };
            timer.schedule(timerTask, 1000, 10000);
 

Я добавил блокировку внутри этого цикла (и я также попытался запустить блокировку только один раз за пределами цикла):

  PowerManager mgr = (PowerManager) getApplicationContext().getSystemService(Context.POWER_SERVICE);
                        PowerManager.WakeLock wakeLock = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "myapp:MyWakeLock1234");
                        if (!wakeLock.isHeld()) {
                            wakeLock.acquire();
                            Log.d("WAKEWAKE", "WAKELOCK ACQUIRED NOW...");
                        }
 

Я никогда не снимаю блокировку, потому что цикл обслуживания работает бесконечно даже при выключенном экране.

Внутри цикла таймера я также добавил звук медиаплеера, который будет издавать звуковой сигнал каждые несколько секунд (в целях тестирования — я намерен удалить его, если все работает нормально).:

 MediaPlayer mp = MediaPlayer.create(MyService2.this, R.raw.beepbeep);
                    mp.setOnCompletionListener(MediaPlayer::release);
                    mp.start();
 

Сама служба работает нормально, и я также настроил приложение на перезагрузку службы после загрузки, и оно также работает нормально.

Единственная проблема, которая у меня возникает, — это после того, как я выключаю экран телефона с помощью кнопки питания или всякий раз, когда экран выключается при любых обстоятельствах, — а затем таймер продолжает работать, а звуковой сигнал продолжает воспроизводиться каждые 10 секунд, а затем… ОСТАНАВЛИВАЕТСЯ ! он может остановиться на несколько минут, он может остановиться на 20 минут, он возобновит звуковой сигнал, когда экран выключен (блокировка пробуждения), после этого 1 или более раз и снова. Останавливается еще на N минут.

Как только я открываю дисплей телефона, чтобы выйти из режима ожидания — цикл волшебным образом возобновляется каждые 10 секунд и хорошо пищит, как будто проблем нет ! Я перепробовал все ! Я попытался удалить звуковые сигналы медиаплеера, попытался запустить WakeLock только один раз, а не в цикле, попытался сделать паршивый цикл вместо использования временной задачи. Все работает хорошо, пока экран не выключится ! похоже, мой сервис переходит в какой-то спящий режим или паузу. я даже пытался загрузить фрагмент кода с GitHub, который утверждает, что работает хорошо, но он останавливается/приостанавливается точно так же ! Я должен отметить, что на данный момент задача расписания ПУСТА и не запускается ничего, кроме кода WakeLock и звукового сигнала медиаплеера. Никакой связи, ничего !

Что я могу сделать, чтобы решить эту проблему ? спасибо за ваши добрые ответы ! Я ценю это !

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

1. «У меня есть приложение для Android, которое запускает службу, в которой есть цикл, который запускается каждые несколько секунд и должен работать бесконечно и никогда не останавливаться, даже если экран выключен» — поскольку это ужасно для времени автономной работы, Android в течение последних нескольких выпусков прилагал большие усилия, чтобы разработчики не делали подобных вещей. Как минимум, на вас повлияет режим дремоты, и различные производители устройств сделали даже больше, чтобы защитить своих пользователей.

2. Привет, спасибо за быстрый ответ. Итак, как такие приложения, как WhatsApp и другие подобные, прослушивают ваши входящие сообщения, даже если экран устройства выключен в течение нескольких часов ? Я предполагаю, что ни Google, ни какой — либо другой производитель телефонов не делает ничего, чтобы, например, помешать WhatsApp получать ваши входящие сообщения в ту же секунду, когда они были отправлены вам-независимо от того, включен или выключен ваш экран.

3. @CuriousDeveloper Позволяет использовать FCM или другие решения для обмена сообщениями push. FCM может отправлять сообщение с высоким приоритетом, которое работает в режиме ожидания. Android встроен в эту работу, чтобы включить такие вещи, как уведомления в чате. Но вы не сможете легко сделать это в своем собственном сервисе. Как минимум, вам понадобится служба переднего плана, вам нужно будет включить ее в белый список (что требует предварительной установки или действий пользователя), и даже в этом случае она не гарантирована.

4. Ладно, звучит интересно, в худшем случае мне, возможно, придется довольствоваться тем, что моя служба каждые несколько секунд приостанавливается на несколько минут. это раздражает. Хотя я не пишу систему обмена сообщениями в чате, я все равно хочу доставлять сообщения своим пользователям с моего сервера, как только они будут актуальны, а не после того, как они не будут актуальны. В целях тестирования я просто подключил свой телефон к розетке, и с первой попытки кажется, что таймер работает каждые 10 секунд точно по времени. Может быть, он действительно переходит в режим ДРЕМОТЫ, о котором я не знал 🙂