130
Rozdział 4.
Kod aktywności StopwatchActivity
Kompletny kod aktywności StopwatchActivity
Poniżej przedstawiliśmy kompletny kod pliku StopwatchActivity.java.
Zaktualizuj ten plik w swojej aplikacji, by miał tę samą zawartość.
package com.hfad.stoper;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import java.util.Locale;
import android.os.Handler;
import android.widget.TextView;
public class StopwatchActivity extends Activity {
// Liczba sekund wyświetlana przez stoper
private int seconds = 0;
// Czy stoper działa?
private boolean running;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_stopwatch);
runTimer();
}
// Metoda uruchamia stoper po kliknięciu przycisku Start
public void onClickStart(View view) {
running = true;
}
// Metoda zatrzymuje stoper po kliknięciu przycisku Stop
public void onClickStop(View view) {
running = false;
}
Zmiennych seconds i running
używamy odpowiednio do
przechowywania liczby zmierzonych
sekund i informacji, czy aktualnie
stoper działa, czy nie.
Do aktualizacji stopera używamy innej
metody. Wywołujemy ją w momencie
tworzenia aktywności.
app/src/main
Stopwatch
Activity.java
Stoper
java
com.hfad.stoper
Ta metoda jest wywoływana
po kliknięciu przycisku Start.
Ta instrukcja uruchamia stoper.
Ta metoda jest wywoływana
po kliknięciu przycisku Stop.
Ta instrukcja zatrzymuje stoper.
Używamy tych trzech
dodatkowych klas,
więc musimy je zaimportować.
Cykl życia aktywności
131
jesteś tutaj
Kod aktywności (ciąg dalszy)
Zobaczmy, co się stanie, kiedy wykonamy ten kod.
// Metoda zeruje stoper po kliknięciu przycisku Kasuj
public void onClickReset(View view) {
running = false;
seconds = 0;
}
// Wyświetla w stoperze liczbę sekund
private void runTimer() {
final TextView timeView = (TextView)findViewById(R.id.time_view);
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
int hours = seconds/3600;
int minutes = (seconds%3600)/60;
int secs = seconds%60;
String time = String.format(”%d:%02d:%02d”, hours, minutes, secs);
timeView.setText(time);
if (running) {
seconds++;
}
handler.postDelayed(this, 1000);
}
});
}
}
Ta metoda jest
wywoływana
po kliknięciu
przycisku Kasuj.
Te instrukcje zatrzymują
stoper i zerują liczbę
zmierzonych sekund.
app/src/main
Stopwatch
Activity.java
Stoper
java
com.hfad.stoper
Tu używamy obiektu Handler
do przekazania kodu.
To wywołanie ponownie przekazuje kod
do wywołania z opóźnieniem 1 sekundy.
Ta instrukcja pobiera
referencję do widoku
tekstowego.
Ten fragment formatuje liczbę
sekund do postaci godzin,
minut i sekund.
Jeśli zmienna running ma wartość true,
to ta instrukcja inkrementuje wartość
zmiennej seconds.
Ta instrukcja wyświetla tekst w komponencie TextView.
Upewnij się, że zaktualizowałeś
kod swojej aktywności,
wprowadzając w nim wszystkie
pokazane zmiany.
Zrób to sam!
132
Rozdział 4.
Co się dzieje?
Co się dzieje w trakcie działania aplikacji?
Użytkownik decyduje się uruchomić aplikację.
Klika zatem ikonę aplikacji.
Android
Urządzenie
Użytkownik
Aplikacja tworzy intencję w celu uruchomienia tej aktywności przy użyciu
metody startActivity(intent).
Plik manifestu, AndroidManifest.xml, określa, którą aktywność należy wykonać
podczas uruchamiania aplikacji.
Android sprawdza, czy jest uruchomiony inny proces tej samej aplikacji,
a jeśli takiego nie ma, to tworzy nowy proces.
Następnie system tworzy nowy obiekt aktywności — w naszym przypadku będzie to
obiekt aktywności
StopwatchActivity
.
<xml>
</xml>
AndroidManifest.xml
Aplikacja 1
Proces 1
Android
1
2
3
Cykl życia aktywności
133
jesteś tutaj
Historii ciąg dalszy
4
5
Zostaje wywołana metoda onCreate() aktywności.
Kod
onCreate()
wywołuje metodę
setContnetView()
, określając używany układ,
a następnie uruchamia stoper, wywołując w tym celu metodę
runTimer()
.
Po zakończeniu wykonywania metody onCreate() na ekranie urządzenia zostaje
wyświetlony układ.
Metoda
runTimer()
określa tekst, który należy wyświetlić w widoku tekstowym na podstawie
wartości zmiennej
seconds
. Natomiast zmienna
running
pozwala jej określić, czy należy
inkrementować liczbę sekund, czy nie. Ponieważ zmienna
running
ma początkowo wartość
false
, liczba sekund nie jest inkrementowana.
StopwatchActivity
<xml>
</xml>
Układ
runTimer()
Urządzenie
StopwatchActivity
seconds=0
running=false
P
: Dlaczego Android uruchamia aplikację w odrębnym
procesie?
O
:
Ze względów bezpieczeństwa i dla zapewnienia stabilności.
Uniemożliwia to aplikacji uzyskanie dostępu do danych innych
aplikacji. Oprócz tego oznacza to, że jeśli aplikacja ulegnie awarii,
nie będzie to miało zgubnych konsekwencji dla innych aplikacji.
P
: Do czego służy metoda
onCreate()
? Nie prościej by
było umieszczać kod w konstruktorze?
O
:
Android musi przygotować środowisko na potrzeby
aktywności już po jej utworzeniu. Kiedy aktywność jest już gotowa,
Android wywołuje jej metodę onCreate(). To właśnie dlatego
kod przygotowujący ekran aplikacji jest wykonywany w metodzie
onCreate(), a nie w konstruktorze aktywności.
P
: Czy nie można by napisać w metodzie
onCreate()
pętli, która aktualizowałaby stoper?
O
:
Nie. Wykonywanie metody onCreate() musi się zakończyć
przed wyświetleniem ekranu aplikacji. Umieszczenie w niej
nieskończonej pętli uniemożliwiłoby zatem wyświetlenie układu.
P
: Metoda
runTimer()
wygląda na naprawdę złożoną.
Czy naprawdę trzeba wykonywać te wszystkie operacje?
O
:
Fakt, jest trochę skomplikowana, jednak za każdym razem,
gdy będziemy musieli zaplanować wykonanie kodu, używane
rozwiązanie będzie wyglądało podobnie do tego z metody
runTimer().
głupie pytania
Nie istnieją
Get Android Programowanie aplikacji. Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.