Cykl życia aplikacji na Androida – co to takiego?

Paweł Dedio Programowanie 2018-10-20

We wcześniejszych artykułach pisałem ogólnie o pracy programisty i różnych aspektach związanych z tym zawodem. Teraz czas przejść do konkretniejszych tematów. Chciałbym Wam przybliżyć, jak system Android działa z perspektywy programisty. Zaczniemy od czegoś, co jest absolutną podstawą tego systemu, czyli cyklu życia aplikacji. Czasami jest on dobrym przyjacielem, a często jest naszym utrapieniem i zapewne każdy programista przeklinał kiedyś Google za wprowadzenie takiego mechanizmu.

Zanim przejdziemy do konkretów, chciałbym zaznaczyć, że czasami będę musiał wprowadzić pewne uproszczenia tak, aby ułatwić odbiór tego tekstu przez osoby niezwiązane z programowaniem. W razie jakichkolwiek wątpliwości zachęcam do zostawienia komentarza.

Co to jest aktywność?

W tytule użyłem pewnego uproszczenia – tak naprawdę będziemy omawiać cykl życia Aktywności (eng. Activity). Oczywiście najpierw musimy się dowiedzieć, co to właściwie jest. Aktywność to najważniejsza rzecz każdej aplikacji. W uproszczeniu możemy przyjąć, że jest to każdy ekran, który zajmuje powierzchnię całego wyświetlacza telefonu. Za każdym razem, gdy otwieramy jakąś aplikację, to system uruchamia jej domyślną aktywność. Tak samo, gdy w niej klikniemy na jakiś przycisk, który przenosi nas na inny ekran, to pod spodem uruchamiana jest inna aktywność, która “przykrywa” tą obecnie prezentowaną. Aktywność można porównać do podstron serwisu internetowego. Przy starcie strony otwieramy podstronę o nazwie „index”, następnie otwieramy podstronę o nazwie „produkty” i tak dalej.

programowanie

Łatwo możemy wywnioskować że Aktywność jest ściśle związana z interfejsem użytkownika. Jest to praktycznie jedyna rzecz, którą użytkownik widzi po włączeniu aplikacji. W aktywności możemy umieszczać mnóstwo innych elementów takich, jak przyciski, obrazki, napisy i tak dalej. Za ich pomocą programista zapewnia dwustronną komunikację z użytkownikiem.

Czy system widzi naszą aktywność?

System oczywiście posiada informację o naszych aktywnościach. Android ciągle przekazuje do naszej aktywności informacje o aktualnym „stanie” aplikacji. Możemy przyjąć, że stan jest informacją o tym na jakim poziomie znajduje się obecnie aplikacja. Przykładowo, gdy użytkownik podczas korzystania z naszej aktywności zdecyduje się na jej zminimalizowanie, to system wyśle do nas informację, że nasza aplikacja przejdzie teraz do działania w tle. Taką samą informację dostaniemy również, gdy użytkownik powróci do naszej aplikacji.

Jakie wyróżniamy stany aplikacji?

cykl zycia aplikacji android

Słowo stan jest bardzo intuicyjne i można odebrać na wyczucie, o co tak właściwie chodzi. W ten sposób płynnie przechodzimy do głównego tematu tego artykułu – cyklu życia aktywności. Cykl ten to nic innego jak zebranie do kupy wszystkich możliwych stanów aplikacji, wraz z informacją jak i kiedy następuje zmiana poszczególnych stanów.

Wyróżniamy 4 najważniejsze stany:

  • Aktywny (eng. active) – występuje wtedy, gdy nasza aktywność jest widoczna na pełnym ekranie i jest to jedyna aplikacja jaką użytkownik ma obecnie otwartą
  • Zapauzowany (eng. paused) – występuje wtedy, gdy użytkownik uruchomi jakąś inną aplikację, jednak ta nie zasłania całego ekranu (nasza aplikacja jest nadal częściowo widoczna).
  • Zatrzymany (eng. stopped) – występuje, gdy użytkownik otworzy jakąś inną aplikację, która całkowicie przykryje naszą. Stan ten wystąpi również wtedy, gdy użytkownik zminimalizuje naszą aplikację.
  • Zniszczony (eng. destroyed) – Android dynamicznie zarządza pamięcią. W sytuacji, gdy mamy uruchomionych dużo aplikacji, to system może zniszczyć naszą aktywność, która jest w stanie zatrzymanym lub zapauzowanym (bardzo rzadko) w celu uzyskania dodatkowej pamięci. Przed całkowitym zniszczeniem naszej aplikacji system nas o tym powiadomi – jest to ostatni moment, kiedy możemy zapisać ważne dla użytkownika dane.

Jakie są zalety?

programowanie nauka komputer

To właśnie między innymi dzięki takiemu cyklowi życia Android zapewniał multitasking (uruchamianie wielu aplikacji jednocześnie) praktycznie od samego początku swojego istnienia. Każda uruchomiona aplikacja ładuje swoje dane do pamięci operacyjnej, której jak pamiętamy pierwsze telefony nie miały zbyt wiele. System pozwala na uruchomienie kilku programów jednocześnie, ale do momentu, kiedy jest wystarczająco dużo dostępnych zasobów. Jeśli zaczyna jej brakować, algorytmy decydują o zakończeniu konkretnego procesu.

Android tworzenie aplikacji problem

Tak jak wspominałem wcześniej, system informuje nas o tym, że zamierza zakończyć proces naszej aplikacji. W tym momencie możemy zapisać do specjalnego pakietu pamięci wszelkie informacje o stanie aktualnej aplikacji. Przykład? Jaki ekran przegląda użytkownik, co aktualnie widzi. W momencie, gdy użytkownik powróci do naszej aplikacji, system da znać, że teraz jest odpowiedni moment na przywrócenie poprzedniego stanu aplikacji. Uzyskamy również te dane, które zapisaliśmy przed zakończeniem procesu).

typ programowania programisty

Dzięki tak prostej sztuczce Android umożliwiał działanie kilku aplikacji jednocześnie nawet na urządzeniach z bardzo małą pamięcią operacyjną. Użytkownik powracając do jakiejś aplikacji nie wiedział, czy system cały czas utrzymywał jej działanie, czy może została ona uruchomiona ponownie. Ogólnie możemy napisać, że główną zaletą cyklu życia w takiej postaci jest umożliwienie systemowi na efektywne zarządzanie RAM, dzięki czemu nasz telefon działa szybciej.

Jakie są wady?

Jak wiadomo nie ma rozwiązań idealnych i wszystko ma swoje wady. W tym wypadku największym minusem jest poziom skomplikowania całego rozwiązania. O ile na początku, przy słabych urządzeniach, takie ścisłe zarządzanie zasobami miało sens, tak obecnie nie daje to aż tak dużej przewagi nad konkurencją. Nawet przy pisaniu prostych aplikacji musisz pamiętać o tych wszystkich przypadkach i metodach związanych z cyklem życia. Zobacz na diagram znajdujący się w oficjalnej dokumentacji Androida:

Możesz również przewinąć tamten artykuł i sam zobaczysz jaki jest długi. Jeśli wyjaśnienie jakiegoś zagadnienia wymaga tyle tekstu, to znaczy, że nie jest ono proste. Rozumiem dlaczego system wymaga od nas obsługi tych wszystkich przypadków, ale większość osób nie chce tego robić. Chcą po prostu napisać aplikację, która działa i nie interesuje ich, czy użytkownik ją zamknie, zminimalizuje lub wróci do niej po długiej nieobecności. Na szczęście Google zauważył niezadowolenie programistów i stopniowo wprowadza pewne biblioteki, które ukrywają przed programistą przebieg cyklu życia i biorą całą jego obsługę na siebie. Myślę, że za kilka lat cykl życia będzie niezauważalny z perspektywy przeciętnego programisty.

