Xizmatlar. Bilan / bo'lmasdan hayot. Va WorkManager.

Yaqinda Android-ning relizlari fon bilan shug'ullanadigan bo'lsa, u har qachongidan ham murakkablashdi. Yulduzli urushlar fitnasi singari, u tobora chalkashib bormoqda va shuning uchun Google WorkManager-ni JetPack-ning bir qismi sifatida chiqazdi - bizga bunday fonga yordam berish uchun.

WorkManager nima ekanligini bilib olishdan oldin - nima uchun bizga kerakligini va uni yaratishda nima sabab bo'lganligini tushunish kerak. Tarkiblar / kutubxonalar qalpog'i ostida nima bo'lishini biladigan va nima uchun undan foydalanishlarini tushunadigan ishlab chiqaruvchilar - bu eng yaxshi ishlab chiquvchilar.

Yaxshi dasturchi

Bu uzoq maqola, shuning uchun yaxshi chashka kofe va bir nechta pechene tayyorlang.
U 3 qismdan iborat:
1-qism - Xotira asoslari
2-qism - Mavjud fon echimlari
3-qism - WorkManager

Birinchidan, barcha fonga oid ishlarni boshlashdan oldin - Android operatsion xotirasini boshqarishning ba'zi asoslarini tushunishimiz kerak.
Va bu bizning birinchi qismimiz bo'ladi:

1-qism: Android xotirasi 101

Ilgari, uzoq galaktikada - birinchi marotaba Android yadrosi Linux-Kernelga asoslanib ishlab chiqilgan. Android va boshqa Linux-Kernel asosidagi tizimlarning asosiy farqi shundaki, Android-da "almashtirish maydoni" deb nomlangan narsa yo'q.

Linuxda almashish maydoni jismoniy xotira (RAM) miqdori to'lganda ishlatiladi. Agar tizim ko'proq xotira resurslariga muhtoj bo'lsa va operativ xotira to'lgan bo'lsa, xotiradagi faol bo'lmagan sahifalar almashish maydoniga o'tkaziladi. O'zaro almashish maydoni oz miqdordagi operativ xotira bilan ishlaydigan mashinalarga yordam berishi mumkin bo'lsa-da, uni ko'proq operativ xotiraga almashtirish sifatida ko'rib chiqmaslik kerak. O'zaro almashish maydoni jismoniy xotiraga qaraganda sekinroq kirish vaqtiga ega bo'lgan qattiq disklarda joylashgan

Android-da "O'zaro almashish" kabi narsa yo'q. Tizim xotira etishmayotganida, OOM Killer-dan galaktikani tejash uchun foydalanadi.

Xotiradan tashqarida qotil

Yigitning maqsadi - "ko'rish holati" va sarflangan xotira hajmiga qarab jarayonlarni o'ldirish orqali xotirani bo'shatish.

Har bir jarayon Faoliyat menejeri tomonidan oom_adj reytingini berdi. Bu ilova holatining birikmasi (masalan, old fon, orqa fon, xizmat doirasi va boshqalar). Bu erda barcha oom_adj qiymatlarining qisqa namunasi keltirilgan:

# Oom_adj qiymatlarini mumkin bo'lgan jarayonlar klassi uchun aniqlang
# yadro tomonidan o'ldirilgan. Ular ActivityManagerService-da qo'llaniladi.
    ro‘yxat ro‘yxati.FOREGROUND_APP_ADJ 0
    ro.PISIBLE_APP_ADJ 1
    ro.preprop.SECONDARY_SERVER_ADJ 2
    ro.PACKUP_APP_ADJ 2
    rop.HOME_APP_ADJ 4
    ro.HIDDEN_APP_MIN_ADJ 7
    ro.CONTENT_PROVIDER_ADJ 14
    ro.EMPTY_APP_ADJ 15

Om_adj yuqori qiymatlari yadroning oom o'ldiruvchisi tomonidan o'ldirilishi ehtimoli ko'proq. Joriy oldingi ilovada om_adj 0 dan iborat.

OOM qotil bepul xotira va om_adj chegaralariga asoslangan sozlanadigan qoidalardan foydalanadi. ya'ni qoidalar "agar bo'sh xotira Y1 bilan o'ldiring" deyiladi.

