Odată, am împins postul "Do utilizatorii de Android au nevoie de ucigași? Soluția finală a problemei "este destul de superficială. Dar conceptele fundamentale nu pot fi descrise pur și simplu în două cuvinte. Și acum, ani mai târziu, la un nou nivel, programatorul Android se întoarce la întrebare.
Platforma Android este destul de unică în sensul că permite mai multor aplicații să lucreze simultan. Dezvoltatorii provin de la o altă platformă pot găsi modul în care funcționează, neașteptat. Înțelegerea multitasking-ului în Android este importantă pentru dezvoltarea de aplicații care să funcționeze bine și să se integreze cu restul platformei Android. Acest articol discută elementele de bază ale designului multitasking al aplicației Android, impactul acesteia asupra modului în care funcționează aplicațiile și modul în care puteți beneficia cel mai bine de caracteristicile unice ale sistemului Android.
Senior dezvoltator Android Dianne Hackborn (Dianne Hackborn)
Cerințe de proiectare
1. Nu este necesar ca utilizatorii să închidă aplicațiile când au terminat să lucreze cu ei. Acest lucru este tipic pentru computere, dar nu funcționează foarte bine într-un mediu mobil, unde este nevoie de reutilizarea frecventă pe termen scurt a multor aplicații pe tot parcursul zilei.
4. API-urile disponibile ar trebui să fie suficiente pentru a scrie aplicații Google integrate ca parte a filozofiei "toate aplicațiile sunt create egale". Aceasta înseamnă că redarea muzicii de fundal, sincronizarea datelor, navigarea prin GPS și descărcarea aplicațiilor ar trebui implementate utilizând aceleași API-uri disponibile pentru dezvoltatorii terți.
Primele două cerințe sunt în conflict unul cu celălalt.
Nu vrem ca utilizatorii să vă faceți griji cu privire la închiderea aplicațiilor, trebuie să vă prefaceți că toate aplicațiile funcționează întotdeauna. În același timp, dispozitivele mobile au restricții stricte în ceea ce privește utilizarea memoriei, astfel încât sistemul se va degrada sau chiar va eșua, deoarece acest principiu va necesita mai multă memorie RAM decât este disponibilă. În schimb, un computer desktop cu un fișier swap va începe pur și simplu să ruleze mai lent. Aceste limitări concurente au fost o motivație cheie în dezvoltarea Androidului.
Când se oprește aplicația?
O neînțelegere comună a multitasking-ului Android se află în contrast între proces și aplicație. În Android, nu sunt entități strâns legate.
Aplicațiile pot fi afișate utilizatorului, dar nu au un proces de lucru într-adevăr. Mai multe aplicații pot partaja procese sau o aplicație poate utiliza mai multe procese în funcție de nevoile acesteia; procesul (procesele) aplicației poate rămâne în Android chiar dacă această aplicație nu mai este activă și nu face nimic.
Faptul că puteți vedea că aplicația rulează nu înseamnă că aplicația rulează sau face ceva. Pur și simplu, sistemul Android a decis să nu ucidă procesul, ci să îl lase în cazul în care este necesar în viitor.
În plus, puteți lăsa aplicația o perioadă îndelungată pentru a vă întoarce la locul unde ați rămas, iar în acest timp, probabil Android poate să scape de un proces pentru a elibera resurse pentru alte nevoi.
Cheia înțelegerii modului în care aplicațiile procesează Android este că procesele nu se opresc în stare curată. Atunci când utilizatorul părăsește aplicația, procesul sa este stocat în fundal, permițându-i să continue să funcționeze (de exemplu, descărcarea unei pagini web), dacă este necesar, și imediat sare în prim-plan, atunci când revine utilizatorului sa. Atâta timp cât există suficientă memorie Android nu va ucide procesul, adică, acestea sunt «difuzate» tot timpul.
Desigur, deoarece există o cantitate limitată de memorie, Android trebuie să decidă când să scape de procesele care nu sunt necesare. Mai multe detalii aici sunt "Bazele creării aplicațiilor". Decizia de a termina procesul sau nu se bazează pe cât de important este procesul pentru activitatea curentă a utilizatorului și cât timp a fost ultima dată când procesul a fost necesar pentru utilizator.
După ce Android a stabilit că are nevoie să elimine procesul, o face cu cruzime, pur și simplu prin uciderea cu forța. În același timp, kernelul sistemului eliberează toate resursele, indiferent de cât de bine este scris cererea. Acest lucru simplifică operațiile de memorie și accelerează răspunsul la multe situații grave.
Dacă utilizatorul revine ulterior la aplicația care a fost ucisă, Android are nevoie de o modalitate de ao reporni în aceeași stare ca și ultima dată pentru a se potrivi principiului "toate aplicațiile rulează tot timpul" (toate aplicațiile rulează toate timpul). Acest lucru se realizează prin urmărirea părților aplicației (activităților) utilizatorului și prin relansarea acestora cu informații despre ultima stare. Această ultimă stare este generată de fiecare dată când utilizatorul părăsește această parte a aplicației (dar nu și când a fost ucisă).
Lucrare explicită în fundal
Deci, avem o modalitate prin care aplicațiile să funcționeze implicit în fundal, până când procesul este ucis de sistemul Android, ca parte a gestionării regulate a memoriei. Este bine pentru lucruri cum ar fi încărcarea paginilor web în fundal, dar ce despre cerințele mai complexe? Redați muzică în fundal, sincronizați datele, locațiile de pe pistă, ceasurile cu alarmă etc.
Există două instrumente principale: Receptoare și servicii de difuzare.
BroadcastReceiver
Mesajele difuzate (BroadcastReceiver) permit unei aplicații să funcționeze, pentru o perioadă scurtă de timp, în fundal, ca urmare a unui anumit eveniment. Poate fi folosit în mai multe moduri atunci când creați obiecte de nivel superior: de exemplu, AlarmManager permite aplicației să difuzeze la un moment dat și Localizatorul poate trimite un mesaj difuzat când detectează schimbări de locație interesante. Deoarece informațiile destinate receptorului fac parte din manifest, Android poate găsi și lansa aplicația chiar dacă nu funcționează; Desigur, dacă are deja propriul proces disponibil în fundal, mesajul difuzat poate fi transmis foarte eficient direct.
La procesarea transmisiei, aplicația primește o perioadă fixă de timp (în prezent 10 secunde) pentru a-și desfășura activitatea. Dacă nu se termină la ora specificată, atunci aplicația este considerată rea și procesul este imediat transferat în starea de fundal pentru a fi ucis dacă este nevoie de memorie.
Mesajele difuzate (BroadcastReceiver) sunt excelente pentru lucrări mici, ca răspuns la un eveniment extern, de exemplu prin trimiterea unui anunț către utilizator după trimiterea unui nou raport de localizare GPS. Ele sunt foarte ușoare, deoarece procesul de aplicare ar trebui să fie prezent în timp ce BroadcastReceiver este activ. Deoarece aceștia sunt activi pentru o perioadă limitată de timp, se pot garanta suficiente garanții că procesul lor nu va fi ucis în timpul execuției. Cu toate acestea, BroadcastReceiver nu este potrivit pentru sarcini de durată nedeterminată, de exemplu, lucrul cu o rețea.
Serviciile permit aplicației să efectueze operații de fundal pe termen lung. De fapt, există multe alte funcții pe care Serviciile le oferă, dar în acest context, scopul lor principal este să permită ca aplicația să continue să funcționeze în timp ce se află în fundal (adică nu în prim-plan), până la locul de muncă va fi executat. Aplicația însăși controlează când serviciul său rulează în mod explicit și când serviciul se oprește.
Gestionarea serviciului diferă de mesajele difuzate, deoarece un număr nelimitat de servicii pot solicita o lansare pe o perioadă nedeterminată de timp. Și este posibil să nu existe suficientă memorie RAM pentru a menține toate serviciile în desfășurare.
Dacă memoria RAM este prea mică, procesele care au servicii vor fi ucise imediat, deoarece acestea sunt procese de fundal. Cu toate acestea, dacă este necesar, Android își va aminti că aceste servicii doresc să rămână în funcțiune și să le repornească mai târziu, când devine disponibilă mai multă memorie (RAM). De exemplu, dacă un utilizator navighează la o pagină Web care necesită cantități mari de memorie RAM, Android poate ucide aceste servicii de fundal, cum ar fi sincronizarea până când acestea sunt servite browser-ul are nevoie în minte.
Serviciile pot organiza negocieri suplimentare care solicită un "prim plan", în timp ce serviciul merge la starea "nu mă ucide", însă trebuie să îl notificați pe utilizator că lucrează în mod activ. Acest lucru este util pentru servicii precum redarea muzicii de fundal sau navigația, în timp ce utilizatorul realizează că este activ. Când ascultați muzică, puteți vedea întotdeauna simbolul muzical în bara de stare. Android nu va încerca să ucidă aceste servicii, ci, ca un compromis, asigură că utilizatorul știe despre ele și că le poate opri în mod explicit, dacă se dorește.
Componente încorporate
Receptoarele și serviciile de difuzare încorporate permit dezvoltatorilor să creeze o gamă largă de operațiuni de fundal eficiente.
În Android 1.0, au fost folosite pentru a implementa aproape toate sarcinile de fundal:
- redați muzică dacă utilizatorul părăsi aplicația de pe player
- au repetat ceasurile de alarmă într-un program
- calendar cu notificare la momentul potrivit
- Descărcare fișier de fundal
- notificarea unui nou e-mail
- sincronizarea contactelor.
Pe măsură ce platforma a evoluat, aceleași componente de bază au fost folosite pentru a implementa multe oportunități noi pentru dezvoltatori:
- metode de introducere folosind IME
- widget-uri
- imagini de fundal vii etc.
postfață
În interviuri ulterioare cu dezvoltatorii platformei Diana Hakborn (Dianne Hackborn) la întrebarea „că echipa Android ar dori să facă în mod diferit la începutul platformei de dezvoltare?“, A observat că ar fi necesar inițial pentru a oferi platforma de control mai mare asupra aplicațiilor este foarte limitată în ceea ce privește acces la unele funcții ale sistemului.
Povestea lui Dianne Hackborn «Revendicarea piersicilor»
Citește mai mult ...
- Ai nevoie de criminalii Android? Rezolvarea finală a problemei
- Eclipse Tools Developer Android nu mai este suportat
- Înțelegerea ambalării APK în Android Studio 2.2
- Android Studio. Eroare la crearea cardului SD