Activity — το βασικό component μιας εφαρμογής Android, που αντιπροσωπεύει μια οθόνη με διεπαφή χρήστη. Το σύστημα διαχειρίζεται τις οθόνες μέσω ενός αυστηρού κύκλου ζωής — callbacks onCreate, onResume και onDestroy. Κάθε Activity δηλώνεται στο AndroidManifest.xml και εκκινείται μέσω Intent. Διαβάστε περισσότερα για την ιστορία του Android στην επίσημη τεκμηρίωση της Google.
Κύρια σημεία
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 — το σύνολο καταστάσεων και 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: Running (onResume ενεργό), Paused (ορατό αλλά χωρίς εστίαση), Stopped (μη ορατό), Destroyed (κατεστραμμένο). Το σύστημα μπορεί να σκοτώσει το Activity σε κατάσταση Stopped όταν υπάρχει έλλειψη μνήμης — τα δεδομένα πρέπει να αποθηκευτούν στο onSaveInstanceState.
Ας εξετάσουμε τρεις βασικές μεθόδους του κύκλου ζωής Activity με ένα παράδειγμα σε Kotlin. onCreate — σημείο εισόδου, καλείται μία φορά. Εδώ γίνεται η σύνδεση layout μέσω setContentView, η αρχικοποίηση RecyclerView, η εγγραφή σε LiveData. onStart — το Activity γίνεται ορατό στον χρήστη. onResume — το Activity λαμβάνει εστίαση και είναι έτοιμο για αλληλεπίδραση.
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. Χωρίς καταχώρηση, το σύστημα δεν θα βρει την οθόνη και θα ρίξει εξαίρεση ActivityNotFoundException. Στο manifest καθορίζονται το όνομα κλάσης, το θέμα, ο προσανατολισμός, το launchMode και τα φίλτρα 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>Η σημαία exported καθορίζει αν άλλες εφαρμογές μπορούν να εκκινήσουν το Activity. Για την κύρια οθόνη exported=true, για εσωτερικές οθόνες — false. Η ιδιότητα parentActivityName ενεργοποιεί την τυπική πλοήγηση „Πάνω“ (Up Navigation).
Intent — ένα αντικείμενο που περιγράφει μια ενέργεια προς εκτέλεση. Στο πλαίσιο του Activity, το Intent χρησιμοποιείται για την εκκίνηση μιας άλλης οθόνης με μεταφορά δεδομένων. Το Intent μπορεί να είναι ρητό (δείχνει σε συγκεκριμένη κλάση) και σιωπηρό (δείχνει σε ενέργεια, το σύστημα επιλέγει το κατάλληλο component).
// Ρητό 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.
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 και διατηρεί δεδομένα στη μνήμη, το οποίο είναι πιο αποτελεσματικό για σύνθετα αντικείμενα και αιτήματα δικτύου.
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())
}
}Η σύγχρονη προσέγγιση της Google — αρχιτεκτονική Single Activity με ένα Activity και πολλά Fragment. Η εφαρμογή χρησιμοποιεί ένα MainActivity και όλη η πλοήγηση εκτελείται από το Navigation Component μέσω του NavHostFragment. Πλεονεκτήματα: κεντρικοποιημένη πλοήγηση, κοινό ViewModel ανά οθόνη, σωστή λειτουργία με Deep Links.
Το Jetpack Navigation Component αυτοματοποιεί την εργασία με το back stack, τα κινούμενα σχέδια μετάβασης και τη μεταφορά ορισμάτων. Το NavHostFragment τοποθετείται στο layout του Activity και το γράφημα πλοήγησης (NavGraph) περιγράφει όλες τις οθόνες και τις συνδέσεις μεταξύ τους. Αυτή η προσέγγιση συνιστάται από την Google για νέα έργα και συμμορφώνεται με τις αρχές του 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)
// Ρύθμιση NavigationUI για AppBar
setupActionBarWithNavController(navController)
}
override fun onSupportNavigateUp() =
navController.navigateUp() || super.onSupportNavigateUp()
}Συχνές ερωτήσεις
Activity — μια πλήρης οθόνη εφαρμογής με δικό της κύκλο ζωής. Fragment — ένα μέρος του UI μέσα στο Activity, που επιβιώνει της αναδημιουργίας του Activity και εξαρτάται από τον Lifecycle του. Το Activity είναι υποχρεωτικό, το Fragment προαιρετικό.
Δεν υπάρχουν περιορισμοί. Κάθε οθόνη συνήθως αντιπροσωπεύει ένα ξεχωριστό Activity. Για μια απλή εφαρμογή αρκεί ένα, για πολλαπλών οθονών — από 5 έως 20. Η Google συνιστά ένα Activity με πολλά Fragment.
launchMode καθορίζει πώς δημιουργείται το Activity στη στοίβα εργασιών. Τέσσερις λειτουργίες: standard (δημιουργείται νέο στιγμιότυπο), singleTop, singleTask (ένα στιγμιότυπο στην εργασία) και singleInstance (απομονωμένη εργασία). Η λειτουργία ορίζεται στο AndroidManifest.xml.
Μέσω Intent — ενός αντικειμένου με extras (putExtra) στα οποία τοποθετούνται primitives, συμβολοσειρές, Parcelable ή Serializable. Για ανατροφοδότηση χρησιμοποιείται το Activity Result API — το σύγχρονο type-safe υποκατάστατο του startActivityForResult.
Configuration Change — αναδημιουργία του Activity κατά την αλλαγή διαμόρφωσης (περιστροφή οθόνης, αλλαγή γλώσσας, πληκτρολόγιο). Το σύστημα καλεί onDestroy → onCreate. Για αποθήκευση δεδομένων χρησιμοποιείται onSaveInstanceState ή ViewModel από το Jetpack.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης