Sobes.tech
Middle

Deep link sababli faoliyat bir necha marta ochilsa, qanday boshqarish mumkin?

sobes.tech AI

AIdan javob

Bir nechta yondashuvlar mavjud:

  1. Intentdagi bayroqlardan foydalanish:

    • FLAG_ACTIVITY_SINGLE_TOP: Agar faoliyat allaqachon yigining yuqorisida bo'lsa, yangi nusxa yaratish o'rniga onNewIntent() usuli chaqiriladi.
    • FLAG_ACTIVITY_CLEAR_TOP: Agar faoliyat allaqachon yilda mavjud bo'lsa, uning ustidagi barcha faoliyatlar yakunlanadi va faoliyat yuqori qismga olib kelinadi.
    • FLAG_ACTIVITY_NEW_TASK bilan birgalikda: Ko'pincha CLEAR_TOP bilan boshqa vazifadan faoliyatlar bilan ishlash uchun ishlatiladi.
  2. AndroidManifest.xml'da launchMode sozlamasi:

    • singleTop: Intent orqali ishga tushirilganda FLAG_ACTIVITY_SINGLE_TOP ga o'xshash.
    • singleTask: Faoliyat yangi vazifaning ildizi; agar allaqachon bir nusxa mavjud bo'lsa, u oldinga olib kelinadi va uning ustidagi barcha faoliyatlar yakunlanadi.
    • singleInstance: Faoliyat o'zining vazifasida mavjud va bu vazifadagi yagona faoliyat.
  3. Faoliyat mavjudligini tekshirish:

    • ActivityManager yordamida joriy faoliyat yiginini tekshiring. Bu yondashuv murakkabligi va xarajatlari sababli kamroq tavsiya etiladi.
  4. onNewIntent() ga javob berish:

    • singleTop yoki FLAG_ACTIVITY_SINGLE_TOP ishlatilganda, deeplinkni ishlash mantiqi onNewIntent()da amalga oshirilishi kerak, onCreate()da emas. setIntent(intent) chaqirishni unutmang, shunda getIntent() orqali kirish mumkin.

launchMode="singleTop" va onNewIntent() misoli:

AndroidManifest.xmlda:

<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 faoliyat sinfida:

class YourDeeplinkActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_deeplink)
        // Dastlabki ishlov berish, faoliyat yaratilganda
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // Intentni yangilash muhim
        setIntent(intent)
        // Yangi Intentni ishlash (deeplink)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.data?.let { uri ->
            // Deeplink URI'sini ishlash mantiqi
            Log.d("DeeplinkActivity", "Qabul qilingan deeplink: $uri")
            // Masalan, parametrlarni chiqarib, kerakli fragmentga navigatsiya qilish
        }
    }
}

Yondashuv tanlovi aniq holatga va istalgan faoliyatlar yiginidagi xulq-atvorga bog'liq. Eng keng tarqalgan yechim, launchMode="singleTop" ni ishlatish va onNewIntent()da ishlashdir.