#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 секунд точно по времени. Может быть, он действительно переходит в режим ДРЕМОТЫ, о котором я не знал 🙂