وظایف و پشته پشته

وظیفه مجموعه‌ای از فعالیت‌هایی است که کاربران هنگام تلاش برای انجام کاری در برنامه شما با آنها تعامل دارند. این فعالیت ها در پشته ای به نام پشته پشته به ترتیب باز شدن هر اکتیویتی مرتب می شوند.

به عنوان مثال، یک برنامه ایمیل ممکن است یک فعالیت برای نمایش لیستی از پیام های جدید داشته باشد. هنگامی که کاربر پیامی را انتخاب می کند، فعالیت جدیدی برای مشاهده آن پیام باز می شود. این فعالیت جدید به پشته اضافه شده است. سپس، هنگامی که کاربر به بازگشت ضربه می زند یا اشاره می کند، آن فعالیت جدید به پایان می رسد و از پشته خارج می شود.

چرخه حیات یک کار و پشته آن

صفحه اصلی دستگاه محل شروع اکثر کارها است. وقتی کاربر نماد یک برنامه یا میانبر را در راه‌انداز برنامه یا در صفحه اصلی لمس می‌کند، وظیفه آن برنامه در پیش‌زمینه قرار می‌گیرد. اگر وظیفه ای برای برنامه وجود نداشته باشد، یک کار جدید ایجاد می شود و فعالیت اصلی برای آن برنامه به عنوان فعالیت ریشه در پشته باز می شود.

هنگامی که فعالیت فعلی فعالیت دیگری را شروع می کند، فعالیت جدید در بالای پشته فشار داده می شود و تمرکز می کند. فعالیت قبلی در پشته باقی می ماند، اما متوقف می شود. هنگامی که یک فعالیت متوقف می شود، سیستم وضعیت فعلی رابط کاربری خود را حفظ می کند. هنگامی که کاربر عمل برگشت را انجام می دهد، فعالیت فعلی از بالای پشته ظاهر می شود و از بین می رود. فعالیت قبلی از سر گرفته می شود و حالت قبلی رابط کاربری آن بازیابی می شود.

فعالیت‌های پشته هرگز دوباره مرتب نمی‌شوند، فقط به پشته فشار داده می‌شوند و از آن خارج می‌شوند، زیرا با فعالیت فعلی شروع می‌شوند و توسط کاربر از طریق دکمه بازگشت یا اشاره رد می‌شوند. بنابراین، پشته پشتی به عنوان آخرین ساختار شیء به داخل، اول خارج عمل می کند. شکل 1 یک جدول زمانی را نشان می دهد که فعالیت ها به پشته فشار داده شده و از پشته خارج می شوند.

شکل 1. نمایشی از اینکه چگونه هر فعالیت جدید در یک کار یک آیتم را به پشته اضافه می کند. هنگامی که کاربر به بازگشت ضربه می زند یا اشاره می کند، فعالیت فعلی از بین می رود و فعالیت قبلی از سر گرفته می شود.

همانطور که کاربر به ضربه زدن یا اشاره به بازگشت ادامه می دهد، هر فعالیت در پشته برای نشان دادن فعالیت قبلی ظاهر می شود، تا زمانی که کاربر به صفحه اصلی یا هر فعالیتی که در زمان شروع کار در حال اجرا بود بازگردد. وقتی همه فعالیت ها از پشته حذف می شوند، وظیفه دیگر وجود ندارد.

رفتار ضربه زدن به عقب برای فعالیت های روت لانچر

فعالیت‌های راه‌انداز ریشه فعالیت‌هایی هستند که فیلتر قصد را با هر دو ACTION_MAIN و CATEGORY_LAUNCHER اعلام می‌کنند. این فعالیت‌ها منحصربه‌فرد هستند زیرا به عنوان نقاط ورود به برنامه شما از راه‌انداز برنامه عمل می‌کنند و برای شروع یک کار استفاده می‌شوند.

هنگامی که کاربر از یک فعالیت راه‌انداز ریشه به بازگشت ضربه می‌زند یا اشاره می‌کند، سیستم بسته به نسخه اندرویدی که دستگاه در حال اجرا است، رویداد را متفاوت مدیریت می‌کند.

