Activity — podstawowy komponent aplikacji Androida, reprezentujący jeden ekran z interfejsem użytkownika. System zarządza ekranami poprzez ścisły cykl życia — callbacki onCreate, onResume i onDestroy. Każde Activity jest deklarowane w AndroidManifest.xml i uruchamiane przez Intent. Więcej o historii Androida przeczytasz w oficjalnej dokumentacji Google.
Najważniejsze
Activity — kluczowy komponent aplikacji Androida, zapewniający okno do interakcji z użytkownikiem. Każde Activity zarządza osobnym ekranem: lista zadań, formularz logowania, podgląd zdjęcia. System Android tworzy Activity na żądanie i niszczy, gdy pamięć jest potrzebna innym aplikacjom.
Activity po raz pierwszy pojawiło się w Android 1.0 (2008) i pozostaje głównym blokiem budulcowym interfejsu. Według Google (2026), 98% aplikacji w Google Play zawiera co najmniej jedno Activity. W nowoczesnej architekturze Google zaleca jedno Activity z wieloma Fragment, jednak klasyczna wieloekranowa aplikacja pozostaje powszechną praktyką.
Activity stack (back stack) — stos zadań, który przechowuje historię przejść. Gdy użytkownik naciska „Wstecz”, bieżące Activity jest niszczone, a poprzednie przywracane. System zarządza stosem automatycznie, ale programista może kontrolować zachowanie przez launchMode i flagi Intent.
Cykl życia Activity — zestaw stanów i callbacków, przez które przechodzi ekran od utworzenia do zniszczenia. Zrozumienie Lifecycle jest krytyczne: nieprawidłowa praca ze stanami prowadzi do wycieków pamięci, utraty danych i awarii aplikacji.
System Android wywołuje callbacki w ścisłej kolejności. Programista nadpisuje potrzebne metody, aby inicjalizować zasoby, zapisywać dane i zwalniać pamięć. Każdemu callbackowi odpowiada para: onCreate ↔ onDestroy, onStart ↔ onStop, onResume ↔ onPause.
| Callback | Przeznaczenie | Działanie programisty |
|---|---|---|
| onCreate | Wywoływane przy tworzeniu Activity | Inicjalizacja UI, subskrypcja ViewModel |
| onStart | Activity staje się widoczne | Uruchamianie animacji, kamery, GPS |
| onResume | Activity otrzymuje fokus wejścia | Wznawianie wideo, timerów |
| onPause | Activity traci fokus | Zapisywanie szkiców, zatrzymywanie animacji |
| onStop | Activity ukryte przez inny ekran | Zwalnianie ciężkich zasobów |
| onDestroy | Activity jest niszczone | Czyszczenie subskrypcji, Closeable |
Wyróżnia się cztery stany Activity: Running (onResume aktywny), Paused (widoczne, ale bez fokusu), Stopped (niewidoczne), Destroyed (zniszczone). System może zabić Activity w stanie Stopped przy braku pamięci — dane należy zapisać w onSaveInstanceState.
Omówimy trzy kluczowe metody cyklu życia Activity z przykładem w Kotlinie. onCreate — punkt wejścia, wywoływany raz. Tutaj następuje powiązanie layoutu przez setContentView, inicjalizacja RecyclerView, subskrypcja LiveData. onStart — Activity staje się widoczne dla użytkownika. onResume — Activity otrzymuje fokus i jest gotowe do interakcji.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.rv_items)
recyclerView.layoutManager = LinearLayoutManager(this)
loadItems()
}
override fun onStart() {
super.onStart()
startLocationUpdates()
}
override fun onResume() {
super.onResume()
resumeVideoPlayer()
}
}W przykładzie onCreate inicjalizuje RecyclerView i ładuje dane. onStart uruchamia aktualizację geolokalizacji — zasób, który powinien działać tylko gdy ekran jest widoczny. onResume wznawia wideo zatrzymane w onPause. Takie rozdzielenie zapobiega zbędnej pracy w tle.
Każde Activity musi być zadeklarowane w pliku AndroidManifest.xml. Bez rejestracji system nie znajdzie ekranu i wyrzuci wyjątek ActivityNotFoundException. W manifeście określa się nazwę klasy, motyw, orientację, launchMode i filtry Intent.
<application
android:allowBackup="true"
android:label="@string/app_name"
android:theme="@style/Theme.MyApp">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".DetailActivity"
android:parentActivityName=".MainActivity" />
</application>Flaga exported określa, czy inne aplikacje mogą uruchamiać Activity. Dla głównego ekranu exported=true, dla wewnętrznych ekranów — false. Atrybut parentActivityName włącza standardową nawigację „W górę” (Up Navigation).
Intent — obiekt opisujący akcję do wykonania. W kontekście Activity Intent jest używany do uruchamiania innego ekranu z przesyłaniem danych. Intent może być jawny (wskazuje konkretną klasę) i niejawny (wskazuje akcję, system dobiera odpowiedni komponent).
// Jawny Intent — uruchomienie DetailActivity z danymi
val intent = Intent(this, DetailActivity::class.java).apply {
putExtra("item_id", itemId)
putExtra("item_name", itemName)
}
startActivity(intent)
// Odbieranie danych w DetailActivity
val itemId = intent.getLongExtra("item_id", 0L)
val itemName = intent.getStringExtra("item_name") ?: ""Do otrzymania wyniku z uruchomionego Activity używa się Activity Result API, który zastąpił przestarzały startActivityForResult. Nowe API jest typowo bezpieczne, deklaratywne i działa z Jetpack Compose.
private val getResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data?.getStringExtra("result_key")
}
}
fun openPicker() {
val intent = Intent(this, PickerActivity::class.java)
getResult.launch(intent)
}Przy obrocie ekranu lub zmianie konfiguracji Android odtwarza Activity — sekwencyjnie wywołuje onDestroy i onCreate. Bez zapisywania stanu użytkownik traci wprowadzone dane, pozycję scrolla i wybrane elementy. Do rozwiązania tego problemu Android udostępnia dwa mechanizmy: onSaveInstanceState i ViewModel.
onSaveInstanceState zapisuje proste dane w Bundle przed wywołaniem onDestroy. ViewModel z Jetpack wytrzymuje odtworzenie Activity i przechowuje dane w pamięci, co jest bardziej efektywne dla złożonych obiektów i zapytań sieciowych.
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ViewModel automatycznie zapisuje dane
viewModel.items.observe(this) { items ->
updateAdapter(items)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("scroll_position", recyclerView.computeVerticalScrollOffset())
}
}Nowoczesne podejście Google — architektura Single Activity z jednym Activity i wieloma Fragment. Aplikacja używa jednego MainActivity, a całą nawigację wykonuje Navigation Component przez NavHostFragment. Zalety: scentralizowana nawigacja, wspólny ViewModel na ekran, poprawna praca z Deep Links.
Jetpack Navigation Component automatyzuje pracę z back stack, animacje przejść i przesyłanie argumentów. NavHostFragment jest umieszczany w layout Activity, a graf nawigacji (NavGraph) opisuje wszystkie ekrany i połączenia między nimi. Takie podejście jest zalecane przez Google dla nowych projektów i zgodne z zasadami Material Design.
class MainActivity : AppCompatActivity() {
private val navController by lazy {
findViewById<NavHostFragment>(R.id.nav_host_fragment)
.navController
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Konfiguracja NavigationUI dla AppBar
setupActionBarWithNavController(navController)
}
override fun onSupportNavigateUp() =
navController.navigateUp() || super.onSupportNavigateUp()
}Często zadawane pytania
Activity — pełnoprawny ekran aplikacji z własnym cyklem życia. Fragment — część UI wewnątrz Activity, która przeżywa odtworzenie Activity i zależy od jego Lifecycle. Activity jest obowiązkowe, Fragment opcjonalny.
Nie ma ograniczeń. Każdy ekran zazwyczaj reprezentuje osobne Activity. Dla prostej aplikacji wystarczy jedno, dla wieloekranowych — od 5 do 20. Google zaleca jedno Activity z wieloma Fragment.
launchMode określa, jak Activity jest tworzone w stosie zadań. Cztery tryby: standard (tworzona jest nowa instancja), singleTop, singleTask (jedna instancja w zadaniu) i singleInstance (izolowane zadanie). Tryb określa się w AndroidManifest.xml.
Przez Intent — obiekt z ekstrami (putExtra), do których umieszcza się prymitywy, ciągi znaków, Parcelable lub Serializable. Do komunikacji zwrotnej używa się Activity Result API — nowoczesnego typowo bezpiecznego zamiennika startActivityForResult.
Configuration Change — odtworzenie Activity przy zmianie konfiguracji (obrót ekranu, zmiana języka, klawiatura). System wywołuje onDestroy → onCreate. Do zapisywania danych używa się onSaveInstanceState lub ViewModel z Jetpack.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również