Cykl życia aktywności Androida, wątek interfejsu, metody i kody HTTP, dobór kontrolek GUI oraz lokalne przechowywanie danych.
1.Użytkownik pracuje w aktywności aplikacji Android i obraca telefon z orientacji pionowej na poziomą. Która sekwencja metod cyklu życia wykona się w całości?
- A.onPause, onStop, onDestroy, onCreate, onStart, onResume— poprawna
- B.onPause, onStop, onRestart, onStart, onResume
- C.onPause, onResume, onCreate, onStart
- D.onStop, onDestroy, onCreate, onResume
Dlaczego: Zmiana orientacji jest zmianą konfiguracji: system musi załadować układ dopasowany do nowej orientacji, więc niszczy dotychczasową instancję aktywności i buduje ją od nowa. Kusząca odpowiedź z onRestart opisuje powrót z tła, gdzie aktywność nadal istnieje w pamięci i nie była niszczona. Częstym błędem jest też pominięcie onDestroy w sekwencji obrotu.
2.Aplikacja mobilna odtwarza muzykę i prowadzi listę zadań użytkownika. Które przyporządkowanie kodu do metody cyklu życia jest poprawne?
- A.Trwały zapis listy zadań do bazy w onDestroy, bo zawsze się wykona przed zamknięciem
- B.Trwały zapis listy zadań do bazy w onCreate, bo to pierwsza metoda po starcie
- C.Trwały zapis listy zadań w onStop, a wstrzymanie odtwarzania i zwolnienie GPS w onPause— poprawna
- D.Trwały zapis listy zadań w onSaveInstanceState, bo Bundle przechowuje dane na stałe
Dlaczego: onStop wykonuje się, gdy ekran przestaje być widoczny, i to tam należy oddać dane do bazy lub preferencji. onPause ma zawierać kod krótki, bo opóźnia pokazanie następnego ekranu, więc trafia tam wstrzymanie animacji, kamery i nasłuchu lokalizacji. Na onDestroy nie wolno liczyć, bo system może usunąć proces bez jego wywołania, a Bundle z onSaveInstanceState przeżywa tylko obrót ekranu, nie zamknięcie aplikacji.
3.Zalogowany uczeń próbuje przez API usunąć wpis należący do innego użytkownika. Serwer poprawnie rozpoznaje jego token, ale rola ucznia nie pozwala na tę operację. Jaki kod odpowiedzi powinien odesłać serwer?
- A.401 Unauthorized
- B.403 Forbidden— poprawna
- C.404 Not Found
- D.400 Bad Request
Dlaczego: Rozróżnienie sprowadza się do jednego zdania: 401 znaczy nie wiem, kim jesteś (brak lub wygasły token), a 403 znaczy wiem, kim jesteś, ale nie wolno ci. Tu tożsamość została ustalona, więc problemem są wyłącznie uprawnienia. Kod 400 dotyczy źle zbudowanego żądania, a 404 sytuacji, gdy zasobu pod danym adresem po prostu nie ma.
4.Aplikacja ma dodać do serwera zupełnie nowego ucznia, a serwer ma przydzielić mu identyfikator. Które żądanie i jaki kod odpowiedzi są dla tej operacji typowe?
- A.GET /api/uczniowie z danymi w adresie URL, w odpowiedzi kod 200
- B.PUT /api/uczniowie/12 z danymi w treści, w odpowiedzi kod 204
- C.DELETE /api/uczniowie z danymi w treści, w odpowiedzi kod 200
- D.POST /api/uczniowie z danymi w treści żądania, w odpowiedzi kod 201— poprawna
Dlaczego: W zestawie odpowiadającym operacjom CRUD tworzenie zasobu realizuje metoda POST kierowana na kolekcję, a nie na konkretny element, bo identyfikatora jeszcze nie znamy. Potwierdzeniem utworzenia jest kod 201 Created. PUT służy do zastąpienia zasobu, który już istnieje i ma znany adres, natomiast GET nie zmienia danych i nie przesyła treści żądania.
5.Rekord ucznia o identyfikatorze 12 zawiera pola imie, nazwisko, klasa i srednia. Aplikacja ma zmienić wyłącznie pole klasa, zostawiając pozostałe bez zmian. Które żądanie jest właściwe?
- A.POST /api/uczniowie z treścią { klasa: 3B }, bo POST aktualizuje dane
- B.PATCH /api/uczniowie/12 z treścią { klasa: 3B }, bo zmienia wybrane pola— poprawna
- C.PUT /api/uczniowie/12 z treścią { klasa: 3B }, bo PUT zmienia jedno pole
- D.GET /api/uczniowie/12?klasa=3B, bo parametr w adresie ustawia wartość
Dlaczego: PUT zastępuje cały zasób przesłaną wersją, więc wysłanie samego jednego pola może wyzerować lub usunąć pozostałe. Do modyfikacji części pól służy PATCH. POST tworzy nowy zasób i wywołany tak, jak w dystraktorze, powieli ucznia zamiast go poprawić, a GET z definicji nie zmienia stanu danych na serwerze, nawet gdy dopiszemy parametr do adresu.
6.Procedura obsługi kliknięcia przycisku wykonuje synchroniczne pobranie dużego pliku z serwera bezpośrednio w wątku interfejsu. Jaki będzie tego skutek?
- A.System sam przeniesie pobieranie do wątku roboczego, bo wykrywa operacje sieciowe
- B.Pobieranie przebiegnie szybciej, bo wątek interfejsu ma najwyższy priorytet
- C.Pętla zdarzeń stoi, okno nie odrysowuje się i nie reaguje, a Android zgłasza ANR— poprawna
- D.Aplikacja będzie działać płynnie, ale dane trafią do kontrolek z opóźnieniem
Dlaczego: Wątek interfejsu wykonuje po kolei trzy rzeczy: pobiera zdarzenia z kolejki, uruchamia procedury obsługi i odrysowuje kontrolki. Gdy utknie w długiej operacji, żadna z nich się nie dzieje, więc aplikacja wygląda na zawieszoną, a system po kilku sekundach pokazuje komunikat Application Not Responding. Poprawny wzorzec to praca w wątku roboczym i powrót na wątek interfejsu (runOnUiThread, Invoke, await) dopiero po to, by zaktualizować kontrolki.
7.Klient zamawia aplikację dla Androida i iOS: ma skanować kody kreskowe aparatem, działać bez internetu i być dostępna w sklepach, a budżet jest mocno ograniczony. Który wariant jest najlepszy?
- A.Aplikacja webowa otwierana w przeglądarce pod jednym adresem URL
- B.Dwie osobne aplikacje natywne: Kotlin w Android Studio i Swift w Xcode
- C.Aplikacja desktopowa w WPF instalowana na komputerze i telefonie
- D.Aplikacja wieloplatformowa, na przykład we Flutterze lub React Native— poprawna
Dlaczego: Wymagania rozstrzygają się parami: praca offline i dostęp do aparatu wykluczają aplikację webową, obecność w sklepie i jeden kod źródłowy przemawiają za rozwiązaniem wieloplatformowym. Dwie aplikacje natywne spełniłyby wymagania techniczne najlepiej, ale podwajają koszt wytworzenia i utrzymania, więc przy ograniczonym budżecie odpadają. Uzasadnienie punktuje się za powiązanie wymagania z cechą, a nie za samą nazwę technologii.
8.W formularzu zamówienia użytkownik musi wskazać dokładnie jeden z trzech sposobów płatności, a osobno może zaznaczyć dowolną liczbę dodatków. Jaki dobór kontrolek jest poprawny?
- A.Płatność: grupa pól wyboru (CheckBox); dodatki: przyciski opcji (RadioButton)
- B.Płatność: grupa przycisków opcji (RadioButton); dodatki: pola wyboru (CheckBox)— poprawna
- C.Płatność: pole tekstowe (TextBox); dodatki: lista rozwijana (ComboBox)
- D.Płatność: etykieta (Label); dodatki: grupa przycisków opcji (RadioButton)
Dlaczego: Kryterium jest wyłączność wyboru: przyciski opcji w jednej grupie wykluczają się wzajemnie, bo zaznaczenie jednego odznacza pozostałe, więc pasują do sposobu płatności. Pola wyboru są od siebie niezależne i można zaznaczyć zero, jedno albo wszystkie, co odpowiada dodatkom. Pole tekstowe dopuszcza literówki i wartości spoza listy, a etykieta służy tylko do wyświetlania tekstu i użytkownik jej nie edytuje.
9.Programista w kodzie procedury obsługi kliknięcia przycisku umieścił zapytanie SELECT do bazy oraz sprawdzenie, czy średnia mieści się w zakresie od 1 do 6. Jak ocenić ten kod z punktu widzenia podziału na warstwy i wzorca MVC?
- A.Poprawnie, bo kontroler w MVC z założenia zawiera zapytania SQL i widok
- B.Poprawnie, bo warstwa prezentacji odpowiada za walidację merytoryczną danych
- C.Błędnie: SQL należy do warstwy danych, a reguła zakresu do warstwy logiki— poprawna
- D.Błędnie: całość powinna trafić do modelu razem z definicją okna i kontrolek
Dlaczego: Warstwa prezentacji ma tylko przyjmować dane od użytkownika i pokazywać wyniki, dlatego nie zna SQL-a ani reguł biznesowych. Reguła zakresu ocen to logika, a zapytanie do bazy to warstwa danych. Taki podział pozwala przetestować logikę bez uruchamiania okna i wymienić bazę bez ruszania interfejsu. W MVC kontroler jedynie przyjmuje akcję i łączy model z widokiem, a model nigdy nie zawiera definicji kontrolek.
10.Aplikacja mobilna ma zapamiętać wybrany przez użytkownika motyw kolorystyczny oraz przechowywać kilka tysięcy zadań, po których trzeba filtrować i sortować. Jak dobrać sposób lokalnego przechowywania danych?
- A.Motyw i zadania w Bundle przekazywanym w onSaveInstanceState
- B.Motyw w bazie SQLite, a zadania w preferencjach jako jeden długi tekst
- C.Motyw w preferencjach (SharedPreferences), a zadania w bazie SQLite— poprawna
- D.Motyw i zadania w pliku tekstowym w pamięci zewnętrznej urządzenia
Dlaczego: Preferencje to magazyn par klucz-wartość przeznaczony do prostych ustawień, takich jak motyw czy język, i nie nadają się do dużych zbiorów. SQLite jest relacyjną bazą w jednym pliku, bez osobnego serwera, więc pozwala wyszukiwać, sortować i filtrować zapytaniami SQL. Bundle przeżywa tylko obrót ekranu i nie jest zapisem trwałym, a pamięć zewnętrzna jest współdzielona i wymaga dodatkowych uprawnień.