Выполнение по расписанию андроид

Выполнение по расписанию андроид

Краткое описание:
Планировщик для выполнения системных задач по расписанию.

Описание:
Включайте сеть, профили, громкость, 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

Источник

Выполнение задач в бэкграунде

На Stackoverflow часто встречаются вопросы по выполнению на Android фоновых задач, в т.ч. и повторяющихся с заданным промежутком времени. Как правило, первое, что используется, это Service.

Такой подход в некоторых случаях может привести к тормозам и низкой скорости ответа пользовательского интерфейса. Расскажу когда так бывает и как с этим бороться…

Почему может «тормозить» Service

Каждое Android-приложение по-умолчанию запускается в отдельном процессе. В каждом процессе запускаются потоки (Thread). По-умолчанию все компоненты приложения (Activity, Service, BroadcastReceiver) запускаются в одном «main» потоке (он же UI-thread). Если внутри сервиса запустить, например, долгий сетевой вызов или какую-то тяжелую инициализацию, мы получим тормоза всего приложения, его интерфейса и, скорее всего, предложение сделать Force close… Впрочем, работа службы в том же потоке, что и остальное приложение, имеет свои плюсы — у вас есть доступ к элементам интерфейса. Если бы служба работала в другом потоке, доступ к UI у вас бы отсутствовал.

Что делать?

Для решения данной проблемы стоит для тяжелых задач использовать отдельный поток. На самом деле его даже не обязательно создавать внутри службы…

Для запуска задачи в отдельном потоке можно воспользоваться следующими средствами SDK:

  • создать Thread
  • использовать AsyncTask

Запускаем свой поток

Поток создать просто…

Все просто, но проблемы начинаются, когда после выполнения длинного задания нам захочется обновить UI.

В результате выполнения получим ошибку. «Чужой» поток попытался обратиться к UI! Как вылечить? Надо использовать Handler. Доработаем код…

AsyncTask — все проще

Для реализации подобных задач в Android SDK имеет встроенное средство — AsyncTask. Данный класс позволяет не думать о том, в каком потоке выполняется ваш код, все происходит автоматически. Рассмотрим пример выше переписанный на AsyncTask.

Метод doInBackground будет выполнен в отдельном потоке, результат его выполнения будет передан в метод onPostExecute, который, в свою очередь будет выполнен на UI-Thread’е
Следует помнить, что:

  • AsyncTask может выполняться лишь раз. Для повторного запуска нужно пересоздать класс;
  • execute() должен быть выполнен на UI-Thread’е.

А что делать, если задачу нужно выполнять регулярно, через определенные промежутки времени…

Таймер. Самый простой подход к периодическому запуску.

Java предоставляет Timer для запуска повторяющихся задач. Сделаем так, чтобы AsyncTask из предыдущего примера выполнялся раз в минуту…

Читайте также:  Андроид как миди клавиатура для пк

Стоит заметить, что все упрощается если «долгоиграющая» задача не требует доступ к UI. В этом случае не требуются ни Handler’ы, ни AsyncTask’и.

Кстати, у таймера есть еще метод scheduleAtFixedRate(). Различия между ним и schedule() описаны в документации.

Более гибкий способ. ScheduledThreadPoolExecutor.

Класс ScheduledThreadPoolExecutor указан как рекомендуемая альтернатива использованию Timer. Данный класс позволяет организовать пул потоков и планировать выполняемые задачи относительно него. Т.е. класс для организации очереди заданий один, но тем не менее он может выполнять одновременно несколько заданий, если это позволяет имеющееся количество доступных потоков. Более подробно о преимуществах — в документации.

Для каждого заплаированного задания доступен его «дескриптор» — ScheduledFuture с помощью которого можно, например, отменить выполнения одного конкретного задания не трогая весь остальной пул.

Задание со звездочкой. Велосипед. Thread, Looper, Handler.

