Sobes.tech
Junior

Ինչպե՞ս է կատարվում նավիգացիան Android-ում Activity-ների միջև։

sobes.tech AI

Պատասխան AI-ից

Նավիգացիան Activity-ների միջև իրականացվում է Intent-ով:

Intent-ը հաղորդագրությունների փոխանակման օբյեկտ է, որը թույլ է տալիս կոմպոնենտներին (օրինակ՝ Activity, Services, Broadcast Receivers) միմյանցից գործողություններ պահանջել:

Կան երկու հիմնական տեսակի Intent-ներ:

  • Ավելի հստակ Intent: Նշում է կոնկրետ կոմպոնենտը՝ սկսած Activity դասից:
  • Անհայտ Intent: Նշում է գործողության տեսակը, որը պետք է կատարվի (օրինակ՝ դիտել վեբ էջ), և Android համակարգը ընտրում է համապատասխան կոմպոնենտը:

Նոր Activity սկսելու համար օգտագործվում է startActivity() մեթոդը՝ հստակ Intent-ով:

// ընթացիկ Activity-ում
val intent = Intent(this, TargetActivity::class.java) // հստակ Intent
startActivity(intent)

Տվյալների փոխանցման համար օգտագործվում է 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-ում
val intent = Intent(this, ChildActivity::class.java)
startActivityForResult(intent, REQUEST_CODE) // REQUEST_CODE՝ եզակի նշանանիշ

// Արդյունքի ստացում ծնող Activity-ում
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")
        // Աշխատանք արդյունքի հետ
    }
}

// Child Activity-ում (փակելուց առաջ)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

AndroidX-ից սկսած, խորհուրդ է տրվում օգտագործել Activity Results 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)

// Child Activity-ում (փակելուց առաջ)
val resultIntent = Intent()
resultIntent.putExtra("result_key", "result_value")
setResult(RESULT_OK, resultIntent)
finish()

Նավիգացիայի ավելի բարդ համակարգի համար, որը հաճախ օգտագործվում է Jetpack-ի Navigation կոմպոնենտը, նախատեսված է՝

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

Navigation Component-ը հեշտացնում է նավիգացիայի իրականացմանը, ներառյալ արգումենտների փոխանցումը, դիալոգային պատուհանների աջակցությունը և բեկի stack-ի կառավարումը։