Shunday qilib, asosan, oqim quyidagicha bo'ladi:

Har bir jarayonga ballar berildiBarcha jarayonni adj_oom> 7 va xotira sarfi> 10 kb bilan o'ldiringXotira bo'shatiladi. Hozirda galaktika yaxshi qo'llarda.

Hozirga kelib, umid qilamanki, siz kamroq xotira iste'mol qilsangiz, muhim ishlarni bajarish uchun shuncha yaxshi imkoniyatga ega bo'lasiz.

Ikkinchi muhim fikr - bu dasturning holati zarurligini tushunish. Shunday qilib, sizning ilovangiz orqa fonda bo'lsa va siz Luqoni kosmosga yuborishni xohlasangiz, "Xizmatlar" dan foydalanishingiz kerak.

Xizmat - bu fonda uzoq vaqt davomida ishlaydigan operatsiyalarni bajaradigan dastur komponentidir va u foydalanuvchi interfeysini ta'minlamaydi.

Xizmatdan foydalanishning bir nechta sabablari bor:

1. Tizimga uzoq vaqtdan beri ishlayotganingizni ayting va jarayoningizni shunga qarab oom_adj balini oling

2. Android uchun 4 kirish joylaridan biri (BroadcastReceiver, Activity, ContentProvider - ulardan 3tasi).

3. Alohida jarayonda xizmat ko'rsatish

Ammo xizmatlardan foydalanishning qorong'u tomoni bor:

Men birinchi ilovamni yozganimda, 3 soatdan kam vaqt ichida batareyani 100% dan 0% gacha to'kishga muvaffaq bo'ldim. Qanday? Xizmatga ega bo'lish har 3 daqiqada serverdan ma'lumotlarni chiqarib oladi :)

Men yosh, tajribasiz padawan edim.

Ammo qandaydir yo'l bilan, 6 yildan so'ng, qandaydir tarzda noma'lum ilovalar mavjud bo'lib, ular qandaydir tarzda buni amalga oshira olishadi:

Har bir ishlab chiquvchi hech qanday cheklovlarsiz fonda xohlagan narsani qilardi. Bu Sith galaktikani boshqargan bir nechta Jedi ularni orqaga qaytarib yuborgan yirtqich G'arb edi.

Ammo Google bilan kurashish uchun yaxshi isyonchilar bor

Marshmallow-dan boshlab va undan keyin Nougat-dan so'ng Doze rejimi joriy qilindi:

Agar siz Doze rejimi bilan tanishmasangiz, siz haqiqatan ham shunday bo'lishingiz kerak. :) Xulosa qilib aytganda - foydalanuvchi qurilmaning ekranini o'chirgandan so'ng, uyquni to'xtatish rejimi tarmoqni yoqadi va o'chiradi, sinxronizatsiya, GPS, signalizatsiya va Wi-Fi skanerlash. Foydalanuvchi ekranni yoqish yoki zaryadlash qurilmasiga ulanmaguncha u yoniq turadi. G'oyasi - ahamiyatsiz ishlarni bajaradigan va bajariladigan ilovalar sonini kamaytirish, - foydalanuvchining batareyasini tejaydi :)

Ammo bu dengizda bir tomchi suv kabi tuyuldi va Google yanada uzoqlashdi - Android Oreo (API 26) dan boshlab.

Endi startService () usuli, agar Android 8.0-ga mo'ljallangan dastur fon xizmatlarini yaratishga ruxsat berilmagan vaziyatlarda ushbu usuldan foydalanishga harakat qilsa, IllegalStateException-ni tashlaydi.

Hech qachon SDK 26-ni nishonlamaslik bilan uni osonlikcha tuzatish mumkin. Ba'zi "taniqli" ilovalar ish vaqti bilan ishlashga ruxsat berishni istamagani uchun API 22-ni maqsad qilib qo'yishga qaror qilishdi.