Uff, dotarliśmy do końca :). Mam nadzieję, że udało mi się ubrać całość w łatwe do przyjęcia słowa i zrozumieliście na czym to wszystko polega. Zachęcam do zadawania pytań w komentarzach. Zdaję sobie sprawę, że temat dla kogoś zielonego może być dość trudny, ale jestem tu po to, żeby ułatwić wam jego zrozumienie. Możecie również pisać, o czym chcielibyście przeczytać w przyszłych odcinkach. Za tydzień omówimy w jaki sposób definiujemy interfejs użytkownika. Zdradzę wam również tajemnicę dlaczego tak wiele aplikacji nie wspiera rotacji ekranu. Do zobaczenia tradycyjnie za tydzień!

motywacja praca programowanie

Zapraszam również na największe w Polsce forum dla programistów Android. Jeśli macie pytania odnośnie kariery jako programista – zapraszam do działu Kariera programowanie. Zachęcam również do przejrzenia działu Praca oraz zlecenia dla programistów – być może to właśnie tam znajdziesz swoją pierwszą pracę 😉

Poprzednie odcinki:

  1. Typowy dzień pracy programisty
  2. Wady pracy programisty
  3. Zalety pracy programisty
  4. [FAQ] Wszystko, co powinieneś wiedzieć jeśli interesuje Cię praca programisty
  5. Co mnie zdziwiło w programowaniu?
  6. Motywacje – w jaki sposób nie stracić zapału do programowania?
  7. Jaką firmę wybrać na początku kariery programisty?
  8. Jak wygląda rozmowa o pracę na stanowisko programisty?
  9. Jak zacząć programować?
  10. Skąd czerpać wiedzę o programowaniu?
  11. Początki programowania – jaką technologię wybrać?


  • Adam

    Szczerze, jako programista uważam że nie ma potrzeby upraszczania tak prostych rzeczy jak cykl życia. A skoro ktoś „nie chce tego robić. Chcą po prostu napisać aplikację, która działa i nie interesuje ich, czy użytkownik ją zamknie, zminimalizuje lub wróci do niej po długiej nieobecności” to sądzę że niech się za to nie zabiera, nie rozumiejąc podstaw działania aplikacji w danym OS – bo potem mamy zalew sklepów z aplikacjami chłamem niskiej jakości napisanych przez niedoświadczone osoby po kursie albo na początku studiów. Jeżeli komuś się „nie chce” to niech podejmie się zadań mało wymagających, programowanie wymaga myślenia i odpowiedniej wiedzy.

    • Paweł Dedio

      Nie do końca mogę się z tobą zgodzić. Uważam że nie ma potrzeby zbytnio komplikować danej technologii, każdy programista na pewno wolałby pisać mniej kodu i mieć pewność że to na pewno zadziała. Nie każda aplikacja wykorzystuje zalety jakie daje tak rozbudowany cykl życia.

      To tak jakby dawniej ktoś powiedział że nie ma potrzeby tworzenia języków z garbage collectorem bo jeśli ktoś nie umie zarządzać pamięcią to nie powinien się pchać do programowania.

      • Adam

        To nie jest żadne komplikowanie technologii. To są naprawdę proste rzeczy, jeżeli ktoś nie potrafi pojąć takich podstaw lepiej żeby nie próbował nic tworzyć bo przez właśnie takich pseudo-programistów którzy chcą zrobić sobie szybko i prosto apkę, sklepy są zasypane masą śmieci. Przykro mi, ale nie każdy może być programistą, bo tak naprawdę znajomość języka to jedno, ale sporą część odgrywa tutaj umiejętność nieszablonowego, analitycznego myślenia, przyswajanie jak i przetwarzanie informacji. Jeśli ktoś nie potrafi przyswoić takich podstaw, stworzenie jakiejkolwiek bardziej rozbudowanej od hello world aplikacji będzie dla takiej osoby czymś nie do pokonania.

        • Paweł Dedio

          No ale trochę zeszliśmy od tematu. Sam wspomniałeś że jeżeli ktoś się nie nadaje to i tak nie stworzy żadnej sensownej aplikacji. Więc dla czego nie ułatwiać życia innym programistą i eliminować pisanie zbędnego kodu?

  • Propozycja: dlaczego tak mało aplikacji wspiera tryb podzielnego ekranu? Bardzo mnie nurtuje to pytanie. Pozdrawiam.

  • Tomasz

    Propozycja na nastepny temat: sposob uzywania RAM przez android. Dlaczego przez dlugi czas wystarczalo 1gb, czemu 0.5gb to za malo, a jednak powstaja telefony z taka iloscia. Czemu 8gb nie daje sie w „pelni” wykorzystac. No i dlaczego programy zabijajace dzialajace apki powoduja wiecej problemow i porzytku.
    A dla mnie osobiscie, 100% metode na kontrole tego co android uruchamia z apek doinstalowanych. Mam na to kilka rozwiazan, a i tak nie daje mi to pelnej kontroli nad tym, aby po zainstalowaniu apki, nic z niej nie startowalo samo az sam jej palcem nie uruchomie… i nie zajmowalo RAMu i zasobow proca,.

  • Tomasz

    Brawo, cykl tekstow dotarl do naprawde interesujach tresci. Tak trzymac. Moze z tego kiedys powstanie ksiazka i ten jekst bedzie jej pierwszym rozdzialem?

    • Flaqs

      Pierwsze co pomyślałem to to, że z tego byłby fajny podręcznik 🙂 podpisuję się pod tym!

  • Flaqs

    Po każdym kolejnym Twoim artykule jeszcze bardziej niecierpliwie czekam na następny. Ten cykl jest genialnym pomysłem i mam nadzieję że będzie trwał jeszcze dłuuuuugo 🙂

    • Paweł Dedio

      Dzięki za słowa uznania. Może jest jakiś konkretny temat o którym chciałbyś przeczytać w jednym z przyszłych odcinków?

      • Flaqs

        Powiem tak. Z Javą się dopiero poznaje. Miałem do czynienia z kilkoma językami ale dość krótko i amatorsko. Jedyne gdzie dalej zaszedłem to VBA w Excelu, ale to dosyć wąska gałąź (chyba że się mylę). Cały czas szukam jakiejś książki, kursu czy czegokolwiek co będzie do mnie przemawiać w temacie Javy. Najlepiej coś gdzie od początku do końca będzie pisana jakaś aplikacja i podczas tego procesu będą wdrażane coraz to nowe rozwiązania. Taka forma nauki jest dla mnie najbardziej przyswajalna. Kojarzysz może coś takiego? Będę zobowiązany za każdą odpowiedź. Każdy kurs, który patrzyłem to mnóstwo niepowiązanych ze sobą przykładów. Chodzi mi i o takie holistyczne podejście krok po kroku. Z góry wielkie dzięki!

        • Gorfaster

          Osobiście przerabiam wideo kurs Javy pana Arka Włodarczyka oraz jednocześnie darmowy kurs tekstowy na javastart, jeśli nie rozumiem czegoś w jednym to przerabiam lekcję w drugim kursie 🙂 Jestem na programowaniu obiektowym ale w dalszej części kursu wideo będzie pisana aplikacja do kompresji plików. Także chyba polecam.

          • Flaqs

            Dzieki! Javastart właśnie patrzyłem. Napisane spoko ale właśnie te przykłady bez dalszej kontynuacji jakoś mnie bolą. Zobaczę ten kurs co poleciłeś.

          • Gorfaster

            Cieszę się że mogę pomóc 🙂 Ja przerabiam go na Udemy.

  • Ciekawe 🙂
    Znając życie, bardzo szybki rozwój to pewnie Google już wymyśliło jak się wyzbyć takich nieprzyjemnych rzeczy 🙂
    Swoją drogą, takimi rzeczami powinien zajmować się system i zarządzać aplikacją, sam ją rozpoznawać, itd. Konfigurowanie tego za każdym razem przez programistę jest naprawdę męczące. Nie śledziłem specjalnie jak wygląda programowanie na Andka, ale z logiki takie nasuwa się myślenie 😉

    • Paweł Dedio

      Jest kilka bibliotek (w tym oficjalna od Google) która pomaga to usprawnić. Dodatkowo większość programistów automatyzuje to w jak największym zakresie pisząc swój projekt więc w praktyce nie wygląda to aż tak źle.

      • No chyba, że tak 🙂