Как да накараме работния мениджър на Google да работи за вас

Източник на изображението: https://ayusch.com

Помислете за някои случаи на използване, които срещаме в ежедневните си задачи за разработка на Android:

  1. Изтегляне на файлове с данни от отдалечен сървър за мобилна игра.
  2. Изтегляне на файлове от сървър.
  3. Синхронизиране на данни, събрани на мобилни устройства с бек-енд услуга, например: качване на анализи за сривове, регистрационни файлове и т.н. ...
  4. Архивиране на файлове на устройството в онлайн хранилище.

Какво е общото между тези случаи на употреба?

  • Всички те са продължителни задачи.
  • Те могат да бъдат отложени за изпълнение на фонова нишка, докато потребителят взаимодейства с приложението. Тези задачи не трябва да засягат ефективността на приложението.
  • Те могат да се стартират дори когато потребителят не взаимодейства с приложението.

Изпълнението на такива асинхронни задачи е много често в съвременните андроид приложения. Рядко се натъкваме на приложения, които не взаимодействат с нито една резервна услуга и работят напълно офлайн. Следователно, имайки това предвид, инженерите в Google разработиха много API за планиране на задачи за планиране на такива задачи за Android като Services, Services, Alarm Manager, Job Scheduler, GCM Network Manager, Firebase Job Dispatcher, преди да излязат с най-новата си информация (и според мен най-доброто) решение: Work Manager.

Work Manager, според мен, е най-добрият API, който Google разработва за Android през последните години. Но първо, нека обсъдим всички механизми за планиране, различни от ръководителя на работата, и да разгледаме техните плюсове и минуси. В крайна сметка ще обясня защо Work Manager превъзхожда повечето от съществуващите решения. Също така ще ви кажа кога да не използвате Work Manager.

В тази статия ще обсъдим тези 4 механизма за планиране, за да:

  1. Услуги
  2. Работен график
  3. GCM Network Manager
  4. Firebase Job Dispecher

Така че, нека започнем!

Услуги

Първи са услугите. Услугите съществуват оттогава, доколкото си спомням. Те са били идеалното решение за разработчиците за изпълнение на продължителни задачи като възпроизвеждане на музика, изтегляне на файлове, синхронизиране на данни, смачкване на активите на приложението ви за Android и много други. И въпреки че сега знаем, че има много по-добри и по-ефективни начини за изпълнение на тези задачи, услугите все още са много подходящи за някои случаи на използване, като например възпроизвеждане на музика на заден план с известие в лентата с известия.

Но за останалите случаи на използване сме изминали дълъг път и Android предостави много по-добри API-та, отколкото услуги за подобни задачи. Така че, нека да видим някои от проблемите с услугите:

  • По подразбиране услугите се изпълняват в основната нишка на приложението, в което са декларирани. Така че всички продължителни задачи като обработка на изображения, работа в мрежа или възпроизвеждане на MP-3 забавят работата на приложението и започваме да забелязваме трептения в потребителския интерфейс.
  • Трябва да използвате междупроцесова комуникация, за да говорите с нея, което е по-бавно, отколкото ако беше в същия процес като клиента.
  • Отстраняването на грешки е трудно, тъй като трябва да се привържете към различен процес.
  • Ако услугата ви се срине, тя се срива независимо от основния процес. Това също може да бъде предимство на моменти.
  • За дълги изпълняващи се задачи ще трябва да използвате нишки вътре в услугите, което прави реализацията все по-сложна.
  • Ако забравите да спрете услугата, ако дадена задача е завършена, тя може да продължи да работи във фонов режим и ще изтощи батерията.

Така че, макар услугите да са полезни за задачи като възпроизвеждане на музика с известия, това не е най-подходящото решение за дълги изпълнени задачи, което може да блокира основната нишка, като мрежи, тежки изчисления, възпроизвеждане на MP3 и т.н.

Планиращи работни места

API за планиране на задачи е въведен на ниво 21. API е ефективен за мрежови задачи и ще работи във фонов режим, ако са изпълнени критериите, посочени в JobInfo.Builder (), например когато устройството се зарежда, на празен ход, свързано с интернет и т.н. . Той също така ще се опита да обедини тези задачи заедно, за да спести системни ресурси. Освен това идва с логика за отстъпване и опит за повторно използване, ако дадена задача се провали по някаква причина.

Но той не е подходящ за работа без отлагане, като изтегляне на актив при натискане на бутон, което трябва да се случи веднага и да не се забави.

Другият недостатък и този, който притеснява повечето разработчици, е, че се поддържа само в API версии 21 и по-нови. Така че, няма да работи на устройства с Android, работещи на версии по-малки от 21, което е 15% към този момент.

GCM Network Manager

GCM Network Manager се предлага с цялата доброта на Job Scheduler с допълнителното предимство на обратна съвместимост. Вътрешно GCM Network Manager използва Job Scheduler за версия на API> 21. За версии <21 използва механизма за планиране на услугите на Google Play.

Той също така има възможност да планира еднократни задачи, както и периодични задачи. Следователно, тя премахва допълнителната задача за разсрочване на заданието от разработчика, която се изисква в Job Scheduler.

