Sobes.tech
Middle

Deep link səbəbindən fəaliyyətin bir neçə dəfə açılması vəziyyətini necə idarə etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Bir neçə yanaşma mövcuddur:

  1. Intentdə bayraqların istifadəsi:

    • FLAG_ACTIVITY_SINGLE_TOP: Əgər fəaliyyət artıq yığımın yuxarısındadırsa, yeni nümunə yaradılmaq əvəzinə onNewIntent() metodu çağırılacaq.
    • FLAG_ACTIVITY_CLEAR_TOP: Əgər fəaliyyət artıq yığında mövcuddursa, onun üstündəki bütün fəaliyyətlər sonlandırılacaq və fəaliyyət yuxarıya gətiriləcək.
    • FLAG_ACTIVITY_NEW_TASK ilə birlikdə: Bu, çox vaxt CLEAR_TOP ilə başqa bir tapşırıqdan fəaliyyətlərlə işləmək üçün istifadə olunur.
  2. AndroidManifest.xml-də launchMode konfiqurasiyası:

    • singleTop: Intent vasitəsilə başladıqda FLAG_ACTIVITY_SINGLE_TOP-a bənzər.
    • singleTask: Fəaliyyət yeni tapşırığın köküdür; əgər artıq bir nümunə mövcuddursa, o önə çəkiləcək və onun üstündəki bütün fəaliyyətlər sonlandırılacaq.
    • singleInstance: Fəaliyyət öz tapşırığında mövcuddur və bu tapşırıqda yeganə fəaliyyətdir.
  3. Fəaliyyətin mövcudluğunu yoxlamaq:

    • ActivityManager istifadə edərək hazırkı fəaliyyət yığını yoxlayın. Bu yanaşma mürəkkəbliyi və xərcləri səbəbindən daha az tövsiyə olunur.
  4. onNewIntent()-ə cavab:

    • singleTop və ya FLAG_ACTIVITY_SINGLE_TOP istifadə edildikdə, deeplinkin işlənməsi üçün bütün məntiq onNewIntent()-də həyata keçirilməlidir, onCreate()-də yox. setIntent(intent)-i onNewIntent()-də çağırmağı unutmayın ki, getIntent() vasitəsilə əlçatan olan Intent yenilənmiş olsun.

launchMode="singleTop"onNewIntent() nümunəsi:

AndroidManifest.xmldə:

<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 sinifində:

class YourDeeplinkActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_deeplink)
        // Başlanğıc emal, fəaliyyət yaradıldıqda
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent?) {
        super.onNewIntent(intent)
        // Intent-i yeniləmək vacibdir
        setIntent(intent)
        // Yeni Intent-i emal et (deeplink)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent?) {
        intent?.data?.let { uri ->
            // Deeplink URI-ni emalamaq məntiqi
            Log.d("DeeplinkActivity", "Qəbul edilən deeplink: $uri")
            // Məsələn, parametrləri çıxar və uyğun fragmentə yönləndirmə et
        }
    }
}

Yanaşma seçimi konkret ssenariyə və istənilən fəaliyyət yığını davranışına bağlıdır. Ən çox istifadə olunan həll, launchMode="singleTop" istifadə etmək və onNewIntent()-də işləməkdir.