رفتار سیستم در اندروید 11 و پایین تر
سیستم فعالیت را تمام می کند.
رفتار سیستم در اندروید 12 و بالاتر

سیستم به جای اتمام فعالیت، فعالیت و وظیفه آن را به پس‌زمینه منتقل می‌کند. این رفتار با رفتار پیش‌فرض سیستم هنگام حرکت به خارج از یک برنامه با استفاده از دکمه صفحه اصلی یا اشاره مطابقت دارد.

در بیشتر موارد، این رفتار به این معنی است که کاربران می‌توانند سریع‌تر برنامه شما را از حالت گرم از سر بگیرند، به جای اینکه مجبور باشند برنامه را به طور کامل از حالت سرد راه اندازی کنند.

اگر نیاز به ارائه پیمایش به عقب سفارشی دارید، توصیه می‌کنیم از APIهای AndroidX Activity به جای نادیده گرفتن onBackPressed() استفاده کنید. اگر هیچ مؤلفه‌ای وجود نداشته باشد که سیستم را قطع کند، APIهای Activity AndroidX به طور خودکار به رفتار سیستم مناسب تعویق می‌افتد.

با این حال، اگر برنامه شما بر روی onBackPressed() لغو می‌شود تا پیمایش برگشت را مدیریت کند و فعالیت را به پایان برساند، پیاده‌سازی خود را به‌روزرسانی کنید تا به‌جای اتمام، به super.onBackPressed() فراخوانی شود. فراخوانی super.onBackPressed() فعالیت و وظیفه آن را در صورت لزوم به پس‌زمینه منتقل می‌کند و تجربه پیمایش ثابت‌تری را برای کاربران در سراسر برنامه‌ها فراهم می‌کند.

کارهای پس زمینه و پیش زمینه

شکل 2. دو کار: وظیفه B تعامل کاربر را در پیش زمینه دریافت می کند، در حالی که وظیفه A در پس زمینه است و منتظر از سرگیری است.

وظیفه یک واحد منسجم است که می تواند وقتی کاربر کار جدیدی را شروع می کند یا به صفحه اصلی می رود به پس زمینه منتقل شود. در حالی که در پس‌زمینه، تمام فعالیت‌ها در کار متوقف می‌شوند، اما پشته پشتی کار دست‌نخورده باقی می‌ماند - همانطور که در شکل 2 نشان داده شده است، در حالی که کار دیگری انجام می‌شود، کار تمرکز خود را از دست می‌دهد. سپس یک کار می‌تواند به پیش‌زمینه بازگردد تا کاربران می توانند از جایی که کار را ترک کردند ادامه دهند.

جریان وظیفه زیر را برای Task A فعلی در نظر بگیرید که سه فعالیت در پشته خود دارد، از جمله دو مورد تحت فعالیت فعلی:

  1. کاربر از دکمه صفحه اصلی یا اشاره استفاده می کند، سپس یک برنامه جدید را از راه اندازی برنامه راه اندازی می کند.

    هنگامی که صفحه اصلی ظاهر می شود، Task A به پس زمینه می رود. هنگامی که برنامه جدید شروع می شود، سیستم یک کار را برای آن برنامه (Task B) با مجموعه فعالیت های خاص خود شروع می کند.

  2. پس از تعامل با آن برنامه، کاربر دوباره به صفحه اصلی باز می گردد و برنامه ای را که در ابتدا Task A را شروع کرده بود انتخاب می کند.

    اکنون، Task A در پیش زمینه قرار می گیرد - هر سه فعالیت در پشته آن دست نخورده هستند و فعالیت در بالای پشته از سر گرفته می شود. در این مرحله، کاربر همچنین می‌تواند با رفتن به صفحه اصلی و انتخاب نماد برنامه‌ای که آن کار را شروع کرده است یا با انتخاب کار برنامه از صفحه نمایش اخیر ، به Task B برگردد.

موارد فعالیت چندگانه

شکل 3. یک فعالیت واحد را می توان چندین بار نمونه برداری کرد.