А еще можно собрать свой велосипед поток с очередью.

Данный поток, будучи единожды запущенным, выполняется вечно. Для общения с ним (отправки заданий) можно использовать метод getHandler() для получения хандлера и дальнейшей отправкой «событий» в него. CountdownLatch используется для синхронизации, чтобы поток, желающий получить Handler, не получил его ранее того момента, когда поток-работник запустится и Handler буде создан.

Источник

Планировщик заданий Android

В этом руководство описано, как запланировать фоновую работу с помощью API планировщика заданий Android, который доступен на устройствах Android с Android 5,0 (уровень API 21) и более поздних версий.

Обзор

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

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

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

  • Службы с намерением — это отлично подходит для выполнения работы, однако они не дают возможности планировать работу.
  • Алармманажер — эти API-интерфейсы позволяют планировать работу только по расписанию, но не дают возможности реально выполнять работу. Кроме того, Алармманажер разрешает только ограничения на основе времени, что означает создание оповещения в определенное время или по истечении определенного периода времени.
  • Широковещательные приемники . приложение Android может настраивать широковещательные приемники для выполнения работы в ответ на события на уровне системы или намерения. Однако широковещательные приемники не предоставляют контроль над временем выполнения задания. Кроме того, изменения в операционной системе Android ограничивают, когда будут работать широковещательные получатели, или на виды работы, на которую они могут отвечать.

Существует два ключевых компонента для эффективного выполнения фоновой работы (иногда называемой фоновым заданием или заданием):

  1. Интеллектуальное планирование работы — важно, чтобы приложение выполняло работу в фоновом режиме, которое оно делает в качестве хорошего. В идеале приложение не должно требовать выполнения задания. Вместо этого приложение должно указать условия, которые должны быть выполнены для выполнения задания, а затем запланировать это задание с операционной системой, которая будет выполнять работу при соблюдении условий. Это позволяет Android запустить задание, чтобы обеспечить максимальную эффективность устройства. Например, сетевые запросы могут быть пакетными для одновременного выполнения, чтобы обеспечить максимальное использование нагрузки, связанной с сетью.
  2. Инкапсуляция работы . код для выполнения фоновой работы должен быть инкапсулирован в дискретный компонент, который может быть запущен независимо от пользовательского интерфейса и будет сравнительно простым в планировании, если по какой-либо причине не удается завершить работу.
Читайте также:  Андроид для bmw e83

Планировщик заданий 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 состоит из трех этапов.

  1. Реализуйте тип Жобсервице для инкапсуляции работы.
  2. Используйте JobInfo.Builder объект, чтобы создать JobInfo объект, который будет содержать критерии для JobScheduler запуска задания.
  3. Запланируйте задание с помощью JobScheduler.Schedule .

Реализация Жобсервице

Вся работа, выполняемая библиотекой планировщика заданий Android, должна быть выполнена в типе, расширяющем Android.App.Job.JobService абстрактный класс. Создание JobService с помощью платформы Android очень похоже на создание Service .

  1. Расширьте JobService класс.
  2. Снабдите подкласс атрибутом ServiceAttribute и задайте Name для параметра строку, которая состоит из имени пакета и имени класса (см. Следующий пример).
  3. Задайте Permission для свойства в ServiceAttribute строку android.permission.BIND_JOB_SERVICE .
  4. Переопределите OnStartJob метод, добавив код для выполнения работы. Android будет вызывать этот метод в основном потоке приложения для выполнения задания. Работа, которая требует больше времени на выполнение нескольких миллисекунд на поток, чтобы избежать блокировки приложения.
  5. По завершении работы объект JobService должен вызвать JobFinished метод. Этот метод JobService сообщает JobScheduler , что работа выполнена. Сбой вызова JobFinished приведет к JobService размещению ненужных требований на устройстве, что сократит время работы батареи.
  6. Рекомендуется также переопределить 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 .

Источник

Оцените статью