У меня есть приложение для Android, которое неоднократно собирает отпечатки пальцев из окружающих сетей Wi-Fi (по научным причинам, чтобы не вторгаться в личную жизнь).
В любом случае, представьте, что у меня есть функция, которая выполняет эту работу, и она называется scanWifi () . Изначально я хотел запустить его так:
ExecutorService mExecutor = Executors.newSingleThreadScheduledExecutor();
mExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
scanWifi();
}
}, 0, interval, TimeUnit.MILLISECONDS);
К сожалению, это работает надежно, только когда телефон подключен. Если он подключен и некоторое время лежит, он не запускает мою функцию scanWifi () каждую минуту. Иногда между одиночными вызовами scanWifi () возникают промежутки в несколько минут.
Я также пытался сделать то же самое, используя Timer / TimerTask с такими же плохими результатами.
Единственное, что до сих пор работает более или менее надежно, - это отправить его обработчику и вызывать его повторно, например так:
Handler h = new Handler();
Runnable r = new Runnable() {
@Override
public void run() {
if (!mIsStopped) {
scanWifi();
h.postDelayed(this, mInterval);
}
}
};
h.post(r);
Почему это так? Процессор спит и, таким образом, пропускает запланированное выполнение? Я держу в своем приложении частичный пробуждение
Я думаю, что вы ищете AlarmManager. См., например, этот вопрос: Android: Как использовать AlarmManager