Activity — τι είναι, οθόνη εφαρμογής στο Android και ο Lifecycle του

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-02-22 Χρόνος ανάγνωσης: 7 λεπ

Activity — το βασικό component μιας εφαρμογής Android, που αντιπροσωπεύει μια οθόνη με διεπαφή χρήστη. Το σύστημα διαχειρίζεται τις οθόνες μέσω ενός αυστηρού κύκλου ζωής — callbacks onCreate, onResume και onDestroy. Κάθε Activity δηλώνεται στο AndroidManifest.xml και εκκινείται μέσω Intent. Διαβάστε περισσότερα για την ιστορία του Android στην επίσημη τεκμηρίωση της Google.

Κύρια σημεία

  • Activity — component Android που αντιπροσωπεύει μια οθόνη με UI. Διαχειρίζεται μέσω Lifecycle
  • Κύκλος ζωής περιλαμβάνει 6 callbacks: onCreate, onStart, onResume, onPause, onStop, onDestroy
  • Intent — μηχανισμός εκκίνησης Activity και μεταφοράς δεδομένων μεταξύ οθονών
  • Manifest — υποχρεωτική καταχώρηση κάθε Activity στο AndroidManifest.xml
  • ViewModel — component Jetpack για διατήρηση δεδομένων κατά την αναδημιουργία Activity

Τι είναι το Activity;

Activity — το βασικό component μιας εφαρμογής Android, που παρέχει ένα παράθυρο για αλληλεπίδραση με τον χρήστη. Κάθε Activity διαχειρίζεται μια ξεχωριστή οθόνη: λίστα εργασιών, φόρμα σύνδεσης, προβολή φωτογραφίας. Το σύστημα Android δημιουργεί το Activity κατόπιν αιτήματος και το καταστρέφει όταν η μνήμη χρειάζεται για άλλες εφαρμογές.

Το Activity εμφανίστηκε για πρώτη φορά στο Android 1.0 (2008) και παραμένει το κύριο δομικό στοιχείο της διεπαφής. Σύμφωνα με την Google (2026), το 98% των εφαρμογών στο Google Play περιέχει τουλάχιστον ένα Activity. Στη σύγχρονη αρχιτεκτονική, η Google συνιστά ένα Activity με πολλά Fragment, αλλά η κλασική εφαρμογή πολλαπλών οθονών παραμένει κοινή πρακτική.

Activity stack (back stack) — η στοίβα εργασιών που αποθηκεύει το ιστορικό πλοήγησης. Όταν ο χρήστης πατά „Πίσω“, το τρέχον Activity καταστρέφεται και το προηγούμενο αποκαθίσταται. Το σύστημα διαχειρίζεται αυτόματα τη στοίβα, αλλά ο προγραμματιστής μπορεί να ελέγξει τη συμπεριφορά μέσω launchMode και σημαιών Intent.

Κύκλος ζωής Activity

Ο κύκλος ζωής του Activity — το σύνολο καταστάσεων και callbacks μέσα από τα οποία περνά η οθόνη από τη δημιουργία έως την καταστροφή. Η κατανόηση του Lifecycle είναι κρίσιμη: η λανθασμένη εργασία με καταστάσεις οδηγεί σε διαρροές μνήμης, απώλεια δεδομένων και crashes εφαρμογής.

Το σύστημα Android καλεί τα callbacks σε αυστηρή σειρά. Ο προγραμματιστής παρακάμπτει τις απαραίτητες μεθόδους για να αρχικοποιήσει πόρους, να αποθηκεύσει δεδομένα και να ελευθερώσει μνήμη. Κάθε callback έχει ένα ζεύγος: onCreate ↔ onDestroy, onStart ↔ onStop, onResume ↔ onPause.

CallbackΣκοπόςΕνέργεια προγραμματιστή
onCreateΚαλείται κατά τη δημιουργία ActivityΑρχικοποίηση UI, εγγραφή σε ViewModel
onStartΤο Activity γίνεται ορατόΈναρξη κινούμενων σχεδίων, κάμερας, GPS
onResumeΤο Activity λαμβάνει εστίαση εισόδουΣυνέχιση βίντεο, χρονοδιακοπτών
onPauseΤο Activity χάνει εστίασηΑποθήκευση προχείρων, διακοπή κινούμενων σχεδίων
onStopΤο Activity κρύβεται από άλλη οθόνηΑπελευθέρωση βαρέων πόρων
onDestroyΤο Activity καταστρέφεταιΚαθαρισμός εγγραφών, Closeable

Καταστάσεις Activity

