Atunci când o componentă de aplicație este pornită în absența altor componente de lucru. Android este Linux lanseaza un nou proces de aplicare, cu un singur fir de executie. În mod implicit, toate componentele unei singure aplicații care rulează într-un singur proces și un flux (numit „firul principal“). Dacă o componentă este pornită în prezența unui procedeu pentru această aplicație (deoarece există o altă componentă a aplicației), atunci componenta este pornit în proces și utilizează același fir. Cu toate acestea, este posibil să se organizeze executarea altor componente de aplicații în procese separate și pentru a crea un fir suplimentar pentru orice proces.
Acest document discută procesele de lucru și firele din aplicația Android.
În mod implicit, toate componentele aceleiași aplicații care rulează în același proces, și cele mai multe aplicații nu ar trebui să schimbe acest comportament. Cu toate acestea, dacă este necesar, pentru a controla în care procesul aparține unei componente specifice, acest lucru se poate face în fișierul manifest.
Înregistrarea manifest pentru fiecare tip de elemente componente -
element
Android poate opri procesul de la un moment dat, atunci când nu aveți suficientă memorie și este necesar să se alte procese care servesc utilizatorul în acest moment. Componente de aplicare de locuri de muncă care rulează în acest proces, se oprește în mod constant. Procesul pentru aceste componente este repornit atunci când lucrarea vine la ei.
Atunci când se decide cu privire la procesul de terminare, sistemul Android are o greutate de importanța lor în raport cu utilizatorul. De exemplu, mai probabil off procesele cuprinzând etapele care nu sunt afișate pe ecran, în comparație cu procedeul care cuprinde etapele vizibile. În consecință, soluția procesului de întrerupere depinde de componentele utilizate în proces. Mai jos vom discuta regulile, pe baza cărora decizia privind alegerea proceselor întreruptibilă.
Ciclul de viață al procesului
sistemul Android încearcă să păstreze procesul de aplicare cât mai mult posibil, dar în cele din urmă a trebuit să elimine procesele vechi pentru a recupera memoria pentru procese noi sau mai importante. Pentru a determina care procesează pentru a menține și pentru a șterge, sistemul plasează fiecare proces în „ierarhia de importanță“, bazată pe componentele care se execută în proces, precum și starea acestor componente. Procesele cu cel mai scăzut nivel de importanță excluse în primul rând, atunci următoarele procese sunt eliminate, și astfel nivelul de importanță. G. În măsura în care este necesar pentru a restabili resursele sistemului.
În ierarhia de importanță, există cinci niveluri. Lista de mai jos prezintă diferitele tipuri de procese, în ordinea importanței (primul proces este cel mai important și a eliminat ultimul):
- Procesul de prim-plan
Proces necesar pentru activitatea curentă a utilizatorului. Procesul este procesul de prim-plan, în cazul în care oricare dintre următoarele condiții:
- Acesta conține o acțiune de activitate. cu care utilizatorul interacționează cu (metoda cauzată Activitatea onResume ()).
- Acesta conține Serviciul. asociată cu acțiunea, cu care interacționează utilizatorul.
- Acesta conține Serviciul. care se realizează „în prim-plan“ - serviciu numit startForeground ().
- Acesta conține Serviciul. care efectuează una din ciclul de viață al callback (onCreate (). onStart () sau onDestroy ()).
- Acesta conține receptor BroadcastReceiver. care efectuează onReceive metoda ().
De obicei, în același timp, este de lucru doar un proces de câteva prim-plan. Ei au distrus doar în ultimă instanță în cazul în care memoria este atât de mică încât nu pot continua să lucreze împreună. De obicei, în acest moment dispozitivul a ajuns la o stare de partiție de memorie pe pagină, astfel încât interfața cu utilizatorul a răspuns la acțiunile utilizatorului, trebuie să ștergeți unele dintre procesele din prim-plan.
Procesele care nu conțin componentele din prim-plan, dar pot afecta afișajul de pe ecran. Procesul este considerat a fi vizibil dacă oricare dintre următoarele condiții:
- Acesta conține o acțiune de activitate. care nu este în prim plan, dar este vizibil pentru utilizator (numită metoda onPause ()). De exemplu, poate apărea această problemă în cazul în care acțiunea în prim-plan a casetei de dialog Executare, care vă permite să vedeți pasul anterior în spatele lui.
- Acesta conține Serviciul. asociate cu acțiuni vizibile sau acțiuni din prim-plan.
Procesul vizibil este considerat extrem de important, ar trebui să fie eliminate numai dacă doriți să salvați activitatea tuturor procesului de prim-plan.
Procedeul cuprinde etapele care nu sunt vizibile utilizatorului, în prezent (numite onStop () etapele metodei). Aceste procese nu au un impact direct asupra utilizatorului, iar sistemul le poate elimina în orice moment pentru a elibera memorie pentru un proces de prim-plan, sau un proces vizibil, un serviciu. De obicei, aceasta a făcut o mulțime de procese de fundal, astfel încât acestea sunt stocate în lista LRU (cel mai recent utilizate) pentru procesele care conțin cele mai recente acțiuni pe care utilizatorul a văzut, au fost eliminate ultimul. În cazul în care puse în aplicare în mod corespunzător metodele de acțiuni ale ciclului de viață și de acțiune salvează starea curentă, procesul de eliminare, această acțiune nu are niciun impact evident asupra experienței utilizatorului, astfel încât atunci când utilizatorul revine la această acțiune, restabilește toate elementele vizuale starea sa. Pentru informații despre salvarea și restaurarea statului vezi. Acțiuni în document.
Proces, care nu conțin componente de aplicație activă. Singurul motiv pentru a menține un proces de acest tip - stochează în memoria cache, care îmbunătățește următoarea componentă de pornire în acest proces. Sistemul elimină aceste procese de multe ori pentru a distribui uniform toate resursele sistemului procesului între cache și nucleul de bază cache.
Android proces de sistem se referă la cel mai înalt nivel în funcție de importanța componentelor active în proces la momentul actual. De exemplu, în cazul în care procesul include un serviciu și un efect vizibil, procesul este considerat evident, și nici un proces oficial.
Mai mult, rata de proces poate fi crescută, deoarece există alte procese care depind de ea. De exemplu, procesul de servire un alt proces nu poate avea un nivel sub nivelul procesului de servit. De exemplu, în cazul în care un furnizor de conținut în procesul de a servi clientul A în procesul B sau o afacere este asociat cu o componentă în procesul B, procesul A este întotdeauna considerat a fi mai puțin importantă decât procesul B.
Deoarece procesul de efectuare a serviciului, estimat proces la acțiunea de fond, acțiunea de mai sus, lansarea unei operațiuni pe termen lung, poate porni serviciul pentru operație, și nu doar pentru a crea un flux de lucru, mai ales în cazul în care operațiunea va lua măsuri mai lungi. De exemplu, acțiunea de a încărca imagini pe un site web trebuie să înceapă serviciul de descărcare, astfel încât sarcina să poată continua în fundal, chiar după ce utilizatorul se conectează din acțiune. Utilizarea serviciului se asigură că operațiunea va avea prioritate minimă „proces de serviciu“, indiferent de ceea ce se întâmplă cu acțiunea. Din acest motiv, receptoare trebuie să utilizeze serviciul, nu doar pentru a pune în fluxul de funcționare, consumatoare de timp pentru a efectua.
Atunci când aplicația pornește, sistemul creează fluxul de execuție a cererii, care este numit „principal“. Acest flux este foarte important, deoarece este responsabil pentru programarea evenimentelor din widget-urile corespunzătoare ale interfeței cu utilizatorul, inclusiv o reprezentare grafică a evenimentelor. El este, de asemenea, un flux în care aplicația interacționează cu componente ale unui set de instrumente personalizate de interfață Android (componente de pachete și android.widget android.view). În esență, fluxul principal - aceasta este ceea ce este numit uneori firul UI.
Sistemul creează un fir separat pentru fiecare instanță component. Toate componentele care sunt efectuate într-un singur proces, de a crea instanțe pe firul UI, iar apelurile de sistem sunt trimise în fiecare componentă a acestui flux. Prin urmare, metode care răspund la callback de sistem (cum ar fi metoda onkeydown () pentru a raporta acțiunile utilizatorului sau invers metoda ciclului de viață al apelului) sunt întotdeauna executate în fluxul unui proces de interfață cu utilizatorul.
De exemplu, atunci când utilizatorul apasă un buton de pe ecran, firul UI cererii dumneavoastră expediază o presă în widget-ul, care, la rândul său, stabilește butonul în jos și trimite o cerere de anulare a cozii evenimentului. fir UI elimină cererea din coadă și notifică widget-ul pe care el ar trebui să apară din nou.
Atunci când o aplicație efectuează o muncă intensă ca răspuns la o acțiune de utilizator, acest model de flux unic poate indica o performanță slabă atunci când aplicația este pusă în aplicare în mod incorect. Asta este, dacă totul se întâmplă pe firul UI, executarea operațiunilor pe termen lung, cum ar fi accesul la rețea sau de interogări de la baza de date, va bloca intreaga interfata de utilizator. În cazul în care debitul este blocat, nu poate fi procesată prin orice evenimente, inclusiv evenimentul de schimbare de afișare. Din punct de vedere al cererii de utilizator pare nu răspunde. Mai rău, în cazul în care firul UI este blocat mai mult de câteva secunde (în prezent, aproximativ 5 secunde), se afișează o casetă de dialog infama „nu răspunde.“ După aceea utilizator nemultumit poate ieși din aplicația și scoateți-l.
În plus, un set de instrumente de interfață de utilizator Andoid nu este fir în condiții de siguranță. Prin urmare, nu ar trebui să lucreze cu interfața cu utilizatorul a fluxului de lucru. Manipulând interfața cu utilizatorul trebuie să fie efectuată de la firul UI. Astfel, există doar două reguli pentru un singur fir model de Android:
- Nu blocați firul UI
- Nu contactați setul de instrumente Android interfața cu utilizatorul în afara firul UI
fluxuri de lucru
Datorită modelului de un singur fir-a descris mai sus pentru interfața cu utilizatorul dinamică a aplicațiilor, este foarte important să nu se blocheze firul UI. Dacă este necesar a efectua operațiuni durează este nevoie de ceva timp pentru a le efectua în fire separate ( „background“ sau „de lucru“ de flux).
De exemplu, următorul text este un cod de control de presare, care încarcă imaginea fluxului parțial și le afișează în ImageView widget:
La prima vedere, ar trebui să funcționeze bine, deoarece creează un nou fir să se ocupe de operațiunile de rețea. Cu toate acestea, se rupe a doua regula este un singur fir de model: nu se referă la un set de instrumente de interfață cu utilizatorul Android în afara firul UI - acest exemplu schimbă ImageView din fluxul de lucru în loc de firul UI. Acest lucru poate duce la incertitudine și comportament imprevizibil, care ar fi dificil de urmărit.
Pentru a rezolva această problemă Android oferă mai multe moduri de a accesa firul UI din alte fire. Mai jos este o listă de metode utile:
De exemplu, este posibil să se corecteze codul folosind metoda de mai sus View.post (Runnable):
Acum implementare este fir: operarea rețelei este realizată dintr-un singur flux în timp ce ImageView se execută de la firul UI.
Cu toate acestea, deoarece complexitatea acestui tip de cod poate deveni confuz și dificil de întreținut. În scopul de a gestiona interacțiuni mai complexe, cu fluxul de lucru poate fi utilizată metoda de manipulare a fluxului de lucru pentru prelucrarea mesajelor primite de la firul UI. Probabil cea mai bună soluție este de a extinde AsyncTask de clasă. care simplifică sarcinile de lucru care trebuie să interacționeze cu interfața cu utilizatorul.
Utilizarea AsyncTask
Metoda AsyncTask permite operarea asincronă în interfața cu utilizatorul. Acesta funcționează într-un fir de lucrător de blocare, iar apoi publicarea rezultatelor pe firul UI fără a fi nevoie de a procesa în mod independent, fluxuri și / sau manipulare.
Pentru utilizarea acestei metode, este necesar să se creeze și să pună în aplicare o metodă de subclasă AsyncTask de apel invers doInBackground (). care lucrează în firele de piscina de fundal. Ar trebui să realizeze metoda onPostExecute () pentru a actualiza interfața cu utilizatorul. care oferă rezultatul doInBackground () și se execută pe firul UI, astfel încât să puteți actualiza în siguranță interfața cu utilizatorul. Sarcina se face prin apelarea metodei execute () de la firul UI.
De exemplu, este posibil să se realizeze exemplul de mai sus, prin intermediul metodei AsyncTask, după cum urmează:
Acum, interfața cu utilizatorul este protejat și codul a devenit mai ușor, pentru că lucrarea este împărțită într-o parte, care trebuie să fie făcut în fluxul de lucru, iar partea care trebuie să fie făcut pe firul UI.
Citeste articolul AsyncTask. pentru a înțelege pe deplin utilizarea acestei clase. Iată o scurtă trecere în revistă a activității sale:
- Puteți specifica tipul de parametru, valorile punerii în aplicare și valoarea de referință final prin intermediul componentelor universale
- doInBackground (), metoda este executată automat în fluxul de lucru
- onPreExecute () metode. onPostExecute () și onProgressUpdate (), rula pe firul UI
- Valoarea returnată de doInBackground (). trimis la onPostExecute () metoda
- Poate provoca publishProgress () în orice moment doInBackground () pentru a efectua onProgressUpdate () pe firul UI
- Iov poate fi anulată în orice moment de la orice fir
Atenție! O altă problemă cu care s-ar putea întâlni atunci când se utilizează fluxul de lucru este reluat într-o acțiune imprevizibilă datorită unei schimbări de configurare în modul de execuție. (De exemplu, atunci când utilizatorul schimbă orientarea ecranului), care poate distruge fluxul de lucru. Pentru a vedea cum puteți salva un loc de muncă în timpul uneia dintre aceste reporniri și modul de a anula un loc de muncă în distrugerea acțiunii, studia codul sursă exemple Rafturi aplicații.
Metode de thread-safe
În unele situații metode puse în aplicare pot fi apelate din fire diferite și, astfel, trebuie să fie scrise cu fir de reținere.
Acest lucru se referă în primul rând la metodele care pot fi invocate la distanță, de exemplu, metodele în serviciul aferent. Când apelul metoda este implementată în clasa IBinder. originare din același proces, care se realizează IBinder. Metoda executată în apelantul firului. Cu toate acestea, atunci când un apel vine de la un alt proces, metoda este realizată într-un curent ales dintr-un bazin de fire, care sprijină sistemul în același proces ca și IBinder (nu este executat în interfața cu utilizatorul procesului de curgere). De exemplu, deoarece onBind () metoda va fi numit flux de serviciu, serviciul de interfață cu utilizatorul, metodele puse în aplicare în obiectul care returnează onBind () (de exemplu, o subclasă care pune în aplicare metode RPC) va fi numit de firele din piscină. Având în vedere că serviciul poate avea mai mulți clienți, mai multe fire din piscina poate utiliza simultan aceeași metodă IBinder. Prin urmare, metodele IBinder trebuie să fie puse în aplicare cu reținere a firului.
În mod similar, furnizorul de conținut poate primi cereri de date care provin dintr-un alt proces. Cu toate clasele ContentResolver ContentProvider și ascunde detaliile de gestionare a proceselor de interacțiune, metode ContentProvider. care răspunde la aceste solicitări, -methods interogare (). insera (). șterge (). actualizare () și gettype () -vyzyvayutsya de piscină fir furnizorul de conținut, nu fluxul de proces UI. Deoarece aceste metode pot fi invocate de orice număr de fluxuri simultan, acestea trebuie să fie, de asemenea, puse în aplicare cu reținere a firului.
interacțiune proces
Pentru a efectua aplicație IPC trebuie legată de serviciul prin bindService metoda (). Pentru mai multe informații, consultați secțiunea Servicii pentru dezvoltatori.
Urmărește @AndroidDev pe Twitter
Urmați Android Developers pe Google+
Check out Android Developers pe YouTube
Această clasă necesită nivel API-ul sau mai mare
Acest document este ascuns, deoarece nivelul API selectat pentru documentația este. Aveți posibilitatea să modificați nivelul API documentația cu selectorul de mai sus navigarea stanga.
Pentru mai multe informații despre specificarea nivelului API aplicație necesită, citiți Sprijinirea diferite Versiuni de platformă.