Persian Software Engineers
Photo
حال کاربر وارد یه برنامه دیگه میشه و تسک قبلی که صفحه ی اصلی بود وارد استک میشه ...
Persian Software Engineers
Photo
کاربر با زدن دکمه Back گوشی یا دکمه Home که این ها هم تفاوت داره و در بخش حیات داده ی اکتویتی ها بحث میشه دوباره به صفحه اصلی بر می گرده حال برنامه قبلی وارد به استک میشه و چون صفحه ی اصلی در استک بود و قابل مشاهده نبود الان قابل مشاهده و اکتیو میشه و یک تسک جدید ساخته نمیشه ... (اگر با دکمه Back برگرده کاربر اکتویتی destroy میشه و از بین میره اطلاعات داخل Bundle ش ولی اگر با دکمه هوم برگرده اکتویتی pause میشه در جلسات بعدی کاملا با این موضوع آشنا میشین )
در سه عکس بالا کاربر وارد برنامه G+ میشه و بعد وارد قسمت پست گذاشتن در گوگل پلاس میشه و سپس به صفحه ی اصلی برمی گرده همونطور که مشاهده می کنید دو تا اکتویتی برنامه گوگل پلاس در کنار هم قرار گرفتند چون هر کدوم یک اکتویتی جدا هستند اما این که هر دو در یک تسک باشن یا در دو تا تسک مختلف معلوم نیست و جلوتر بررسی میشه که چه فرقی دارند
در اینجا کاربر وارد برنامه Flipboard میشه ک سپس به صفحه ی اصلی بر می گرده و از طریق Recent Apps که با فشردن دکمه ی هوم یا تو گوشی های جدید یه دکمه جدا براش تعبیه شده وارد برنامه G+ میشه حالا بک گراند کاملا از تسک های g+خالی میشه چون در اصل الان اون تسک رو از بک گراند به فورگراند انتقال دادیم و visible ش کردیم ! (از نظر چرخه ی حیات اکتویتی الان تو حالت onRestart یا onResume هستیم )
خب مرحله اول رو تازه گذروندیم 😊 این رفتار دیفالت و پیش فرض اکتیویتی ها بود ... حالا می خوایم این رفتار رو تغییر بدیم و کار اصلی شروع میشه !
تگ <activity> در AndroidManifest.xml یه سری Attribute (ویژگی) در مورد تسک ها داره که شامل
●Launch mode
●TaskAffinity
●...
میشه و هم چنین شما باید یک سری پرچم ( Flag ) به intent هاتون اضافه کنین تا بتونین تسک ها رو مدیریت کنین و اکتویتی ها رو شروع کنین
●FLAG_ACTIVITY_NEW_TASK
●FLAG_ACTIVITY_CLEAR_TOP
●FLAG_ACTIVITY_SINGLE_TOP
●Launch mode
●TaskAffinity
●...
میشه و هم چنین شما باید یک سری پرچم ( Flag ) به intent هاتون اضافه کنین تا بتونین تسک ها رو مدیریت کنین و اکتویتی ها رو شروع کنین
●FLAG_ACTIVITY_NEW_TASK
●FLAG_ACTIVITY_CLEAR_TOP
●FLAG_ACTIVITY_SINGLE_TOP
Android:taskAfinity
●استفاده میشه تا مشخص کنه تسکی که قراره اکتویتی رو نگر داره (تسکی که مقدار affinity (وابستگی) یکسانی رو داره)
●به طور پیشفرض تمام اکتویتی ها مقدار affinity یکسانی رو دارند و در یک تسک هستن و همه وابسته به نام پکیج می باشند .
●استفاده میشه تا مشخص کنه تسکی که قراره اکتویتی رو نگر داره (تسکی که مقدار affinity (وابستگی) یکسانی رو داره)
●به طور پیشفرض تمام اکتویتی ها مقدار affinity یکسانی رو دارند و در یک تسک هستن و همه وابسته به نام پکیج می باشند .
Persian Software Engineers
Photo
اومدیم دو تا اکتویتی رو تعریف کردیم و اکتویتی B تفاوتش اینه که taskAffinity ش رو یه package name متفاوت تعریف کردیم حالا اکتویتی A رو اجرا می کنیم و در اون با کد
Intent i =new Intent(this,ActivityB.class);
رو میذاریم تا اکتویتی B اجرا بشه در یک تسک جدید چون affinity و وابستگیش متفاوته اما نتیجه به صورت زیر در استک میشه
Intent i =new Intent(this,ActivityB.class);
رو میذاریم تا اکتویتی B اجرا بشه در یک تسک جدید چون affinity و وابستگیش متفاوته اما نتیجه به صورت زیر در استک میشه
ما توقع داشتیم که اکتویتی B در یک تسک جدید اجرا بشه اما در تسک قبلی اجرا شد چرا ؟؟ چون ما باید حتما تو intent مون
FLAG_ACTIVITY_NEW_TASK
رو اضافه کنیم تا اکتویتی B در یک تسک جدید اجرا بشه و کد اصلاح شده به صورت زیر می باشد :
Intent i =new Intent(this,ActivityB.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
هست حال نتیجه به صورت زیر در استک می باشد 👇👇👇
FLAG_ACTIVITY_NEW_TASK
رو اضافه کنیم تا اکتویتی B در یک تسک جدید اجرا بشه و کد اصلاح شده به صورت زیر می باشد :
Intent i =new Intent(this,ActivityB.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
هست حال نتیجه به صورت زیر در استک می باشد 👇👇👇