Ammo ko'p narsalar kutilmoqda:

  • Avgust 2018: API-ning 26 (Android 8.0) yoki undan yuqori darajasiga mo'ljallangan yangi ilovalar.
  • Noyabr 2018: 26 yoki undan yuqori darajani maqsad qilish uchun zarur bo'lgan mavjud ilovalarning yangilanishlari.
  • 2019 yildan keyin: Har yili targetSdkVersion talabi oshadi. Har bir shirinlik chiqarilgandan keyingi bir yil ichida yangi ilovalar va ilovalar yangilanishlari mos keladigan API yoki undan yuqori darajaga yo'naltirilishi kerak.

Bularning barchasini aytib bo'lgandan so'ng (va siz aminmanki, siz ham shunday xulosaga kelasiz):

Bugungi kunda biz bilgan xizmat eskirgan.
Endi o'zining asosiy maqsadini, ya'ni uzoq vaqt davomida bajarilgan vazifani bajarishga ruxsat berilmaydi. Shuning uchun endi uni ishlatib bo'lmaydi.

Agar siz Xizmatni Oldingi xizmat sifatida ishlatmasangiz - xizmatdan foydalanish uchun hech qanday sabab yo'q. Agar siz unga bog'liq bo'lishingiz kerak bo'lsa - siz ishdan foydalanishingiz kerak.

2-qism: Menda tarmoq qo'ng'irog'i bor. U erda nima:

Shunday qilib, bir necha kilobayt yuklab oladigan oddiy tarmoq qo'ng'irog'ining misolini olaylik.

Birinchidan, eng to'g'ri yo'l (va noto'g'ri), bu sizning omboringizni / faoliyatingizni amalga oshirish uchun alohida ipga ega bo'lishdir.

Kirish stsenariysi haqida o'ylang. Siz foydalanuvchi elektron pochta, parol va kirish tugmachasini bosasiz. Foydalanuvchi tarmog'ida 3G sifatsiz va foydalanuvchilar liftda yurishadi.

Tarmoq qo'ng'irog'i qilinayotgan paytda - foydalanuvchilarga qo'ng'iroq qilishadi.

OkHttp dasturining tanaffus vaqti juda katta
connectTimeout = 10_000;
readTimeout = 10_000;
writeTimeout = 10_000;

Odatda, biz uchta tarmoq urinishlarini standart holiga keltiramiz.

Shuning uchun, eng yomon holatda: 3 * 30 = 90 soniya.

Endi savolga javob berishga harakat qiling -

Kirish amalga oshdimi?

Xo'sh, sizning ilovangiz orqa fonda bo'lsa ham, narsa - siz bilmaysiz. Biz bilib olganimizdek, siz tarmoq qo'ng'irog'ini tugatish, javobni qayta ishlash va foydalanuvchi login ma'lumotlarini saqlash uchun jarayoningiz jonli bo'lishiga ishonolmaysiz. Foydalanuvchi telefoni oflayn rejimda ishlashi va Internetga ulanishni yo'qotishi mumkinligi haqida gapirmasa ham bo'ladi.

Foydalanuvchi nuqtai nazaridan - "Men allaqachon elektron pochta manzilimni, parolimni kiritdim va kirish tugmachasini bosdim. Shuning uchun men allaqachon kirganman ”.
Agar yo'q bo'lsa, menga ishoning - foydalanuvchilar sizning UX-ning ikkita yomon tomonini o'ylashadi. Ammo bu UX muammosi emas, bu texnik.
Keyingi qadam siz o'ylagan bo'lishi mumkin - yaxshi, shuning uchun ilova fonda ishlayotganligi haqida xabar olgandan keyin men xizmatga o'taman. Ammo ... kuting. Siz qila olmaysiz !!! :(

Shunday qilib, bu erda JobScheduler yordamga keladi.

Ishni boshlash rejalashtirilgan. Kerakli vaqt kelganda - tizim MyJobService-ni ishga tushiradi va onStartJob () usulidagi barcha narsalarni bajaradi.
Nazariy jihatdan fikr yaxshi, ammo JobScheduler faqat min API 21-dan mavjud. Ammo ...
API 21 & 22-dagi JobScheduler juda yoqimsiz tarkibiy qismga ega.

Demak, siz JobScheduler-dan foydalanishingiz mumkin bo'lgan haqiqiy minSDK 23dan boshlanadi.

Sizning minSDKingizda <23 .. Keyin sizda JobDispatcher varianti mavjud

