Фоновая проверка wifi в Android

Я начал около месяца или два, и мне нужно разработать систему внутреннего размещения, основанную на фингерпринте Wifi. Мне нужно приложение, которое периодически сканирует AP Wi-Fi и отправляет данные результатов на сервер.

До сих пор я создал приложение, которое позволяет сканировать AP Wi-Fi и получать результаты при обнаружении различных подключений. Я делаю это в основном действии с помощью широковещательного приемника. Приложение также может отправлять данные на сервер.

Теперь я хочу перевести этот процесс на периодический процесс в фоновом режиме, даже когда смартфон находится в спящем режиме.

Я уже прочитал несколько тем о том, как это сделать, но ни один из них не был ясен. Мой вопрос – лучший способ сделать это? Использование службы / IntentService с таймером / таймером?

Благодарю.

Редактировать: Спасибо! AlarmManager и службы работают нормально!

Я думаю, что AlarmManager соответствует вашим потребностям, используйте setRepeating чтобы установить что-то повторяющееся каждые X раз

Запланируйте повторяющийся сигнал. Примечание: для операций синхронизации (тиков, тайм-аутов и т. Д.) Проще и эффективнее использовать Handler. Если на тот же IntentSender уже установлен будильник, он будет сначала отменен.

Например, set (int, long, PendingIntent), за исключением того, что вы также можете указать период, когда будильник будет автоматически повторяться. Этот сигнал продолжает повторяться до явного удаления с отменой (PendingIntent). Если указанное время триггера в прошлом, тревога будет срабатывать немедленно, с подсчетом тревоги в зависимости от того, как далеко в прошлом время срабатывания относительно интервала повторения.

Если тревога задерживается (например, для системного сна, для типов сигналов без _WAKEUP), пропущенный повтор будет доставлен как можно скорее. После этого будущие тревоги будут доставлены в соответствии с первоначальным графиком; Они со временем не дрейфуют. Например, если вы установили повторяющийся сигнал тревоги на верх каждый час, но телефон спал с 7:45 до 8:45, сигнал тревоги будет отправлен сразу же после пробуждения телефона, затем следующий сигнал будет отправлен по адресу 9:00.

Если ваше приложение хочет разрешить время доставки дрейфа, чтобы гарантировать, что по крайней мере определенный интервал времени всегда проходит между сигналами тревоги, тогда подход, который необходимо предпринять, заключается в использовании одноразовых аварийных сигналов, планирование следующего для каждого при каждой отправке сигналов тревоги ,

Примечание: с API 19 все повторяющиеся сигналы тревоги неточны. Если ваше приложение нуждается в точном сроке доставки, оно должно использовать одноразовые точные аварийные сигналы, каждый раз пересматривая сроки, как описано выше. Устаревшие приложения, чья targetSdkVersion раньше, чем API 19, будут по-прежнему иметь все свои аварийные сигналы, включая повторяющиеся сигналы тревоги, которые считаются точными.

параметры

Тип Один из ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC или RTC_WAKEUP.

TriggerAtMillis раз в миллисекундах, чтобы сигнал тревоги сначала отключился, используя соответствующие часы (в зависимости от типа тревоги).

IntervalMillis интервал в миллисекундах между последующими повторами тревоги.

Operation Действие, которое необходимо выполнить при отключении будильника; Обычно происходит из IntentSender.getBroadcast ().

Как отмечается в примечании

Примечание: с API 19 все повторяющиеся сигналы тревоги неточны. Если ваше приложение нуждается в точном сроке доставки, оно должно использовать одноразовые точные аварийные сигналы, каждый раз пересматривая сроки, как описано выше. Устаревшие приложения, чья targetSdkVersion раньше, чем API 19, будут по-прежнему иметь все свои аварийные сигналы, включая повторяющиеся сигналы тревоги, которые считаются точными.

Но я не думаю, что вам все равно, если это неточно.


Или вы можете использовать setInexactRepeating

