Sobes.tech
Middle

Deep link nedeniyle etkinlik birkaç kez açıldığında durumu nasıl yönetirsiniz?

sobes.tech yapay zeka

AI'dan gelen yanıt

Mevcut birkaç yaklaşım vardır:

  1. Intent'te bayrakların kullanımı:

    • FLAG_ACTIVITY_SINGLE_TOP: Aktivite zaten yığının en üstündeyse, yeni bir örnek oluşturmak yerine onNewIntent() yöntemi çağrılır.
    • FLAG_ACTIVITY_CLEAR_TOP: Aktivite zaten yığında varsa, onun üzerindeki tüm aktiviteler sonlandırılır ve aktivite en üste getirilir.
    • FLAG_ACTIVITY_NEW_TASK ile birlikte kullanılır: Genellikle başka bir görevden aktivitelerle çalışmak için CLEAR_TOP ile birlikte kullanılır.
  2. AndroidManifest.xml'de launchMode ayarı:

    • singleTop: Intent aracılığıyla başlatıldığında FLAG_ACTIVITY_SINGLE_TOP ile benzerdir.
    • singleTask: Aktivite yeni bir göreğin köküdür; zaten bir örneği varsa, öne alınır ve üzerindeki tüm aktiviteler sonlandırılır.
    • singleInstance: Aktivite kendi görevi içinde bulunur ve bu görevdaki tek aktivitedir.
  3. Başlatmadan önce aktivitenin varlığını kontrol etme:

    • ActivityManager kullanarak mevcut aktivite yığını kontrol edilir. Bu yaklaşım, karmaşıklık ve maliyet nedeniyle daha az tercih edilir.
  4. onNewIntent()'e tepki verme:

    • singleTop veya FLAG_ACTIVITY_SINGLE_TOP kullanılırken, deeplink işleme mantığı onNewIntent()'te uygulanmalı, onCreate()'da değil. setIntent(intent) çağrısı unutulmamalıdır, böylece getIntent() ile erişilebilir hale gelir.

launchMode="singleTop" ve onNewIntent() kullanımı örneği:

AndroidManifest.xml'de:

<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 aktivite sınıfında:

class YourDeeplinkActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_deeplink)
        // Aktivite oluşturulurken başlangıç işlemi
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // Intent'i güncellemek önemli
        setIntent(intent)
        // Yeni Intent'i işle (deeplink)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.data?.let { uri ->
            // Deeplink URI'sini işleme mantığı
            Log.d("DeeplinkActivity", "Alınan deeplink: $uri")
            // Örneğin, parametreleri çıkarıp uygun fragmente yönlendirme
        }
    }
}

Yaklaşım seçimi, kullanım senaryosuna ve istenen aktivite yığını davranışına bağlıdır. En yaygın çözüm, launchMode="singleTop" kullanmak ve onNewIntent()'te işleme yapmaktır.