Activity چهار نوع launchMode داره که در منیفست میشه تعریف کرد. ۱- standard: پیش فرض هست. به صورت معمول هر بار Activity را استارت می کنیم یه Activity جدید در همین تسک جاری ساخته میشه. ۲- singleTop: اگر اینستنسی از Activity در foreGround باشد نمونه جدیدی نمیسازد و فقط متد onNewIntent این Activity صدا زده می شود. ۳- singleTask: در صورت عدم وجود نمونه ای از این Activity یک task جدید میسازد. و باقیActivity های جدید در اینtask قرار می گیرند. وقتی این Activity مجدد صدا زده می شود تمامیActivity هایی که روی این Activity هستند بسته می شوند تا به این Activity برسد. در صورت وجود نمونه متد onNewIntent صدا زده میشود. ۴- singleInstance: در این حالت کلا یک task جدید میسازد و فقط همین Activity در task قرار می گیرد. وقتی مجدد صدا زده شود task این Activity بالا می آید وActivity های دیگر بسته نمی شوند. در صورت وجود نمونه متد onNewIntent صدا زده میشود.
اول بگیم launchMode مود چیه ؟ بطور پیش فرض وقتی اپلیکیشنمونو لانچ میکنیم اندروید یک تسکی رو باز میکنه و در اون یک backStack - پشته ایجاد میکنه و اکتیوتی هامون رو به ترتیب در داخل استک push میکنه . پیش فرض بدین شکله که هراکتیویتی که نیو میکنید و با intent اون اکتیویتی رو باز میکنید یک instance جدید از اون ایجاد میشه و اون رو داخل پشته قرار میده ! یعنی اگر قبلا هم Instance از اون وجود داشته باشه ، با اون کاری نداره و یک نمونه جدید ایجاد و اون رو در پشته قرار میده .
📌حالا لانچ مود اومده که چرخه طبیعی این روال رو تغییر بده - البته اگر نیاز داشتیم میتونیم ازش استفاده کنیم ! یعنی لانچ مود بهمون اجازه میده که تعیین کنیم چطور یک نمونه از اکتیوتی به کارنت تسک اختصاص داده شه !
این launchMode هارو میتونیم برای هراکتیوتی در manifest ست کنیم البته از طریق Flag هم میشه !
📌 انواع launchMode : 1-standard : این همون حالت پیش فرضی هست که براتون گفتم - یعنی اگر چیزی رو هم در منیفست ست نکنید پیش فرض همین ست میشه .
2-singleTop : تو این حالت اگر اکتیوتیتون در تاپ و بالای backStack موجود باشه همون رو از طریق متد onNewIntent براتون کال میکنه و اونو براتون اجرا میکنه ! یعنی اگر اکتیوتیتون در تاپ استک باشه ، نمونه جدید از اکتیوتی نمیسازه و اونی که تو تاپ استک هست رو براتون مجدد ارجاع میده ! تو حالتی هم که در تاپ استک اون اکیتیوتی براتون موجود نباشه ، چیکار میکنه؟ خب معلومه براتون یک نمونه جدید از اون اکتیوتی براتون میسازه و اون رو در استک قرار میده.
3-singleTask : تو این حالت اگر تو تسک جاری یک نمونه از اکتیوتیتون موجود باشه ، همون رو از طریق متد onNewIntent براتون کال میکنه و اونو براتون اجرا میکنه ! خب اگر نباشه چی ؟ یک instance حدید از اکتیوتی براتون میسازه و اون رو در #تسک_جدید باز میکنه ! دقت کنید گفتم در تسک جدید نه تسک جاری !
4-singelInstance :این رفتارش شبیه singleTask هست ، اما با این تفاوت که اجازه میده فقط یک نمونه از activity مورد نظر تو یک task باشه ! یعنی اگر تو کارنت تسک یک نمونه از activity1 باشه و اگر لانچ مود رو این بذارید ،و بخواید activity1 رو استارت کنید میاد یک نمونه از اکتیوتی میسازه و در تسک جدید اونو براتون باز میکنه !
🛑نکته مهم : درهنگام استفاده از singleTask به پروپرتی taskَAffinity در تگ اکتیوتی در منیفست دقت کنید ! چون در عملکرد اون تاثیر گذاره . کمی بیشتر در مورد پروپرتی تسک افینیتی : #80
اینم ی لنیک دیگه که بهتر میتونید درک کنید این مطالبو : https://www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack
اول بگیم launchMode مود چیه ؟ بطور پیش فرض وقتی اپلیکیشنمونو لانچ میکنیم اندروید یک تسکی رو باز میکنه و در اون یک backStack - پشته ایجاد میکنه و اکتیوتی هامون رو به ترتیب در داخل استک push میکنه . پیش فرض بدین شکله که هراکتیویتی که نیو میکنید و با intent اون اکتیویتی رو باز میکنید یک instance جدید از اون ایجاد میشه و اون رو داخل پشته قرار میده ! یعنی اگر قبلا هم Instance از اون وجود داشته باشه ، با اون کاری نداره و یک نمونه جدید ایجاد و اون رو در پشته قرار میده .
حالا لانچ مود اومده که چرخه طبیعی این روال رو تغییر بده - البته اگر نیاز داشتیم میتونیم ازش استفاده کنیم ! یعنی لانچ مود بهمون اجازه میده که تعیین کنیم چطور یک نمونه از اکتیوتی به کارنت تسک اختصاص داده شه !
این launchMode هارو میتونیم برای هراکتیوتی در manifest ست کنیم البته از طریق Flag هم میشه !
انواع launchMode : 1-standard : این همون حالت پیش فرضی هست که براتون گفتم - یعنی اگر چیزی رو هم در منیفست ست نکنید پیش فرض همین ست میشه .
2-singleTop : تو این حالت اگر اکتیوتیتون در تاپ و بالای backStack موجود باشه همون رو از طریق متد onNewIntent براتون کال میکنه و اونو براتون اجرا میکنه ! یعنی اگر اکتیوتیتون در تاپ استک باشه ، نمونه جدید از اکتیوتی نمیسازه و اونی که تو تاپ استک هست رو براتون مجدد ارجاع میده ! تو حالتی هم که در تاپ استک اون اکیتیوتی براتون موجود نباشه ، چیکار میکنه؟ خب معلومه براتون یک نمونه جدید از اون اکتیوتی براتون میسازه و اون رو در استک قرار میده.
3-singleTask : تو این حالت اگر تو تسک جاری یک نمونه از اکتیوتیتون موجود باشه ، همون رو از طریق متد onNewIntent براتون کال میکنه و اونو براتون اجرا میکنه ! خب اگر نباشه چی ؟ یک instance حدید از اکتیوتی براتون میسازه و اون رو در #تسک_جدید باز میکنه ! دقت کنید گفتم در تسک جدید نه تسک جاری !
4-singelInstance :این رفتارش شبیه singleTask هست ، اما با این تفاوت که اجازه میده فقط یک نمونه از activity مورد نظر تو یک task باشه ! یعنی اگر تو کارنت تسک یک نمونه از activity1 باشه و اگر لانچ مود رو این بذارید ،و بخواید activity1 رو استارت کنید میاد یک نمونه از اکتیوتی میسازه و در تسک جدید اونو براتون باز میکنه !
نکته مهم : درهنگام استفاده از singleTask به پروپرتی taskَAffinity در تگ اکتیوتی در منیفست دقت کنید ! چون در عملکرد اون تاثیر گذاره . کمی بیشتر در مورد پروپرتی تسک افینیتی : #80
میشه برای هر کدوم یه مثال بزنی که کجاها بهتره ازش استفاده کرد؟