Но има някои слабости:

  • Тъй като използва механизма за планиране на Play Services, той ще работи само на устройства с инсталирани услуги за възпроизвеждане.
  • Когато услугите за игра се актуализират, заданията се заличават. Програмистът трябва да се погрижи отново да планира работата.
  • Не е подходящ за неотлагаеми задачи или задачи, които трябва да се изпълняват в определено време.
  • Google е оттеглил GCM на 10 април 2018 г. и той ще бъде премахнат напълно до 11 април 2019 г., следователно е препоръчително да не използвате повече GCM Network Manager.

Нека да разгледаме диспечера за работа на Firebase, който решава проблемите ни.

Firebase Job Dispecher

Firebase Job Dispatcher е библиотека с Android за планиране на фонови задания. Той поддържа обратна съвместимост до API версия 9.

Точно като GCM Network Manager, той използва механизма за планиране на услугите на Google Play, за да планира задачи. Ако устройството няма инсталирани услуги за възпроизвеждане, то използва Alarm Manager. За устройства с Android, работещи с API версия 21 или по-нова, той използва Job Scheduler.

Дотук добре. Той управлява обратна съвместимост, работи на устройства без Google Play Services и има еднократни, както и периодични задачи.

И така, защо да се занимавате с Work Manager, когато Firebase Job Dispatcher има всичко това?

Ами защото, когато тези API се използват неправилно, това води до източване на батерията. Така че, за да спести енергия, Android пусна много функции за пестене на енергия като Doze Mode, Doze в движение, ограничения за фонови услуги, App Standby Buckets и др. Така че, като разработчик, наша отговорност е да се възползваме от всичко това, за да гарантираме, че приложението ни остава ефективно на батерията на всички нива на API.

Това означава много код за спагети ако не друго. И така, позволете ми да ви запозная с най-новото допълнение към API за планиране в разработката на android:

Работен мениджър

Както вече споменах, работният мениджър според мен е един от най-добрите API, които Google пусна за Android през последните години. Той маркира всички полета, които очаквате от API за планиране, и има високо ниво на абстракция, така че не е нужно да се притеснявате за подробни детайли, като консумация на енергия, обработка на обратното и разсрочване.

Work Manager е подходящ за отложена, гарантирана работа на фона. Ключовите думи, върху които трябва да се съсредоточим тук, са отлагаеми и гарантирани.

Work Manager в Android няма да стартира вашите задачи веднага, но ще ги различава да бъдат изпълнени в момент, когато ограниченията, които споменавате, са изпълнени. Той също така взема предвид ограниченията на батерията. Освен това гарантира, че работата ще бъде изпълнена, дори ако вашето устройство се рестартира.

Ето страхотна диаграма, която очертава кога е идеално да използвате Work Manager във вашите приложения за Android:

Източник на изображения: Google

Както можете да видите, той е подходящ за отлагащи се задачи, които не трябва да се изпълняват в точно определен момент в бъдеще, като аларма или напомняне.

Предимства от използването на Work Manager:

  • Обратно съвместим до API 14
  • Добавете ограничения като мрежи, зареждане.
  • Може да планира еднократни или периодични задачи.
  • Можем да свързваме задачи заедно.
  • Гарантира изпълнение, дори ако устройството се рестартира.
  • Изпълнява задачи в оптимизирано време в бъдеще, като се има предвид батерията, наличността на мрежата.
  • Той е част от библиотеките на Android Jetpack и се препоръчва от Google: P

Подходящ е за задачи като изпращане на доклади за сривове към фонова услуга, синхронизиране на данни с уеб услуга, смазване на активите на приложението ви и т.н.

заключение

Work Manager, според мен, определено може да се използва за изпълнение на всички отлагаеми задачи във вашето приложение за Android.

Но ако задачата трябва да бъде изпълнена незабавно (възпроизвеждане на музика, изтегляне на файл), най-добре ще я изпълнявате с услуга на преден план (например: Пускане на музика и показване на известие за промяна на песни) или Download Manager (за изтегляне на файл).

Така че вече можете да продължите напред и да одитирате кода си за възможни замени с Work Manager. Добро място за стартиране биха били всички услуги, които създава приложението ви;)

Статията първоначално е публикувана тук.

Какво следва

В следващата публикация на Work Manager ще интегрираме Work Manager в приложение за Android и ще имаме практически поглед как да настроите и използвате Work Manager в Android. Така че, следете се!

* Важно *: Създадох SLACK работно пространство за мобилни разработчици, където можем да споделим нашите знания за всичко най-ново в Tech, особено в Android Development, RxJava, Kotlin, Flutter и цялостното мобилно развитие като цяло.
Кликнете върху тази връзка, за да се присъедините към отпуснатото работно пространство. Това е абсолютно безплатно!

Като това, което четете? Не забравяйте да споделите тази публикация във Facebook, Whatsapp и LinkedIn.

Можете да ме последвате в LinkedIn, Quora, Twitter и Instagram, където отговарям на въпроси, свързани с Mobile Development, особено Android и Flutter.