Διακρίνονται τέσσερις καταστάσεις Activity: Running (onResume ενεργό), Paused (ορατό αλλά χωρίς εστίαση), Stopped (μη ορατό), Destroyed (κατεστραμμένο). Το σύστημα μπορεί να σκοτώσει το Activity σε κατάσταση Stopped όταν υπάρχει έλλειψη μνήμης — τα δεδομένα πρέπει να αποθηκευτούν στο onSaveInstanceState.

Μέθοδοι κύκλου ζωής: onCreate, onStart, onResume

Ας εξετάσουμε τρεις βασικές μεθόδους του κύκλου ζωής Activity με ένα παράδειγμα σε Kotlin. onCreate — σημείο εισόδου, καλείται μία φορά. Εδώ γίνεται η σύνδεση layout μέσω setContentView, η αρχικοποίηση RecyclerView, η εγγραφή σε LiveData. onStart — το Activity γίνεται ορατό στον χρήστη. onResume — το Activity λαμβάνει εστίαση και είναι έτοιμο για αλληλεπίδραση.

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

Στο παράδειγμα, το onCreate αρχικοποιεί το RecyclerView και φορτώνει δεδομένα. Το onStart ξεκινά την ενημέρωση γεωτοποθεσίας — έναν πόρο που πρέπει να λειτουργεί μόνο όταν η οθόνη είναι ορατή. Το onResume συνεχίζει το βίντεο που σταμάτησε στο onPause. Αυτός ο διαχωρισμός αποτρέπει περιττή εργασία στο παρασκήνιο.

Δήλωση Activity στο AndroidManifest.xml

Κάθε Activity πρέπει να δηλώνεται στο αρχείο AndroidManifest.xml. Χωρίς καταχώρηση, το σύστημα δεν θα βρει την οθόνη και θα ρίξει εξαίρεση ActivityNotFoundException. Στο manifest καθορίζονται το όνομα κλάσης, το θέμα, ο προσανατολισμός, το launchMode και τα φίλτρα 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>

Η σημαία exported καθορίζει αν άλλες εφαρμογές μπορούν να εκκινήσουν το Activity. Για την κύρια οθόνη exported=true, για εσωτερικές οθόνες — false. Η ιδιότητα parentActivityName ενεργοποιεί την τυπική πλοήγηση „Πάνω“ (Up Navigation).

Εκκίνηση Activity μέσω Intent

Intent — ένα αντικείμενο που περιγράφει μια ενέργεια προς εκτέλεση. Στο πλαίσιο του Activity, το Intent χρησιμοποιείται για την εκκίνηση μιας άλλης οθόνης με μεταφορά δεδομένων. Το Intent μπορεί να είναι ρητό (δείχνει σε συγκεκριμένη κλάση) και σιωπηρό (δείχνει σε ενέργεια, το σύστημα επιλέγει το κατάλληλο component).

kotlin
// Ρητό Intent — εκκίνηση DetailActivity με δεδομένα
val intent = Intent(this, DetailActivity::class.java).apply {
    putExtra("item_id", itemId)
    putExtra("item_name", itemName)
}
startActivity(intent)

// Λήψη δεδομένων στο DetailActivity
val itemId = intent.getLongExtra("item_id", 0L)
val itemName = intent.getStringExtra("item_name") ?: ""

Για τη λήψη αποτελέσματος από το εκκινημένο Activity χρησιμοποιείται το Activity Result API, το οποίο αντικατέστησε το ξεπερασμένο startActivityForResult. Το νέο API είναι type-safe, δηλωτικό και λειτουργεί με το 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)
}

Αποθήκευση κατάστασης κατά την αναδημιουργία

Κατά την περιστροφή οθόνης ή αλλαγή διαμόρφωσης, το Android αναδημιουργεί το Activity — καλεί διαδοχικά τα onDestroy και onCreate. Χωρίς αποθήκευση κατάστασης, ο χρήστης χάνει τα εισαγόμενα δεδομένα, τη θέση κύλισης και τα επιλεγμένα στοιχεία. Για την επίλυση αυτού του προβλήματος, το Android παρέχει δύο μηχανισμούς: onSaveInstanceState και ViewModel.

Το onSaveInstanceState αποθηκεύει απλά δεδομένα στο Bundle πριν από την κλήση του onDestroy. Το ViewModel από το Jetpack αντέχει στην αναδημιουργία του Activity και διατηρεί δεδομένα στη μνήμη, το οποίο είναι πιο αποτελεσματικό για σύνθετα αντικείμενα και αιτήματα δικτύου.

kotlin
class MainActivity : AppCompatActivity() {

    private val viewModel: MainViewModel by viewModels()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Το ViewModel αποθηκεύει αυτόματα δεδομένα
        viewModel.items.observe(this) { items ->
            updateAdapter(items)
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        outState.putInt("scroll_position", recyclerView.computeVerticalScrollOffset())
    }
}