Kutmoq. Buning uchun Google Play xizmatlari kerak !!

Shuning uchun agar siz undan foydalanmoqchi bo'lsangiz, o'n millionlab foydalanuvchilarni qoldirasiz - barcha Amazon Fire, Amazon TV va yuzlab xitoylik ishlab chiqaruvchilar:

Shuning uchun ... JobDispatcher, ehtimol, yaxshi variant emas ... Demak AlarmManager? Takroriy uyg'otuvchi signallarni olovga o'rnatish va tarmoq qo'ng'irog'i muvaffaqiyatli bajarilganligini tekshirish va keyin uni qayta bajarishga urinib ko'ringmi?

Qo'ng'iroqlarni amalga oshirish uchun nolinchi kechikish vaqtini olish uchun O-qurilmalardagi eski xizmatlardan foydalanishni va xizmatlarni ishga tushirishni xohlasangiz nima bo'ladi?

JobIntentService Jedisga galaktikani saqlashga yordam berishi mumkin:

JobIntentService

Bu sizga odatiy IntentService bilan SDK-dan 26 dan past bo'lgan va SDK-26-da JobScheduler bilan ishlarni bajarish imkoniyatini beradi va u qo'llab-quvvatlash kutubxonasining bir qismidir.

Aaaaand ... Bu Android Oreo qurilmalarida ASAP qo'ng'iroqlarini amalga oshirishga yordam bermaydi ... Shunday qilib, biz boshlagan joyimizga qaytamiz:, ishlayotgan Android versiyasini boshqarish, fonda qo'ng'iroqlarni amalga oshirish va dastur fon bilan ishlayotganda ularni qayta sozlash qurilmaning holatiga asoslanib to'g'ri rejalashtirish moslamasi.

Gosh ... foydalanuvchilarning batareya quvvatini tejashga va foydalanuvchilarimizga ajoyib UX taqdim etishga tayyor bo'lgan yaxshi Jedi bo'lish juda qiyin ...

3-qism: WorkManager. Ishni bajarish oson bo'lishi kerakligi sababli.

Shunday qilib, qurilmaning turli holatlari uchun turli xil echimlar mavjud; Android versiyalari va Google Play xizmatlari qurilmalari bilan. Ehtimol, siz ushbu mashaqqatli ishni o'zingiz bajarishingiz va "nima va qanday" ga asoslangan turli xil echimlarni birlashtirishingiz kerak deb o'ylay boshlaysiz. Yaxshi narsa, Android platformasidagi odamlar bizning shikoyatlarimizni eshitishadi - va ular qutqarishga qaror qilishdi biz va butun galaktika Sithni qayta tiklashidan :)

Android-ning so'nggi I / O Android tizimida jamoa WorkManager-ni e'lon qildi:

WorkManager maqsadi tizimga asoslangan fonga ishlov berish uchun birinchi darajali API-ni taqdim etish orqali ishlab chiquvchilar tajribasini soddalashtirishdir. Ushbu ilova boshqa ish joyida bo'lmasa ham, ishlaydigan orqa fon ishlariga mo'ljallangan. Iloji bo'lsa, u ishni bajarish uchun JobScheduler yoki Firebase JobDispatcher-dan foydalanadi; agar sizning ilovangiz birinchi o'rinda bo'lsa, u hatto jarayonni bevosita o'zingiz bajarishga harakat qiladi.

Qoyil! Aynan shu narsa bizga kerak - bu aqldan fonni ijro etishning barcha variantlari uchun oddiy o'rash.

WorkManager kutubxonasi bir necha tarkibiy qismlarga ega:

WorkManager - argumentlar va cheklovlar bilan ishlashni qabul qiladi va uni bajaradi.

Worker - orqa fonda bajariladigan doWork () ni amalga oshirishning faqat bitta usuli bor. Bu sizning barcha asosiy vazifalaringiz bajariladigan joy. Iloji boricha sodda saqlashga harakat qiling.

WorkRequest - ish so'rovida qaysi ishchi dalillar va unga nisbatan cheklovlar (masalan, internet, zaryadlash) bilan bog'liqligini aniqlang.

WorkResult - muvaffaqiyat, muvaffaqiyatsiz, qayta urinib ko'ring.

Ma'lumotlar - Ishchi-ga / dan uzatiladigan doimiy / muhim juftliklarning to'plami.

Birinchidan, Worker kengaytirilgan yangi sinfini yarating va doWork () usulini bajaring:

Ushbu ishni bajarish uchun WorkManager-ning ikkinchi chaqiruvi:

WorkManager dam olish uchun g'amxo'rlik qiladi. Bu sizning ishingizni jalb qilish uchun eng yaxshi jadvalni tanlaydi; u barcha dalillarni, ish tafsilotlarini saqlaydi va ishingiz holatini yangilaydi. Siz hatto LiveData-dan foydalanib obuna bo'lishingiz mumkin:

WorkManager lib-ning arxitekturasi quyidagicha ko'rinadi:

Siz yangi ish yaratasiz va qaysi ishchi qanday cheklovlar ostida argumentlar bilan ishlashi kerakligini aniqlaysiz. WorkManager xonani ishlatib, ma'lumotlar bazasida ishlarni saqlaydi va darhol ishni boshlaydi. Bu eng yaxshi rejalashtiruvchini (Jobscheduler, JobDispatcher, GreedyScheduler, AlarmManager) ijrochisi va doWork () usulini tanlaydi. Natija LiveData orqali e'lon qilindi va natijani Argumentlar yordamida olish mumkin

Oddiy qilib aytganda.

Albatta, yana ko'p narsalar mavjud.

Vaqti-vaqti bilan ishlashni rejalashtirishingiz mumkin:

Siz ketma-ket ikkita yoki undan ortiq ishlarni zanjirlashingiz mumkin:

paralelda:

Va ularning orasini aralashtiring.

Eslatma: Siz davriy va bir martalik ishlarni zanjirga qo'shib bo'lolmaysiz.

WorkManager-da bajarishingiz mumkin bo'lgan juda ko'p narsalar mavjud: Ishni bekor qilish, Ishni birlashtirish, zanjirli ishlarni bajarish, dalillarni bir Workdan boshqasiga birlashtirish. Hujjatlarni o'rganishingizni so'rayman. Bu juda yaxshi misollar bor.

Haqiqiy hayot stsenariysi

Har 15 daqiqada foydalanuvchilarning manzilini kuzatib boradigan ilova yaratishimiz kerak.

Avval biz manzilni aniqlash uchun ish yaratamiz. Vazifalarni bajarishning ichki asynk usuli mavjud emas, chunki doWork () natijani beradi. SUCCESS, agar siz asW-ni asW-usulda () (masalan, GPS joylashishini so'rab) bajarishingiz kerak bo'lsa, siz Latch va boshqa mexanizmdan foydalanishingiz mumkin. bajarilishini blokirovka qilish:

Uni rejalashtiring:

Joylashuvni aniqlash bilan ishlashni tugatgandan so'ng, biz mandalni bo'shatamiz va, albatta, barcha tartibsizliklarimizni tozalaymiz:

LocationTracker-ni olgach, uni serverimizga yuklashimiz kerak - shuning uchun uni serverga yuklash uchun boshqa ish vaqtini rejalashtirmoqchimiz:

Va UploadWorkning o'zi:

Sodda ko'rinadimi? Va aslida - bu shunday.
Murakkabroq JobSchedulers / JobDispatcher / Ochko'zlik ijrochilarining qaynoq kodi. Siz ish yaratasiz, uni jadvalga kiritasiz va u bajariladi Oddiy qilib aytganda.

Xulosa

Oldingi / kelajakdagi Android-versiyalarda foydalanuvchilar batareyasini tejash istagi tufayli fonda ishlash yanada murakkablashadi.
Android jamoasi tufayli bizda fon bilan ishlashni yanada tabiiy va sodda qiladigan WorkManager mavjud.

Va oxirgi narsa.

Batareya qolmagan holda telefon qanday ko'rinadi?

.

.

.

.

.

****

O'qiganingiz uchun rahmat. Agar sizga yoqqan bo'lsa, iltimos, menga your ni bering va buni baham ko'ring. Fikr va mulohazalaringizni ham eshitishni yaxshi ko'raman :) Rahmat