Запланировать повторяющийся сигнал тревоги, который имеет неточные требования к времени запуска; Например, будильник, который повторяется каждый час, но не обязательно вверху каждого часа. Эти аварийные сигналы более энергоэффективны, чем строгие рецидивы, традиционно поставляемые setRepeating (int, long, long, PendingIntent), поскольку система может настроить время доставки сигналов тревоги, чтобы заставить их одновременно срабатывать, избегая пробуждения устройства от сна больше, чем необходимо ,

Первый триггер вашего будильника будет не раньше запрошенного времени, но он может не произойти почти через полный интервал после этого времени. Кроме того, в то время как общий период повторяющегося сигнала тревоги будет запрошен, время между любыми двумя последовательными сигналами тревоги может отличаться. Если ваше приложение требует очень низкого джиттера, используйте одноразовые аварийные сигналы с соответствующим окном; См. SetWindow (int, long, long, PendingIntent) и setExact (int, long, PendingIntent).

Начиная с API 19, все повторяющиеся сигналы тревоги неточны. Поскольку этот метод доступен с API 3, ваше приложение может безопасно называть его и быть уверенным, что оно будет иметь подобное поведение как в текущей, так и в старой версиях Android.

параметры

Тип Один из ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, RTC или RTC_WAKEUP.

TriggerAtMillis раз в миллисекундах, чтобы сигнал тревоги сначала отключился, используя соответствующие часы (в зависимости от типа тревоги). Это неточно: сигнал тревоги не срабатывает до этого времени, но может произойти задержка почти всего интервала тревоги перед первым вызовом тревоги.

IntervalMillis интервал в миллисекундах между последующими повторами тревоги.

До API 19, если это один из INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, INTERVAL_HOUR, INTERVAL_HALF_DAY или INTERVAL_DAY, тогда сигнал тревоги будет выровнен по фазе с другими аварийными сигналами, чтобы уменьшить количество пробуждений. В противном случае будильник будет установлен так, как если бы приложение вызывало setRepeating (int, long, long, PendingIntent). Начиная с API 19, все повторяющиеся сигналы тревоги будут неточными и подлежат дозированию с другими аварийными сигналами независимо от их указанного интервала повторения. Operation Действие, которое необходимо выполнить при отключении будильника; Обычно происходит из IntentSender.getBroadcast ().

Хотя цель моего ответа состоит в том, чтобы сказать общий способ повторить действие каждые X раз, как и другие заметили, вам понадобится Wifi Lock , Wake lock и использовать RTC_WAKEUP в качестве типа AlarmManager.

RTC_WAKEUP : Время будильника в System.currentTimeMillis () (время настенных часов в UTC), которое пробудит устройство, когда оно погаснет.

Переместите свой код из «Активность в службу». Затем запустите службу периодически с помощью AlarmManager. Служба выполняет сканирование и останавливает себя, когда это делается. Затем он запускается снова, когда таймер истекает.

EDIT: Также посмотрите на блокировку cpu и блокировку wifi .

EDIT2: также при создании тревоги используйте константу RTC_WAKEUP, чтобы ваше действие срабатывало, даже если устройство находится в спящем режиме.

Intereting Posts
Android – использование Google Analytics v4 Campaign Measurement Установите GestureDetector во все дочерние представления Звонок с использованием эмулятора Android Почему клавиатура появляется после TabBar? Как избежать получения пользователем собственного уведомления gcm чата на Pubnub Почему произошла эта ошибка? Java.lang.RuntimeException: ImageLoader должен быть init с настройкой перед использованием Отмена выбора RadioButton – альтернативный метод Получение хэша ключа Android для модуля trigger.io facebook Android: как программный доступ к серийному номеру устройства, указанному в AVD-менеджере (API версии 8) Log.wtf против необработанного исключения Как изменить настройки android.permission при выполнении тестов Пользователь Jabber переходит в автономный режим: почему два разных сценария? Динамически устанавливать цвет темы Запись видео с камеры на Android на mp4 Должен ли мобильный веб-сайт иметь свой собственный домен?