Sobes.tech
Middle

Deep link себептүү иш-аракет бир нече жолу ачылса, кандайча иштетсе болот?

sobes.tech AI

AIден жооп

Көптөгөн ыкмалар бар:

  1. Intentтеги флагтарды колдонуу:

    • FLAG_ACTIVITY_SINGLE_TOP: Эгер активдүүлүк стектин үстүндө болсо, onNewIntent() методу чакырылат, жаңы экземпляр түзүүдөй эмес.
    • FLAG_ACTIVITY_CLEAR_TOP: Эгер активдүүлүк стекте болсо, анын үстүндөгү бардык активдүүлүктөр жыйынтыкталып, ал үстүнөн чыгат.
    • FLAG_ACTIVITY_NEW_TASK менен бирге колдонулганда: көбүнчө CLEAR_TOP менен башка тапшырмадан активдүүлүктөр менен иштөө үчүн колдонулат.
  2. AndroidManifest.xmlдеги launchMode настройкасы:

    • singleTop: Intent аркылуу иштетилгенде FLAG_ACTIVITY_SINGLE_TOP менен окшош.
    • singleTask: Активдүүлүк жаңы тапшырктын тамыры; эгер ал учурда бар болсо, ал алдыга жылат жана үстүндөгү бардык активдүүлүктөр жыйынтыкталып, ал активдүүлүк алдыңкы орунга келет.
    • singleInstance: Активдүүлүк өзүнүн тапшырмасында болот жана ошол тапшырмада жалгыз активдүүлүк.
  3. Активдүүлүктүн бар-жогун алдын ала текшерүү:

    • ActivityManager колдонуп, учурдагы активдүүлүк стекти текшериңиз. Бул ыкма кыйынчылык жана чыгымдарга байланыштуу азыраак сунушталат.
  4. onNewIntent()ке реакция:

    • singleTop же FLAG_ACTIVITY_SINGLE_TOP колдонулганда, deeplink иштетүүнүн бардык логикасы onNewIntent() методунда ишке ашырылышы керек, onCreate() эмес. setIntent(intent) чакырышын onNewIntent() ичинде унутпаңыз, Intent жаңыланат.

launchMode="singleTop" жана onNewIntent() колдонуу мисалы:

AndroidManifest.xmlда:

<activity
    android:name=".YourDeeplinkActivity"
    android:launchMode="singleTop">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="your_scheme"
              android:host="your_host"
              android:pathPrefix="/your_path" />
    </intent-filter>
</activity>

YourDeeplinkActivity класында:

class YourDeeplinkActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_deeplink)
        // Баштапкы иштетүү, эгер активдүүлүк түзүлсө
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // Intent жаңыртуу маанилүү `getIntent()` үчүн
        setIntent(intent)
        // Жаңы Intent (deeplink) иштетүү
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.data?.let { uri ->
            // URI deeplink иштетүү логикасы
            Log.d("DeeplinkActivity", "Received deeplink: $uri")
            // Мисалы, параметрлерди чыгарып, керектүү фрагментке навигациялоо
        }
    }
}

Тандоо конкретдик колдонуу сценарийине жана активдүүлүк стекинин каалаган жүрүм-турумуна көз каранды. Эң кеңири колдонулган чечим — launchMode="singleTop" колдонуу жана onNewIntent()та иштетүү.