- Планирование задач в Андроид
- Проблемы с сервисами
- Запланированный задачи во время жизненного цикла приложения
- Запланированные задачи при выключенном приложении
- Alarm Manager
- Job Scheduler
- GCM Network Manager
- Firebase Job Dispatcher
- Sync Adapter
- Упражнение
- Создание Job Service
- Создать объект JobInfo
- Запланированная задача
- Заключение
- Запуск сервиса по расписанию android
- Планировщик заданий Android
- Обзор
- Требования
- Использование планировщика заданий Android
- Реализация Жобсервице
- Создание JobInfo для планирования задания
- Передача параметров в задание через JobInfo
- Планирование задания
- Отмена задания
- Итоги
Планирование задач в Андроид
Привет Хабр! Предлагаю вашему вниманию свободный перевод статьи «Schedule tasks and jobs intelligently in Android» от Ankit Sinhal.
В современной разработке приложений очень часто выполняются задачи асинхронно, и их объем выходит за пределы жизненного цикла приложения. В некоторых ситуациях мы также должны выполнять некоторые работы, но это не обязательно делать прямо сейчас. Чтобы запланировать фоновые работы, Android представила несколько API, которые мы можем грамотно использовать в наших приложениях.
Выбор подходящего планировщика может улучшить производительность приложений и время автономной работы устройства.
Для планирования задач на Android доступно несколько API:
- Alarm Manager
- Job Scheduler
- GCM Network Manager
- Firebase Job Dispatcher
- Sync Adapter
Проблемы с сервисами
Сервисы позволяют выполнять длительные операции в фоновом режиме. Запуск сервисов в фоновом режиме очень негативно влияет на заряд батареии.
Сервисы особенно вредны, когда они постоянно использует ресурсы устройства, даже если не выполняет полезные задачи.
Запланированный задачи во время жизненного цикла приложения
Когда приложение запущено, и мы хотим запланировать или запустить задачу в определенное время, рекомендуется использовать класс Handler вместе с Timer и Thread.
Запланированные задачи при выключенном приложении
Alarm Manager
AlarmManager обеспечивает доступ к службам уведомлений. Это дает возможность выполнять любые операции за пределами жизненного цикла вашего приложения. Таким образом, вы можете инициировать события или действия, даже если ваше приложение не запущено. AlarmManager может запустить сервис в будущем.
Мы должны использовать API AlarmManager только для задач, которые должны выполняться в определенное время
Пример использования: предположим, что мы хотим выполнить задачу через 1 час или каждый час. В этом случае AlarmManager нам поможет.
Job Scheduler
Это главный из всех упомянутых вариантов планирования и очень эффективный с фоновыми работами. JobScheduler API, который был представлен в Android 5.0 (API уровня 21).
Этот API позволяет выполнять задания, когда у устройства больше доступных ресурсов или при соблюдении правильных условий. Все условия могут быть определены при создании задания. Когда объявленные критерии будут выполнены, система выполнит это задание в JobService вашего приложения. JobScheduler также отменяет выполнение, если необходимо, чтобы соблюдать ограничения режима Doze и App Standby.
GCM Network Manager
GCM (Google Cloud Messaging) Network Manager имеет все функции расписания из JobScheduler. GCM Network Manager также предназначен для выполнения многократной или одноразовой, неминуемой работы при сохранении времени автономной работы.
Он используется для поддержки обратной совместимости и может также использоваться под Android 5.0 (API уровня 21). Начиная с уровня API 23 или выше, GCM Network Manager использует JobScheduler для платформы. GCM Network Manager использует механизм планирования в службах Google Play, поэтому этот класс будет работать только в том случае, если на устройстве установлены сервисы Google Play.
Google настоятельно рекомендовал пользователям GCM перейти на FCM и вместо этого использовать диспетчер заданий Firebase для планирования любых задач.
Firebase Job Dispatcher
Firebase JobDispatcher также является библиотекой для планирования фоновых заданий. Он также используется для поддержки обратной совместимости (ниже API 21) и работает во всех последних версиях Android (API 9+).
Эта библиотека также будет работать, если на устройстве нет установленных сервисов Google Play. В этом состоянии эта библиотека внутренне использует AlarmManager. Если на устройстве доступно приложение Google Play, он использует механизм планирования в службах Google Play.
Sync Adapter
Sync adapters разработаны специально для синхронизации данных между устройством и облаком. Он должен использоваться только для этого типа задач. Синхронизация может быть вызвана изменениями данных в облаке или на устройстве или по истекшему времени.
Система будет пытаться синхронизировать только тогда, когда устройство подключено к сети.
Упражнение
Мы обсудили достаточно теории, поэтому теперь посмотрим, как использовать планировщик заданий Android.
Создание Job Service
Создайте JobSchedulerService extends JobService, который требует, чтобы были созданы два метода onStartJob (параметры JobParameters) и onStopJob (параметры JobParameters).
Метод onStartJob вызывается, когда JobScheduler решает запустить вашу работу. JobService работает в основном потоке, поэтому любая логика должна выполняться в отдельном потоке. Метод onStopJob вызывается, если система решила, что вы должны прекратить выполнение своей работы. Метод вызывается до jobFinished (JobParameters, boolean).
Вам также необходимо зарегистрировать свою службу в AndroidManifest.
Создать объект JobInfo
Чтобы построить объект JobInfo, передайте JobService в JobInfo.Builder (), как показано ниже. Этот конструктор заданий позволяет установить множество различных параметров управления при выполнении задания.
Запланированная задача
Теперь у нас есть JobInfo и JobService, поэтому пришло время планировать нашу работу. Все, что нам нужно сделать, это запланировать работу с требуемой JobInfo, как показано ниже:
Заключение
При планировании задания вам нужно тщательно подумать о том, когда и что должно вызвать вашу задачу, и что должно произойти, если она по какой-то причине не сработает. Вы должны быть очень осторожны с производительностью вашего приложения, а также с другими аспектами, такими как заряд батареи.
JobScheduler легко реализуется и обрабатывает большую часть за вас. При использовании JobScheduler наши запланированные задания сохраняются, даже если система перезагружается. В настоящий момент единственным недостатком JobScheduler является то, что он доступен только для 21 уровня api (Android 5.0).
Источник
Запуск сервиса по расписанию android
Краткое описание:
Планировщик для выполнения системных задач по расписанию.
Описание:
Включайте сеть, профили, громкость, WiFi, блютус, яркость, и многое другое, по расписанию!
— Brightness! (Auto, Full, Custom, Dim Screen)
— Launch an app. (launch your internet radio to make music alarm)
— Режим без звука, вибрации, громкость(звонок, мультимедия, будильник)
— Bluetooth и WiFi Вкл and Выкл
— Режим самолета
— Меняйте рингтоны и звуки уведомлений
И многе дргое!
Создайте задачу и она будет выполняться автоматически. Настраивайте время, день недели, номер недели, когда вы хотите чтобы задаxf была выполнена.
Утром, ночью, по выходным. Сохраните заряд батареи, переведя устройство в режим экономии энергии, установив задачу.
***О Mobile Data***
Есть проблемы с отключением мобильных данных на HTC EVO 4G.
Phone Schedule работает в фоновом режиме.
Поддерживаемые функции:
— Беззвучный режим
— Режим вибрации
— Нормальный режим
— Включение\выключение WiFi
— Включение\выключение Bluetooth
— Включение\выключений режима самолета
— Смена громкости звонка, мультимедии и будильника
— Смена рингтона
— Смена звука уведомлений
— Смена яркости
— Dim Screen
— Запуск приложения
— Включение\выключение интернета
— Напоминание
Русский интерфейс: Нет
Сообщение отредактировал $iLence — 22.08.18, 16:10
Источник
Планировщик заданий Android
В этом руководство описано, как запланировать фоновую работу с помощью API планировщика заданий Android, который доступен на устройствах Android с Android 5,0 (уровень API 21) и более поздних версий.
Обзор
Одним из лучших способов обеспечения реагирования на запросы пользователя к приложению Android является обеспечение выполнения сложной или длительной работы в фоновом режиме. Однако важно, чтобы фоновая работа не негативно влияла на взаимодействие пользователя с устройством.
Например, фоновое задание может опрашивать веб-сайт каждые три или четыре минуты для запроса изменений в определенном наборе данных. Это кажется немягким, однако это повлияет на время работы от аккумулятора. Приложение будет многократно выводить устройство из спящего режима, повышать производительность процессора до более высокого состояния электропитания, включать Радио, выполнять сетевые запросы и обрабатывать результаты. Это хуже, так как устройство не будет немедленно выключено и вернуться в состояние низкого энергопотребления. Плохо запланированная фоновая работа может привести к непреднамеренному состоянию устройства с ненужными и чрезмерными требованиями к питанию. Это похожее действие безобидным (опрос веб-сайта) сделает устройство непригодным для использования в течение относительно короткого периода времени.
Android предоставляет следующие API-интерфейсы для выполнения работы в фоновом режиме, но они недостаточно для интеллектуального планирования заданий.
- Службы с намерением — это отлично подходит для выполнения работы, однако они не дают возможности планировать работу.
- Алармманажер — эти API-интерфейсы позволяют планировать работу только по расписанию, но не дают возможности реально выполнять работу. Кроме того, Алармманажер разрешает только ограничения на основе времени, что означает создание оповещения в определенное время или по истечении определенного периода времени.
- Широковещательные приемники . приложение Android может настраивать широковещательные приемники для выполнения работы в ответ на события на уровне системы или намерения. Однако широковещательные приемники не предоставляют контроль над временем выполнения задания. Кроме того, изменения в операционной системе Android ограничивают, когда будут работать широковещательные получатели, или на виды работы, на которую они могут отвечать.
Существует два ключевых компонента для эффективного выполнения фоновой работы (иногда называемой фоновым заданием или заданием):
- Интеллектуальное планирование работы — важно, чтобы приложение выполняло работу в фоновом режиме, которое оно делает в качестве хорошего. В идеале приложение не должно требовать выполнения задания. Вместо этого приложение должно указать условия, которые должны быть выполнены для выполнения задания, а затем запланировать это задание с операционной системой, которая будет выполнять работу при соблюдении условий. Это позволяет Android запустить задание, чтобы обеспечить максимальную эффективность устройства. Например, сетевые запросы могут быть пакетными для одновременного выполнения, чтобы обеспечить максимальное использование нагрузки, связанной с сетью.
- Инкапсуляция работы . код для выполнения фоновой работы должен быть инкапсулирован в дискретный компонент, который может быть запущен независимо от пользовательского интерфейса и будет сравнительно простым в планировании, если по какой-либо причине не удается завершить работу.
Планировщик заданий Android — это платформа, встроенная в операционную систему Android, которая предоставляет API Fluent для упрощения планирования фоновой работы. Планировщик заданий Android состоит из следующих типов:
- Android.App.Job.JobScheduler — Это системная служба, которая используется для планирования, выполнения и при необходимости отмены заданий от имени приложения Android.
- Android.App.Job.JobService — Это абстрактный класс, который должен быть расширен с помощью логики, которая будет выполнять задание в основном потоке приложения. Это означает, что JobService отвечает за то, как выполняется асинхронное выполнение работы.
- Android.App.Job.JobInfo Объект содержит критерии для указания Android при запуске задания.
Чтобы запланировать работу с планировщиком заданий Android, приложение Xamarin. Android должно инкапсулировать код в класс, расширяющий JobService класс. JobService содержит три метода жизненного цикла, которые могут быть вызваны в течение времени существования задания:
bool онстартжоб (параметры жобпараметерс) — этот метод вызывается методом для выполнения работы и выполняется в основном потоке приложения. JobService Для асинхронного выполнения работы и возврата true при наличии оставшейся работы или в false случае завершения работы отвечает.
Когда JobScheduler вызывает этот метод, он запрашивает и оставляет вакелокк от Android на время выполнения задания. По завершении задания ответственность за JobService то, чтобы сообщить JobScheduler об этом факте, осуществляется путем вызова JobFinished метода (описан далее).
Жобфинишед (параметры жобпараметерс, bool нидсресчедуле) — этот метод должен быть вызван с помощью, чтобы сообщить JobScheduler о том, что работа выполнена. Если JobFinished не вызывается, то JobScheduler не будет удалять вакелокк, что приведет к ненужному прекращению работы аккумулятора.
bool онстопжоб (параметры жобпараметерс) — вызывается, когда задание преждевременно остановлено Android. Он должен возвращать true значение, если задание должно быть перепланировано в соответствии с критериями повтора (см. ниже подробнее).
Можно указать ограничения или триггеры , которые будут контролировать, когда задание может или должно выполняться. Например, можно ограничить задание, чтобы оно выполнялось только при зарядки устройства или для запуска задания при создании изображения.
В этом руководство подробно описано, как реализовать JobService класс и запланировать его с помощью JobScheduler .
Требования
Для планировщика заданий Android требуется уровень API Android 21 (Android 5,0) или более поздней версии.
Использование планировщика заданий Android
Использование API Жобсчедулер для Android состоит из трех этапов.
- Реализуйте тип Жобсервице для инкапсуляции работы.
- Используйте JobInfo.Builder объект, чтобы создать JobInfo объект, который будет содержать критерии для JobScheduler запуска задания.
- Запланируйте задание с помощью JobScheduler.Schedule .
Реализация Жобсервице
Вся работа, выполняемая библиотекой планировщика заданий Android, должна быть выполнена в типе, расширяющем Android.App.Job.JobService абстрактный класс. Создание JobService с помощью платформы Android очень похоже на создание Service .
- Расширьте JobService класс.
- Снабдите подкласс атрибутом ServiceAttribute и задайте Name для параметра строку, которая состоит из имени пакета и имени класса (см. Следующий пример).
- Задайте Permission для свойства в ServiceAttribute строку android.permission.BIND_JOB_SERVICE .
- Переопределите OnStartJob метод, добавив код для выполнения работы. Android будет вызывать этот метод в основном потоке приложения для выполнения задания. Работа, которая требует больше времени на выполнение нескольких миллисекунд на поток, чтобы избежать блокировки приложения.
- По завершении работы объект JobService должен вызвать JobFinished метод. Этот метод JobService сообщает JobScheduler , что работа выполнена. Сбой вызова JobFinished приведет к JobService размещению ненужных требований на устройстве, что сократит время работы батареи.
- Рекомендуется также переопределить OnStopJob метод. Этот метод вызывается Android при завершении задания до его завершения и предоставляет JobService возможность правильно удалить все ресурсы. Этот метод должен возвращать значение true , если необходимо перепланировать задание, или false если не нужно повторно запускать задание.
Следующий код является примером простейшего JobService для приложения, использующего TPL для асинхронного выполнения некоторой работы:
Создание JobInfo для планирования задания
Приложения Xamarin. Android не создают экземпляр JobService напрямую, вместо этого они передают объект в JobInfo JobScheduler . JobScheduler Будет создан экземпляр запрошенного JobService объекта, планирование и запуск в JobService соответствии с метаданными в JobInfo . JobInfo Объект должен содержать следующие сведения:
- JOBID — это значение, которое используется для обнаружения задания в JobScheduler . Повторное использование этого значения приведет к обновлению всех существующих заданий. Значение должно быть уникальным для приложения.
- Жобсервице — это параметр , который явно определяет тип, который JobScheduler должен использоваться для выполнения задания.
Этот метод расширения демонстрирует создание JobInfo.Builder с помощью Android Context , например действия:
Мощная функция планировщика заданий Android — это возможность управлять выполнением задания или при условии, в каких условиях может выполняться задание. В следующей таблице описаны некоторые методы JobInfo.Builder , позволяющие приложению влиять на время выполнения задания.
Метод | Описание |
---|---|
SetMinimumLatency | Указывает задержку (в миллисекундах), которая должна наблюдаться перед выполнением задания. |
SetOverridingDeadline | Объявляет, что задание должно выполняться до истечения этого времени (в миллисекундах). |
SetRequiredNetworkType | Указывает требования к сети для задания. |
SetRequiresBatteryNotLow | Задание может выполняться, только если устройство не отображает предупреждение о низком уровне зарядки для пользователя. |
SetRequiresCharging | Задание может выполняться только при зарядки аккумулятора. |
SetDeviceIdle | Задание будет запущено, когда устройство занято. |
SetPeriodic | Указывает, что задание должно выполняться регулярно. |
SetPersisted | Задание должно перисист между перезагрузками устройства. |
SetBackoffCriteria Содержит некоторые рекомендации о том, как долго JobScheduler должно ожидать перед повторной попыткой выполнения задания. Существуют две части критерия перехода: задержка в миллисекундах (значение по умолчанию 30 секунд) и тип обратного отключения, который следует использовать (иногда это называется политикой отфильтра или повтором). Две политики инкапсулируются в Android.App.Job.BackoffPolicy перечислении:
- BackoffPolicy.Exponential — Политика экспоненциальной задержки увеличит начальное значение отхода экспоненциально после каждого сбоя. При первом сбое задания библиотека будет ожидать первоначальный интервал, указанный перед повторным планированием задания, — например, 30 секунд. При втором сбое задания библиотека будет ожидать не менее 60 секунд перед попыткой запуска задания. После третьей неудачной попытки библиотека будет ждать 120 секунд и т. д. Это значение по умолчанию.
- BackoffPolicy.Linear — Эта стратегия является линейной отработкой, что задание должно быть запланировано на выполнение через заданные интервалы (до тех пор, пока оно не будет выполнено). Линейная откладывание лучше всего подходит для работы, которая должна быть выполнена как можно скорее, или для проблем, которые будут быстро устранять себя.
Дополнительные сведения о создании JobInfo объекта см. JobInfo .
Передача параметров в задание через JobInfo
Параметры передаются в задание путем создания PersistableBundle , который передается вместе с Job.Builder.SetExtras методом.
Доступ к службам PersistableBundle осуществляется из Android.App.Job.JobParameters.Extras свойства в OnStartJob методе класса JobService .
Планирование задания
Чтобы запланировать задание, приложение Xamarin. Android получит ссылку на JobScheduler системную службу и вызовите JobScheduler.Schedule метод с JobInfo объектом, созданным на предыдущем шаге. JobScheduler.Schedule будет немедленно возвращать одно из двух целочисленных значений:
- Жобсчедулер. ресултсукцесс — задание было успешно запланировано.
- Жобсчедулер. ресултфаилуре — не удалось запланировать задание. Обычно это вызвано конфликтом JobInfo параметров.
Этот код является примером планирования задания и уведомления пользователя о результатах попытки планирования:
Отмена задания
Можно отменить все запланированные задания или только одно задание с помощью JobsScheduler.CancelAll() метода или JobScheduler.Cancel(jobId) метода:
Итоги
В этом руководство обсуждалось, как использовать планировщик заданий Android для интеллектуального выполнения работы в фоновом режиме. В нем обсуждалось, как инкапсулировать работу, которая должна быть выполнена в виде, JobService и как использовать, JobScheduler чтобы запланировать работу, указав критерии JobTrigger и способ обработки ошибок с помощью RetryStrategy .
Источник