از آنجایی که فعالیت‌های موجود در پشته هرگز مجدداً مرتب نمی‌شوند، اگر برنامه شما به کاربران اجازه می‌دهد یک فعالیت خاص را از بیش از یک فعالیت شروع کنند، نمونه جدیدی از آن فعالیت ایجاد می‌شود و به پشته فشار داده می‌شود، به‌جای اینکه هر نمونه قبلی از فعالیت را به آن بیاورد. بالا به این ترتیب، یک فعالیت در برنامه شما ممکن است چندین بار، حتی از وظایف مختلف، همانطور که در شکل 3 نشان داده شده است، نمونه برداری شود.

اگر کاربر با استفاده از دکمه برگشت یا اشاره به عقب حرکت کند، نمونه‌های فعالیت به ترتیبی که باز می‌شوند نشان داده می‌شوند و هر کدام دارای حالت رابط کاربری خاص خود هستند. با این حال، اگر نمی خواهید یک فعالیت بیش از یک بار نمونه برداری شود، می توانید این رفتار را تغییر دهید. در بخش مدیریت وظایف در مورد این موضوع بیشتر بیاموزید.

محیط های چند پنجره ای

وقتی برنامه‌ها به طور همزمان در یک محیط چند پنجره‌ای اجرا می‌شوند که در Android نسخه 7.0 (سطح API 24) و بالاتر پشتیبانی می‌شود، سیستم وظایف را به‌طور جداگانه برای هر پنجره مدیریت می‌کند. هر پنجره می تواند چندین کار داشته باشد. همین امر برای برنامه‌های اندرویدی که روی Chromebook اجرا می‌شوند نیز صادق است: سیستم وظایف یا گروه‌هایی از وظایف را بر اساس هر پنجره مدیریت می‌کند.

خلاصه چرخه زندگی

برای خلاصه کردن رفتار پیش‌فرض برای فعالیت‌ها و وظایف:

  • هنگامی که فعالیت A فعالیت B را شروع می کند، فعالیت A متوقف می شود اما سیستم حالت خود را حفظ می کند، مانند موقعیت اسکرول خود و هر متنی که در فرم ها وارد شده است. اگر کاربر در فعالیت B به ژست برگشت ضربه بزند یا از آن استفاده کند، فعالیت A با بازیابی حالت خود از سر گرفته می شود.

  • هنگامی که کاربر با استفاده از دکمه صفحه اصلی یا ژست کاری را ترک می کند، فعالیت فعلی متوقف می شود و وظیفه آن به پس زمینه می رود. سیستم وضعیت هر فعالیت را در کار حفظ می کند. اگر کاربر بعداً با انتخاب نماد راه‌اندازی که کار را آغاز کرده است، کار را از سر بگیرد، کار در پیش‌زمینه قرار می‌گیرد و فعالیت را در بالای پشته از سر می‌گیرد.

  • اگر کاربر به بازگشت ضربه بزند یا اشاره کند، فعالیت فعلی از پشته خارج می شود و از بین می رود. فعالیت قبلی در پشته از سر گرفته می شود. هنگامی که یک فعالیت از بین می رود، سیستم حالت فعالیت را حفظ نمی کند .

    وقتی برنامه شما روی دستگاهی اجرا می‌شود که اندروید 12 یا بالاتر را اجرا می‌کند ، این رفتار برای فعالیت‌های روت لانچر متفاوت است .

  • فعالیت‌ها را می‌توان چندین بار، حتی از کارهای دیگر، نمونه‌سازی کرد.

وظایف را مدیریت کنید

Android وظایف و پشته پشتی را با قرار دادن تمام فعالیت‌های شروع شده پشت سر هم در یک کار، در آخرین پشته، مدیریت می‌کند. این برای اکثر برنامه‌ها عالی عمل می‌کند و معمولاً لازم نیست نگران این باشید که فعالیت‌های شما چگونه با وظایف مرتبط هستند یا چگونه در پشته وجود دارند.

با این حال، ممکن است تصمیم بگیرید که می خواهید رفتار عادی را قطع کنید. برای مثال، ممکن است بخواهید یک فعالیت در برنامه شما به جای قرار گرفتن در وظیفه فعلی، هنگام شروع کار، کار جدیدی را شروع کند. یا هنگامی که یک فعالیت را شروع می کنید، ممکن است بخواهید به جای ایجاد یک نمونه جدید در بالای پشته، یک نمونه موجود از آن را جلو بیاورید. یا ممکن است بخواهید پشته پشتی شما از تمام فعالیت‌ها پاک شود، به جز فعالیت ریشه، زمانی که کاربر کار را ترک می‌کند.

می‌توانید این کارها و موارد دیگر را با استفاده از ویژگی‌ها در عنصر مانیفست <activity> و پرچم‌گذاری در intent که به startActivity() ارسال می‌کنید، انجام دهید.

اینها ویژگی های اصلی <activity> هستند که می توانید برای مدیریت وظایف از آنها استفاده کنید:

و اینها پرچم‌های هدف اصلی هستند که می‌توانید استفاده کنید:

بخش‌های زیر نحوه استفاده از این ویژگی‌های مانیفست و پرچم‌های قصد را برای تعریف نحوه ارتباط فعالیت‌ها با وظایف و نحوه رفتار آنها در پشته پشتی بحث می‌کنند.

همچنین ملاحظات مربوط به نحوه نمایش و مدیریت وظایف و فعالیت‌ها در صفحه اخیر مورد بحث قرار گرفته است. به طور معمول، به سیستم اجازه می‌دهید نحوه نمایش وظایف و فعالیت‌های شما را در صفحه اخیراً مشخص کند، و نیازی به تغییر این رفتار ندارید. برای اطلاعات بیشتر، به صفحه نمایش اخیر مراجعه کنید.

حالت های راه اندازی را تعریف کنید

حالت‌های راه‌اندازی به شما این امکان را می‌دهند که نحوه ارتباط یک نمونه جدید از یک فعالیت با کار فعلی را تعریف کنید. می‌توانید حالت‌های راه‌اندازی را به دو روش تعریف کنید که در بخش‌های زیر توضیح داده شده است:

  • با استفاده از فایل مانیفست

    وقتی فعالیتی را در فایل مانیفست خود اعلام می‌کنید، می‌توانید نحوه ارتباط آن فعالیت با وظایف هنگام شروع آن را مشخص کنید.

  • استفاده از پرچم های قصد

    هنگامی که startActivity() را فرا می‌خوانید، می‌توانید پرچمی را در Intent اضافه کنید که نشان می‌دهد چگونه (یا اینکه آیا) فعالیت جدید با کار فعلی مرتبط است.

بنابراین، اگر فعالیت A فعالیت B را شروع کند، فعالیت B می تواند در مانیفست خود تعریف کند که چگونه با کار فعلی مرتبط است، و فعالیت A می تواند از یک پرچم قصد برای درخواست نحوه ارتباط فعالیت B با کار فعلی استفاده کند.

اگر هر دو فعالیت مشخص کنند که فعالیت B چگونه با یک کار مرتبط می شود، آنگاه درخواست فعالیت A، همانطور که در intent تعریف شده است، بر درخواست فعالیت B، همانطور که در مانیفست آن تعریف شده است، احترام گذاشته می شود.

با استفاده از فایل مانیفست حالت های راه اندازی را تعریف کنید

هنگام اعلام فعالیت در فایل مانیفست خود، می توانید نحوه ارتباط اکتیویتی با یک کار را با استفاده از ویژگی launchMode عنصر <activity> تعیین کنید.

پنج حالت راه اندازی وجود دارد که می توانید به ویژگی launchMode اختصاص دهید:

  1. "standard"
    حالت پیش فرض سیستم نمونه جدیدی از فعالیت را در وظیفه ای که از آن شروع شده است ایجاد می کند و هدف را به سمت آن هدایت می کند. فعالیت را می توان چندین بار نمونه سازی کرد، هر نمونه می تواند به وظایف مختلفی تعلق داشته باشد و یک کار می تواند چندین نمونه داشته باشد.
  2. "singleTop"
    اگر نمونه‌ای از اکتیویتی از قبل در بالای کار فعلی وجود داشته باشد، سیستم به‌جای ایجاد یک نمونه جدید از اکتیویتی، هدف را از طریق فراخوانی متد onNewIntent() خود به آن نمونه هدایت می‌کند. اکتیویتی چندین بار نمونه‌سازی می‌شود، هر نمونه می‌تواند به وظایف مختلفی تعلق داشته باشد، و یک کار می‌تواند چندین نمونه داشته باشد (اما فقط در صورتی که فعالیت در بالای پشته پشته نمونه‌ای از فعالیت نباشد ).

    برای مثال، فرض کنید پشته پشتی یک کار شامل فعالیت ریشه A با فعالیت های B، C و D در بالا است (بنابراین پشته ABCD است، با D در بالا). یک intent برای یک فعالیت از نوع D می رسد. اگر D حالت راه اندازی "standard" پیش فرض را داشته باشد، نمونه جدیدی از کلاس راه اندازی می شود و پشته به ABCDD تبدیل می شود. با این حال، اگر حالت راه‌اندازی D "singleTop" باشد، نمونه موجود D از طریق onNewIntent() intent را دریافت می‌کند، زیرا در بالای پشته قرار دارد و پشته ABCD باقی می‌ماند. از سوی دیگر، اگر قصدی برای فعالیتی از نوع B برسد، نمونه جدیدی از B به پشته اضافه می‌شود، حتی اگر حالت راه‌اندازی آن "singleTop" باشد.

  3. "singleTask"
    این سیستم فعالیت را در ریشه یک کار جدید ایجاد می کند یا فعالیت را در یک کار موجود با همان وابستگی قرار می دهد. اگر نمونه ای از اکتیویتی از قبل وجود داشته باشد، سیستم به جای ایجاد یک نمونه جدید، قصد را از طریق فراخوانی به متد onNewIntent() خود به نمونه موجود هدایت می کند. در همین حال تمام فعالیت های دیگر بالای آن نابود می شوند.
  4. "singleInstance" .
    این رفتار مانند "singleTask" است، با این تفاوت که سیستم هیچ فعالیت دیگری را در وظیفه نگهدارنده نمونه راه اندازی نمی کند. فعالیت همیشه تنها و تنها عضو وظیفه آن است. هر فعالیتی که توسط این یکی شروع شود در یک کار جداگانه باز می شود.
  5. "singleInstancePerTask" .
    این اکتیویتی فقط می‌تواند به‌عنوان فعالیت ریشه‌ای کار، اولین فعالیتی که کار را ایجاد کرده است، اجرا شود، و بنابراین تنها یک نمونه از این فعالیت در یک کار می‌تواند وجود داشته باشد. برخلاف حالت راه‌اندازی singleTask ، اگر پرچم FLAG_ACTIVITY_MULTIPLE_TASK یا FLAG_ACTIVITY_NEW_DOCUMENT تنظیم شده باشد، می‌توان این فعالیت را در چندین نمونه در وظایف مختلف شروع کرد.

به عنوان مثال دیگر، برنامه مرورگر Android اعلام می‌کند که فعالیت مرورگر وب همیشه در وظیفه خود با مشخص کردن حالت راه‌اندازی singleTask در عنصر <activity> باز می‌شود. این بدان معنی است که اگر برنامه شما قصد باز کردن مرورگر اندروید را صادر کند، فعالیت آن در همان وظیفه برنامه شما قرار نمی گیرد. در عوض، یا یک کار جدید برای مرورگر شروع می‌شود یا اگر مرورگر قبلاً وظیفه‌ای را در پس‌زمینه اجرا می‌کند، آن کار برای رسیدگی به هدف جدید به جلو آورده می‌شود.

صرف نظر از اینکه یک فعالیت در یک کار جدید شروع می شود یا در همان کار با فعالیتی که شروع شده است، دکمه بازگشت و حرکت همیشه کاربر را به فعالیت قبلی می برد. با این حال، اگر فعالیتی را شروع کنید که حالت راه‌اندازی singleTask را مشخص می‌کند و نمونه‌ای از آن فعالیت در یک کار پس‌زمینه وجود داشته باشد، کل آن کار در پیش‌زمینه قرار می‌گیرد. در این مرحله، پشته پشته شامل تمام فعالیت‌های انجام شده در بالای پشته می‌شود. شکل 4 این نوع سناریو را نشان می دهد.

شکل 4. نمایشی از نحوه اضافه شدن یک فعالیت با حالت راه اندازی "singleTask" به پشته پشتی. اگر اکتیویتی قبلاً بخشی از یک کار پس‌زمینه با پشته پشتی خودش باشد، کل پشته پشتی نیز در بالای کار فعلی جلو می‌آید.

برای اطلاعات بیشتر در مورد استفاده از حالت های راه اندازی در فایل مانیفست، به مستندات عنصر <activity> مراجعه کنید.

حالت های راه اندازی را با استفاده از پرچم های Intent تعریف کنید

هنگام شروع یک اکتیویتی، می‌توانید با اضافه کردن پرچم‌ها در intent که به startActivity() تحویل می‌دهید، ارتباط پیش‌فرض یک اکتیویتی را با کار آن تغییر دهید. پرچم هایی که می توانید برای تغییر رفتار پیش فرض استفاده کنید به شرح زیر است:

FLAG_ACTIVITY_NEW_TASK

سیستم فعالیت را در یک کار جدید شروع می کند. اگر وظیفه ای از قبل برای اکتیویتی که شروع شده در حال اجرا باشد، آن کار با آخرین وضعیت بازیابی شده در پیش زمینه آورده می شود و اکتیویتی قصد جدید را در onNewIntent() دریافت می کند.

این همان رفتاری را ایجاد می کند که مقدار "singleTask" launchMode که در بخش قبل مورد بحث قرار گرفت.

FLAG_ACTIVITY_SINGLE_TOP

اگر اکتیویتی که شروع می شود، اکتیویتی فعلی باشد، در بالای پشته پشتی، نمونه موجود به جای ایجاد یک نمونه جدید از اکتیویتی، یک فراخوانی به onNewIntent() دریافت می کند.

این همان رفتاری را ایجاد می کند که مقدار "singleTop" launchMode که در بخش قبل مورد بحث قرار گرفت.

FLAG_ACTIVITY_CLEAR_TOP

اگر فعالیتی که شروع شده است از قبل در کار فعلی در حال اجرا باشد، سیستم به جای راه‌اندازی نمونه جدیدی از آن فعالیت، تمام فعالیت‌های دیگر را در بالای آن از بین می‌برد. intent از طریق onNewIntent() به نمونه از سرگیری شده اکتیویتی تحویل داده می شود.

هیچ ارزشی برای ویژگی launchMode که این رفتار را ایجاد می کند وجود ندارد.

FLAG_ACTIVITY_CLEAR_TOP اغلب همراه با FLAG_ACTIVITY_NEW_TASK استفاده می شود. هنگامی که این پرچم‌ها با هم استفاده می‌شوند، یک فعالیت موجود را در کار دیگری قرار می‌دهند و آن را در موقعیتی قرار می‌دهند که بتواند به هدف پاسخ دهد.

به قرابت ها رسیدگی کنید

قرابت نشان می دهد که یک فعالیت «ترجیح می دهد» به کدام وظیفه تعلق داشته باشد. به‌طور پیش‌فرض، همه فعالیت‌های یک برنامه به یکدیگر وابسته هستند: آنها «ترجیح می‌دهند» در یک کار باشند.

با این حال، می‌توانید وابستگی پیش‌فرض برای یک فعالیت را تغییر دهید. فعالیت‌های تعریف‌شده در برنامه‌های مختلف می‌توانند یک وابستگی مشترک را به اشتراک بگذارند، و فعالیت‌های تعریف‌شده در همان برنامه را می‌توان وابستگی‌های کاری متفاوتی به آنها اختصاص داد.

می‌توانید با استفاده از ویژگی taskAffinity عنصر <activity> ، وابستگی یک فعالیت را تغییر دهید.

ویژگی taskAffinity مقدار رشته ای را دریافت می کند که باید با نام بسته پیش فرض اعلام شده در عنصر <manifest> متفاوت باشد، زیرا سیستم از آن نام برای شناسایی وابستگی وظیفه پیش فرض برای برنامه استفاده می کند.

این قرابت در دو شرایط به وجود می آید:

  1. وقتی هدفی که یک فعالیت را راه‌اندازی می‌کند حاوی پرچم FLAG_ACTIVITY_NEW_TASK باشد.

    یک اکتیویتی جدید، به‌طور پیش‌فرض، در وظیفه اکتیویتی که startActivity() نامیده می‌شود، راه‌اندازی می‌شود. روی همان پشته تماس گیرنده قرار می گیرد.

    با این حال، اگر هدف ارسال شده به startActivity() حاوی پرچم FLAG_ACTIVITY_NEW_TASK باشد، سیستم به دنبال کار متفاوتی می‌گردد تا فعالیت جدید را در خود جای دهد. اغلب، این یک کار جدید است. با این حال، لازم نیست که باشد. اگر یک کار موجود با شباهت مشابه با فعالیت جدید وجود داشته باشد، فعالیت در آن کار راه اندازی می شود. اگر نه، کار جدیدی شروع می شود.

    اگر این پرچم باعث شود که فعالیتی یک کار جدید را شروع کند و کاربر از دکمه صفحه اصلی یا اشاره استفاده کند تا آن را ترک کند، باید راهی برای بازگشت کاربر به کار وجود داشته باشد. برخی از نهادها، مانند مدیر اعلان‌ها، همیشه فعالیت‌ها را در یک کار خارجی شروع می‌کنند، نه به عنوان بخشی از وظایف خودشان، بنابراین همیشه FLAG_ACTIVITY_NEW_TASK در مقاصدی که به startActivity() ارسال می‌کنند، قرار می‌دهند.

    اگر یک موجود خارجی که ممکن است از این پرچم استفاده کند می‌تواند فعالیت شما را فراخوانی کند، مراقب باشید که کاربر راه مستقلی برای بازگشت به کار شروع شده داشته باشد، مانند نماد راه‌انداز، جایی که فعالیت اصلی کار دارای هدف CATEGORY_LAUNCHER است. فیلتر کنید. برای اطلاعات بیشتر، بخش مربوط به شروع کارها را ببینید.

  2. زمانی که یک اکتیویتی دارای ویژگی allowTaskReparenting آن بر روی "true" باشد.

    در این حالت، فعالیت می‌تواند از کاری که شروع می‌کند به وظیفه‌ای که با آن وابستگی دارد، زمانی که آن کار در پیش‌زمینه قرار می‌گیرد حرکت کند.

    برای مثال، فرض کنید فعالیتی که وضعیت آب و هوا را در شهرهای انتخاب شده گزارش می کند، به عنوان بخشی از یک برنامه سفر تعریف شده است. این وابستگی مشابه فعالیت‌های دیگر در همان برنامه دارد، وابستگی پیش‌فرض برنامه، و می‌توان آن را با این ویژگی دوباره والدین کرد.

    وقتی یکی از فعالیت های شما فعالیت گزارشگر هواشناسی را شروع می کند، در ابتدا به همان وظیفه فعالیت شما تعلق دارد. با این حال، هنگامی که وظیفه برنامه سفر در پیش‌زمینه قرار می‌گیرد، فعالیت گزارشگر هواشناسی مجدداً به آن کار اختصاص داده می‌شود و در آن نمایش داده می‌شود.

پشته پشتی را پاک کنید

اگر کاربر یک کار را برای مدت طولانی ترک کند، سیستم وظیفه تمام فعالیت ها را به جز فعالیت ریشه پاک می کند. هنگامی که کاربر به وظیفه برمی گردد، فقط فعالیت ریشه بازیابی می شود. این سیستم بر اساس این فرض رفتار می‌کند که پس از مدت زمان طولانی، کاربران کارهایی را که قبلا انجام می‌دادند رها کردند و برای شروع کار جدید به کار بازمی‌گردند.

برخی از ویژگی های فعالیت وجود دارد که می توانید برای اصلاح این رفتار از آنها استفاده کنید:

alwaysRetainTaskState
هنگامی که این ویژگی در فعالیت ریشه یک کار روی "true" تنظیم می شود، رفتار پیش فرضی که توضیح داده شد اتفاق نمی افتد. وظیفه تمام فعالیت ها را حتی پس از یک دوره طولانی در پشته خود حفظ می کند.
clearTaskOnLaunch

هنگامی که این ویژگی در فعالیت ریشه یک کار روی "true" تنظیم می شود، هر زمان که کاربر کار را ترک می کند و به آن باز می گردد، وظیفه تا اکتیویتی ریشه پاک می شود. به عبارت دیگر، برعکس alwaysRetainTaskState است. کاربر همیشه در حالت اولیه خود به کار باز می گردد، حتی پس از اینکه کار را تنها برای یک لحظه ترک کرد.

finishOnTaskLaunch

این ویژگی مانند clearTaskOnLaunch است، اما بر روی یک فعالیت واحد عمل می‌کند، نه کل کار. همچنین می تواند باعث شود هر فعالیتی به جز فعالیت ریشه تمام شود. وقتی روی "true" تنظیم شود، فعالیت فقط برای جلسه فعلی بخشی از وظیفه باقی می ماند. اگر کاربر کار را ترک کند و سپس به کار برگردد، دیگر وجود ندارد.

یک کار را شروع کنید

می‌توانید یک اکتیویتی را به‌عنوان نقطه ورودی برای یک کار با دادن یک فیلتر هدف با "android.intent.action.MAIN" به‌عنوان عملکرد مشخص‌شده و "android.intent.category.LAUNCHER" به‌عنوان دسته‌بندی مشخص شده به آن تنظیم کنید:

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    ...
</activity>

یک فیلتر هدف از این نوع باعث می‌شود که یک نماد و برچسب برای فعالیت در راه‌انداز برنامه نمایش داده شود و به کاربران راهی می‌دهد تا فعالیت را راه‌اندازی کنند و هر زمان پس از راه‌اندازی به وظیفه‌ای که ایجاد می‌کند بازگردند.

این توانایی دوم مهم است. کاربران باید بتوانند یک کار را ترک کنند و بعداً با استفاده از این راه‌انداز فعالیت به آن بازگردند. به همین دلیل، فقط از دو حالت راه‌اندازی استفاده کنید که فعالیت‌ها را به‌عنوان همیشه شروع‌کننده یک کار علامت‌گذاری می‌کنند، "singleTask" و "singleInstance" ، زمانی که فعالیت دارای فیلتر ACTION_MAIN و CATEGORY_LAUNCHER باشد.

برای مثال، تصور کنید که اگر فیلتر از بین رفته باشد، چه اتفاقی می‌افتد: یک intent یک فعالیت "singleTask" را راه‌اندازی می‌کند، یک کار جدید را آغاز می‌کند، و کاربر مدتی را صرف آن کار می‌کند. سپس کاربر از دکمه Home یا ژست استفاده می کند. وظیفه اکنون به پس زمینه ارسال شده و قابل مشاهده نیست. اکنون کاربر راهی برای بازگشت به کار ندارد، زیرا در راه‌انداز برنامه نمایش داده نمی‌شود.

برای مواردی که نمی‌خواهید کاربر بتواند به یک فعالیت بازگردد، finishOnTaskLaunch عنصر <activity> را روی "true" تنظیم کنید. برای اطلاعات بیشتر، به بخش پاک کردن پشته پشتی مراجعه کنید.

اطلاعات بیشتر درباره نحوه نمایش و مدیریت وظایف و فعالیت‌ها در صفحه اخیر در صفحه اخیر موجود است.

منابع بیشتر