Dlaczego proces wywołania.killProcess (Process.myPid ()) to zły pomysł?

Czytałem kilka postów mówiących, że używanie tej metody jest "złe", nie powinno być używane, to nie jest właściwy sposób na" zamknięcie " aplikacji i nie tak działa android...

Rozumiem i akceptuję fakt, że Android OS wie lepiej ode mnie, kiedy jest odpowiedni czas, aby zakończyć proces, ale nie słyszałem jeszcze dobrego wyjaśnienia, dlaczego stosowanie metody killProcess() jest złe? W końcu - to część android API...

Wiem tylko, że wywołanie tej metody podczas inne wątki wykonują potencjalnie ważną pracę (operacje na plikach, zapis do DB, żądania HTTP, uruchomione usługi..) może być zakończony w środku, a to wyraźnie nie jest dobre. Wiem też, że mogę skorzystać z faktu, że "ponowne otwarcie" aplikacji będzie szybsze, ponieważ system może nadal "trzyma" w stanie pamięci od ostatniego użycia i killProcess() temu zapobiega.

Poza tym, zakładając, że nie mam takich operacji i nie obchodzi mnie, że moja aplikacja się załaduje są inne powody, dla których nie można użyć metody killProcess()?

Wiem o metodzie finish (), aby zamknąć działanie, więc nie pisz mi o tym, proszę.. finish() jest tylko dla Activity. nie do wszystkich aplikacji i myślę, że wiem dokładnie, dlaczego i kiedy go używać...

I jeszcze jedno-rozwijam również gry z frameworkiem Unity3D i eksportuję projekt do Androida. Kiedy dekompilowałem wygenerowany apk, byłem bardzo zaskoczony, aby dowiedzieć się, że źródło java kod stworzony z unity-implementacja metody Unity - Application.quit(), z Process.killProcess(Process.myPid()).

Application.quit() czy to dobry sposób na zamknięcie gry według poradników Unity3d (czy naprawdę? może się mylę i coś przeoczyłem), więc jak to się dzieje, że deweloperzy Unity framework, którzy wykonują bardzo dobrą pracę, jak się wydaje, zaimplementowali to w natywnym Androidzie do killProcess()?

Author: Igor Ganapolsky, 2012-06-14

5 answers

Kto powiedział wywołanie procesu.killProcess (Process.myPid ()) to zły pomysł?

Tak, pozwalanie OS zarządzać własną pamięcią jest najlepszą praktyką zarówno dla Ciebie, jak i Użytkownika korzystającego z aplikacji (szybsze ponowne otwarcie, mniejsze szanse na zamknięcie siły itp...).

Jednak zakładając, że wiesz na pewno, że nie przerywasz wątków lub innych operacji w tle i używasz tego wywołania w onDestroy() - nie widzę powodu, dla którego nie powinieneś go używać. Zwłaszcza, gdy jest to wywołanie API, a nie obejście, a Google nie wspomniało, że lepiej nie używać go w dokumentacji API.

 6
Author: Lior Iluz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-18 14:40:51

<rant>

W idealnym świecie, z doskonałym kodem i bibliotekami, nie musisz wywoływać Process.killProcess(Process.myPid()), A System operacyjny odpowiednio zabije Twoją aplikację. Na Bliskim Wschodzie zapanuje pokój, świnie będą latać, a problem wstrzymania zostanie rozwiązany.

Ponieważ te wszystkie rzeczy jeszcze się nie wydarzyły są chwile, kiedy trzeba wykonać taki 'zakazany' kod.

Ostatnio dla gry na Androida, którą zrobiłem, darmowa wersja korzystała z biblioteki reklam co utrzymałoby aplikację przy życiu, a także wyciek pamięci. Wersja płatna nie miała tego problemu, ponieważ nie było połączonych bibliotek reklam. Moim rozwiązaniem było dodanie przycisku Zakończ w menu głównym, który wykonał taki kod. Miałem nadzieję, że większość ludzi naciśnie ten Przycisk po zakończeniu i nie muszę się martwić, że to pochłonie pamięć. Wersja płatna, którą właśnie wykonałem finish() i została wykonana. (To było zanim zakupy w aplikacji dla Google były dostępne, więc musiałem dokonać płatnego i bezpłatnego Wersja, również mogli już naprawić problem i mogłem zaktualizować tę grę, ale naprawdę nie poszło zbyt dobrze i wątpię, aby jakikolwiek czas spędzony na niej był tego wart) {]}

To tak jak w podstawówce / Gimnazjum mówią ci, że nie możesz wziąć pierwiastka kwadratowego z liczby ujemnej. Później w klasie algebry wyższego poziomu mówią... cóż, możesz wziąć pierwiastek kwadratowy z liczby ujemnej, ale masz dziwne wyniki, ale to jest spójne i rozwiązuje problem.

W innych słowa, nie wykonuj "zakazanego" kodu, chyba że wiesz, co robisz.

</rant>

 11
Author: Russ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-23 19:11:39

Cóż, Unit3d najprawdopodobniej używa kodu natywnego, a oni zabijają proces jako zabezpieczenie -- nie chcą wyciekać pamięci. Można się spierać, czy jest to dobry pomysł, czy nie, ale fakt, że go używali, nie oznacza, że ty też powinieneś.

Być może istnieją skrajne przypadki, w których chciałbyś użyć killProcess(), ale zazwyczaj system operacyjny robi to za Ciebie, zgodnie z aktualnym obciążeniem i użytkowaniem. Nie wiesz, jakiej odpowiedzi szukasz-masz świadomość, że korzystając z killProcess() może zepsuć rzeczy, chyba że możesz uzasadnić jego użycie, nie używaj go.

 9
Author: Nikolay Elenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-15 06:05:22

Oto dwie sytuacje, w których killProcess ugryzie cię i nie zadziała zgodnie z życzeniem:

1) Sticky Services - uruchomią się automatycznie, nawet jeśli zabiłeś proces

2) Timer - jeśli zaplanowałeś uruchamianie wątków na timerze, będą one kontynuowane po zabiciu procesu

Stąd, jak widać, są sytuacje, w których * * killProcess* nie jest rozsądnym rozwiązaniem, aby oczyścić działającą aplikację.

 1
Author: Igor Ganapolsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-03 16:18:40

To zły pomysł. po pierwsze, twoja aktywność nie będzie warta oprzyrządowania, ponieważ te struktury rejestrują wszystkie metody cyklu życia i dopiero po czystym wykonaniu zgłaszają status sukcesu testu. jeśli zabijesz proces spod aplikacji testowej, zgłosi on awarię i nie będzie jasne, że tak się dzieje.

 0
Author: yrizk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-03 15:20:51