Mám ukážkovú aplikáciu s dvoma aktivitami. Rodič sa spustí pri spustení aplikácie a Dieťa sa spustí pomocou tlačidla v Rodič. Dieťa je nastavené s priehľadným pozadím, aby sa pri spustení dieťaťa rodič nezastavil.
Spustím aplikáciu, ktorá spustí Rodič, potom spustím Dieťa. Potom zariadenie uzamknem. Vidím, že dieťa volá onStop (), potom rodič zavolá onStop ().
Ak však namiesto uzamknutia aplikácie rotujemzariadenie, ktoré vyvolá zmenu orientácie, potom, keď uzamknem aplikáciu, zavolá iba dieťa, ktoré volá OnStop (). Keď aplikáciu odomknem a kliknem na tlačidlo Späť, potom Dieťa aj Rodič zavolajú onStop (), takže Rodičovská aktivita je v tomto čudnom stave, v ktorom nie je viditeľná, ale nazýva onStop ().
- Prečo sa to deje?
- Ako môžem prinútiť rodičov, aby zavolali na službu OnStop (), keď je zariadenie uzamknuté?
Vytvoril som jednoduchý projekt pre Android, ktorý demonštruje problém, ktorý vidím.
https://github.com/skykelsey/Rotation
odpovede:
1 pre odpoveď č. 1To je to, čo dostávam na zariadení Nexus 5 (Android 5.0.1), ak áno launch the app -> start ChildActivity -> rotate the device -> lock the device -> unlock the device
:
E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ChildActivity.onStop()
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: landscape
E/ROTATION﹕ ParentActivity.onStop()
E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: landscape
E/ROTATION﹕ ChildActivity.onStop()
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ParentActivity.onStop()
E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: portrait
E/ROTATION﹕ ChildActivity.onStop()
E/ROTATION﹕ ChildActivity.onStart()
E/ROTATION﹕ Orientation: landscape
E/ROTATION﹕ ParentActivity.onStop()
E/ROTATION﹕ ParentActivity.onStart()
E/ROTATION﹕ Orientation: landscape
t. j. nemôže reprodukovať problém, ktorý ste opísali. V skutočnosti je normálne, ak nevidíte onStop()
občas, pretože nie je zaručené, že bude volaná.
Uvedomte si, že táto metóda sa nemusí volať nikdy, v situáciách s nedostatkom pamäte, kde systém nemá dostatok pamäte, aby udržal proces vašej činnosti v prevádzke aj po vyvolaní metódy onPause ().
Prečítajte si tiež tabuľku životného cyklu aktivity uvedenú na tejto stránke:
Zvýraznený text znie ako
Všimnite si stĺpec „Killable“ v tabuľke vyššie -v prípade tých metód, ktoré sú označené ako usmrtiteľné, potom, čo táto metóda vráti proces, ktorý môže byť hostiteľom činnosti, môže systém kedykoľvek zabiť bez vykonania iného riadku jeho kódu. Z tohto dôvodu by ste mali pomocou metódy onPause () zapisovať do úložiska akékoľvek trvalé údaje (napríklad úpravy používateľov)..
To znamená, že ak vykonávaná operácia je dôležitá, mali by ste ju použiť onPause()
radšej než onStop()
.
Dúfam, že to pomôže.