Αρχιτεκτονική Single Activity και Jetpack

Η σύγχρονη προσέγγιση της Google — αρχιτεκτονική Single Activity με ένα Activity και πολλά Fragment. Η εφαρμογή χρησιμοποιεί ένα MainActivity και όλη η πλοήγηση εκτελείται από το Navigation Component μέσω του NavHostFragment. Πλεονεκτήματα: κεντρικοποιημένη πλοήγηση, κοινό ViewModel ανά οθόνη, σωστή λειτουργία με Deep Links.

Το Jetpack Navigation Component αυτοματοποιεί την εργασία με το back stack, τα κινούμενα σχέδια μετάβασης και τη μεταφορά ορισμάτων. Το NavHostFragment τοποθετείται στο layout του Activity και το γράφημα πλοήγησης (NavGraph) περιγράφει όλες τις οθόνες και τις συνδέσεις μεταξύ τους. Αυτή η προσέγγιση συνιστάται από την Google για νέα έργα και συμμορφώνεται με τις αρχές του 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)

        // Ρύθμιση NavigationUI για AppBar
        setupActionBarWithNavController(navController)
    }

    override fun onSupportNavigateUp() = 
        navController.navigateUp() || super.onSupportNavigateUp()
}

Συχνές ερωτήσεις

Σε τι διαφέρει το Activity από το Fragment;

Activity — μια πλήρης οθόνη εφαρμογής με δικό της κύκλο ζωής. Fragment — ένα μέρος του UI μέσα στο Activity, που επιβιώνει της αναδημιουργίας του Activity και εξαρτάται από τον Lifecycle του. Το Activity είναι υποχρεωτικό, το Fragment προαιρετικό.

Πόσα Activity μπορεί να έχει μια εφαρμογή;

Δεν υπάρχουν περιορισμοί. Κάθε οθόνη συνήθως αντιπροσωπεύει ένα ξεχωριστό Activity. Για μια απλή εφαρμογή αρκεί ένα, για πολλαπλών οθονών — από 5 έως 20. Η Google συνιστά ένα Activity με πολλά Fragment.

Τι είναι το launchMode στο Activity;

launchMode καθορίζει πώς δημιουργείται το Activity στη στοίβα εργασιών. Τέσσερις λειτουργίες: standard (δημιουργείται νέο στιγμιότυπο), singleTop, singleTask (ένα στιγμιότυπο στην εργασία) και singleInstance (απομονωμένη εργασία). Η λειτουργία ορίζεται στο AndroidManifest.xml.

Πώς μεταφέρονται δεδομένα μεταξύ Activity;

Μέσω Intent — ενός αντικειμένου με extras (putExtra) στα οποία τοποθετούνται primitives, συμβολοσειρές, Parcelable ή Serializable. Για ανατροφοδότηση χρησιμοποιείται το Activity Result API — το σύγχρονο type-safe υποκατάστατο του startActivityForResult.

Τι είναι το Configuration Change στο Android;

Configuration Change — αναδημιουργία του Activity κατά την αλλαγή διαμόρφωσης (περιστροφή οθόνης, αλλαγή γλώσσας, πληκτρολόγιο). Το σύστημα καλεί onDestroy → onCreate. Για αποθήκευση δεδομένων χρησιμοποιείται onSaveInstanceState ή ViewModel από το Jetpack.

Σύνοψη

  • Activity — το βασικό component Android που αντιπροσωπεύει μια οθόνη με διεπαφή χρήστη και διαχειρίζεται μέσω του κύκλου ζωής
  • Κύκλος ζωής αποτελείται από έξι callbacks: onCreate, onStart, onResume, onPause, onStop, onDestroy — το καθένα με αυστηρό σκοπό
  • Intent εξασφαλίζει την εκκίνηση του Activity και τη μεταφορά δεδομένων μεταξύ οθονών μέσω ρητών και σιωπηρών κλήσεων
  • AndroidManifest.xml απαιτεί υποχρεωτική καταχώρηση κάθε Activity με όνομα, θέμα, προσανατολισμό και φίλτρα
  • ViewModel από το Jetpack διατηρεί δεδομένα κατά την αναδημιουργία του Activity, αντικαθιστώντας τη χειροκίνητη αποθήκευση στο onSaveInstanceState
  • Αρχιτεκτονική Single Activity με Navigation Component — το σύγχρονο πρότυπο που συνιστά η Google για έργα Android
  • launchMode διαχειρίζεται τη συμπεριφορά του Activity στη στοίβα εργασιών: από standard έως singleInstance για απομονωμένες οθόνες

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης