Activity — co to jest, ekran aplikacji w Androidzie i jego Lifecycle

Autor: IT Sectr Opublikowano: 2026-02-22 Czas czytania: 7 min

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 — komponent Androida reprezentujący jeden ekran z UI. Zarządzane przez Lifecycle
  • Cykl życia obejmuje 6 callbacków: onCreate, onStart, onResume, onPause, onStop, onDestroy
  • Intent — mechanizm uruchamiania Activity i przesyłania danych między ekranami
  • Manifest — obowiązkowa rejestracja każdego Activity w AndroidManifest.xml
  • ViewModel — komponent Jetpack do przechowywania danych przy odtwarzaniu Activity

Czym jest Activity?

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

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.

CallbackPrzeznaczenieDziałanie programisty
onCreateWywoływane przy tworzeniu ActivityInicjalizacja UI, subskrypcja ViewModel
onStartActivity staje się widoczneUruchamianie animacji, kamery, GPS
onResumeActivity otrzymuje fokus wejściaWznawianie wideo, timerów
onPauseActivity traci fokusZapisywanie szkiców, zatrzymywanie animacji
onStopActivity ukryte przez inny ekranZwalnianie ciężkich zasobów
onDestroyActivity jest niszczoneCzyszczenie subskrypcji, Closeable

Stany Activity

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.

Metody cyklu życia: onCreate, onStart, onResume

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.

kotlin
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.

Deklarowanie Activity w AndroidManifest.xml

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.

xml
<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).

Uruchamianie Activity przez Intent

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).

kotlin
// 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.

kotlin
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)
}

Zapisywanie stanu przy odtwarzaniu

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.

kotlin
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())
    }
}

Architektura Single Activity i Jetpack

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.

kotlin
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

Czym Activity różni się od Fragment?

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.

Ile Activity może być w jednej aplikacji?

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.

Czym jest launchMode w Activity?

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.

Jak przesłać dane między Activity?

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.

Czym jest Configuration Change w Androidzie?

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

  • Activity — podstawowy komponent Androida reprezentujący jeden ekran z interfejsem użytkownika, zarządzany przez cykl życia
  • Cykl życia składa się z sześciu callbacków: onCreate, onStart, onResume, onPause, onStop, onDestroy — każdy ma ścisłe przeznaczenie
  • Intent zapewnia uruchamianie Activity i przesyłanie danych między ekranami przez jawne i niejawne wywołania
  • AndroidManifest.xml wymaga obowiązkowej rejestracji każdego Activity z podaniem nazwy, motywu, orientacji i filtrów
  • ViewModel z Jetpack przechowuje dane przy odtwarzaniu Activity, zastępując ręczne zapisywanie w onSaveInstanceState
  • Architektura Single Activity z Navigation Component — nowoczesny standard zalecany przez Google dla projektów Android
  • launchMode zarządza zachowaniem Activity w stosie zadań: od standardowego do singleInstance dla izolowanych ekranów

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.

Omów projekt

Przeczytaj również