Sobes.tech
Junior

Πώς γίνεται η πλοήγηση μεταξύ Activities στο Android;

sobes.tech AI

Απάντηση από AI

Η πλοήγηση μεταξύ δραστηριοτήτων πραγματοποιείται με τη βοήθεια του Intent.

Το Intent είναι ένα αντικείμενο ανταλλαγής μηνυμάτων που επιτρέπει σε συστατικά (όπως Activity, Services, Broadcast Receivers) να ζητούν ενέργειες το ένα από το άλλο.

Υπάρχουν δύο βασικοί τύποι Intent:

  • Εμφανείς Intent: δείχνουν συγκεκριμένο συστατικό για εκτέλεση (π.χ., κλάση Activity).
  • Αόρατοι Intent: δείχνουν τον τύπο της ενέργειας που πρέπει να εκτελεστεί (π.χ., προβολή μιας ιστοσελίδας), και το Android σύστημα επιλέγει το κατάλληλο συστατικό για την εκτέλεση.

Για να ξεκινήσετε μια νέα Activity με εμφανή Intent, χρησιμοποιείται η μέθοδος startActivity().

// Στην τρέχουσα Activity
val intent = Intent(this, TargetActivity::class.java) // Εμφανής Intent
startActivity(intent)

Για την μεταφορά δεδομένων μεταξύ Activities, μπορείτε να χρησιμοποιήσετε τη μέθοδο putExtra() του αντικειμένου Intent:

// Αποστολή δεδομένων
val intent = Intent(this, TargetActivity::class.java)
intent.putExtra("key_name", "some_value")
startActivity(intent)

// Λήψη δεδομένων στο TargetActivity (στη μέθοδο onCreate() ή onNewIntent())
val data = intent.getStringExtra("key_name")

Για να λάβετε το αποτέλεσμα από μια Activity που έχει ξεκινήσει, χρησιμοποιείται το startActivityForResult(). Μετά το κλείσιμο μιας παιδικής Activity, μπορεί να στείλει το αποτέλεσμα πίσω με setResult() και finish(). Η γονική Activity λαμβάνει αυτό το αποτέλεσμα στη μέθοδο onActivityResult().

// Στην γονική Activity
val intent = Intent(this, ChildActivity::class.java)
startActivityForResult(intent, REQUEST_CODE) // REQUEST_CODE είναι μοναδικός αναγνωριστικός κωδικός

// Λήψη αποτελέσματος
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        val resultData = data?.getStringExtra("result_key")
        // Επεξεργασία αποτελέσματος
    }
}

// Στην παιδική Activity (πριν το κλείσιμο)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Από το AndroidX και μετά, συνιστάται η χρήση του API αποτελεσμάτων δραστηριότητας αντί για startActivityForResult()/onActivityResult():

// Στην γονική Activity
private val startForResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val data = result.data
        // Επεξεργασία αποτελέσματος
    }
}

// Εκκίνηση Activity
val intent = Intent(this, ChildActivity::class.java)
startForResult.launch(intent)

// Στην παιδική Activity (πριν το κλείσιμο)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Επίσης, για πιο πολύπλοκη πλοήγηση σε σύγχρονες εφαρμογές Android, συχνά χρησιμοποιείται το component Navigation από το Jetpack:

  • Navigation Component: Επιτρέπει τον ορισμό ενός γραφήματος πλοήγησης που περιγράφει όλους τους πιθανούς δρόμους μεταξύ των οθονών της εφαρμογής. Χρησιμοποιεί το NavController για τη διαχείριση της μετακίνησης στο γράφημα.
<!-- Παράδειγμα nav_graph.xml -->
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/mobile_navigation"
    app:startDestination="@+id/firstFragment">

    <fragment
        android:id="@+id/firstFragment"
        android:name="com.example.app.FirstFragment"
        android:label="First" >
        <action
            android:id="@+id/action_firstFragment_to_secondFragment"
            app:destination="@id/secondFragment" />
    </fragment>
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.example.app.SecondFragment"
        android:label="Second" />
</navigation>
// Στην Activity (π.χ., σε Fragment)
findNavController().navigate(R.id.action_firstFragment_to_secondFragment)

Ο Component Navigation απλοποιεί την υλοποίηση της πλοήγησης, συμπεριλαμβανομένης της μεταφοράς επιχειρημάτων, της υποστήριξης διαλόγων και της διαχείρισης του back stack.