المهام وحزمة التطبيقات الخلفية

المهمة هي مجموعة من الأنشطة التي يتفاعل معها المستخدمون عند محاولة تنفيذ إجراء ما في تطبيقك. ويتم ترتيب هذه الأنشطة في حزمة تسمى الحزمة الخلفية بالترتيب الذي يتم فتح كل نشاط به.

على سبيل المثال، قد يكون لتطبيق البريد الإلكتروني نشاطًا واحدًا لعرض قائمة بالرسائل الجديدة. عندما يختار المستخدم رسالة، يتم فتح نشاط جديد لعرض تلك الرسالة. تتم إضافة هذا النشاط الجديد إلى المكدس الخلفي. بعد ذلك، عندما ينقر المستخدم على زر الرجوع أو يشير إلى إيماءة الرجوع، ينتهي هذا النشاط الجديد ويخرج من الحزمة.

دورة حياة المهمة وحزمة الدعم الخاصة بها

الشاشة الرئيسية للجهاز هي نقطة البداية لمعظم المهام. عندما يلمس المستخدم رمز تطبيق أو اختصار في مشغّل التطبيقات أو على الشاشة الرئيسية، فإن مهمة هذا التطبيق تظهر في المقدمة. في حال عدم وجود مهمة للتطبيق، يتم إنشاء مهمة جديدة ويفتح النشاط الرئيسي لهذا التطبيق أثناء نشاط الجذر في الحزمة.

عندما يبدأ النشاط الحالي في نشاط آخر، يتم دفع النشاط الجديد أعلى المكدس مع التركيز. يظل النشاط السابق في المكدس، ولكن يتم إيقافه. عند إيقاف نشاط ما، يحتفظ النظام بالحالة الحالية لواجهة المستخدم الخاصة به. عندما يقوم المستخدم بتنفيذ الإجراء العكسي، يظهر النشاط الحالي من أعلى المكدس ويتم إتلافه. يُستأنف النشاط السابق، وتتم استعادة الحالة السابقة لواجهة المستخدم.

لا تتم إعادة ترتيب الأنشطة في الحزمة مطلقًا، بل يتم دفعها إلى داخل المكدس وإخراجها منها فقط عند بدء النشاط الحالي وإغلاقها للمستخدم باستخدام زر الرجوع أو الإيماءة. لذلك، يعمل المكدس الخلفي كبنية كائن آخر في التنفيذ. يوضح الشكل 1 جدولاً زمنيًا مع الأنشطة التي يتم دفعها إلى مكدس خلفية.

الشكل 1. تمثيل يوضِّح كيف يضيف كل نشاط جديد في مهمة عنصرًا إلى الحزمة الخلفية. عندما ينقر المستخدم على زر الرجوع أو إيماءاته على الرجوع، يتم محو النشاط الحالي ويتم استئناف النشاط السابق.

وبينما يستمر المستخدم في النقر أو إيماءة الرجوع، يتم إبراز كل نشاط في الحزمة لإظهار النشاط السابق، إلى أن يعود المستخدم إلى الشاشة الرئيسية أو إلى أي نشاط كان قيد التشغيل عند بدء المهمة. عندما تتم إزالة جميع الأنشطة من المكدس، لا تعد المهمة موجودة.

سلوك النقر للخلف لأنشطة مشغّل تطبيقات الجذر

أنشطة مشغّل التطبيقات الجذر هي أنشطة تتضمّن فلترًا للنية بالفعل مع كلٍ من ACTION_MAIN وCATEGORY_LAUNCHER. وتعد هذه الأنشطة فريدة من نوعها لأنها تمثل نقاط دخول إلى تطبيقك من مشغّل التطبيقات ويتم استخدامها لبدء مهمة.

عندما ينقر المستخدم على زر الرجوع أو يشير إلى رجوع من نشاط مشغّل جذر، سيعالج النظام الحدث بشكل مختلف بناءً على إصدار Android الذي يعمل به الجهاز.

سلوك النظام على نظام التشغيل Android 11 والإصدارات الأقدم
يُنهي النظام النشاط.
سلوك النظام على نظام التشغيل Android 12 والإصدارات الأحدث

ينقل النظام النشاط ومهمته إلى الخلفية بدلاً من إنهاء النشاط. يتطابق هذا السلوك مع سلوك النظام التلقائي عند الانتقال خارج تطبيق باستخدام زر الشاشة الرئيسية أو إيماءة.

في معظم الحالات، يعني هذا السلوك أنّه يمكن للمستخدمين استئناف التطبيق بسرعة أكبر من حالة التشغيل مرة أخرى، بدلاً من الاضطرار إلى إعادة تشغيل التطبيق بالكامل بعد حالة التشغيل البارد.

إذا كنت بحاجة إلى توفير رجوع مخصّص، ننصحك باستخدام واجهات برمجة تطبيقات النشاط على AndroidX بدلاً من تجاوز onBackPressed(). تلجأ واجهات برمجة تطبيقات النشاط لنظام التشغيل AndroidX تلقائيًا إلى الرجوع إلى سلوك النظام المناسب إذا لم تكن هناك أي مكوّنات تعترض النقر على الرجوع للنظام.

ومع ذلك، إذا ألغى تطبيقك onBackPressed() للتعامل مع التنقل للخلف وإنهاء النشاط، عليك تحديث التنفيذ للاتصال إلى super.onBackPressed() بدلاً من الانتهاء. يؤدي الاتصال super.onBackPressed() إلى نقل النشاط ومهمته إلى الخلفية عندما يكون ذلك مناسبًا، ويوفّر تجربة تنقّل أكثر اتساقًا للمستخدمين على مستوى التطبيقات.

المهام التي تعمل في المقدّمة وفي الخلفية

الشكل 2. مهمتان: تتلقى المهمة "ب" تفاعل المستخدم في المقدمة، بينما تكون المهمة "أ" في الخلفية، في انتظار الاستئناف.

المهمة هي وحدة متماسكة يمكن أن تنتقل إلى الخلفية عندما يبدأ المستخدم مهمة جديدة أو ينتقل إلى الشاشة الرئيسية. بينما في الخلفية، يتم إيقاف جميع الأنشطة في المهمة، ولكن تظل الحزمة الخلفية للمهمة سليمة - تفقد المهمة التركيز أثناء حدوث مهمة أخرى، كما هو موضح في الشكل 2. يمكن بعد ذلك أن تعود المهمة إلى المقدمة حتى يتمكن المستخدمون من المتابعة من حيث توقفوا.

ضع في اعتبارك تدفق المهمة التالي للمهمة "أ" الحالية التي تحتوي على ثلاثة أنشطة في مكدسها، بما في ذلك اثنان ضمن النشاط الحالي:

  1. يستخدم المستخدم زر الصفحة الرئيسية أو إيماءة، ثم يبدأ تشغيل تطبيق جديد من مشغّل التطبيقات.

    عندما تظهر الشاشة الرئيسية، تنتقل المهمة "أ" إلى الخلفية. عندما يبدأ التطبيق الجديد، يبدأ النظام مهمة لهذا التطبيق (المهمة ب) بحزمة الأنشطة الخاصة به.

  2. بعد التفاعل مع هذا التطبيق، يعود المستخدم إلى الصفحة الرئيسية مرة أخرى ويختار التطبيق الذي بدأ المهمة "أ" في الأصل.

    الآن، تأتي المهمة "أ" في المقدمة - جميع الأنشطة الثلاثة في مكدسها سليمة، ويستأنف النشاط في الجزء العلوي من المكدس. في هذه المرحلة، يمكن للمستخدم أيضًا العودة إلى المهمة "ب" عن طريق الانتقال إلى "الصفحة الرئيسية" واختيار رمز التطبيق الذي بدأ تلك المهمة، أو عن طريق اختيار مهمة التطبيق من شاشة الأخيرة.

حالات نشاط متعددة

الشكل 3. ويمكن إنشاء مثيل لنشاط واحد عدة مرات.

نظرًا لعدم إعادة ترتيب الأنشطة في الحزمة الخلفية مطلقًا، إذا سمح تطبيقك للمستخدمين ببدء نشاط معيّن من أكثر من نشاط، يتم إنشاء مثيل جديد لهذا النشاط ودفعه إلى الحزمة، بدلاً من وضع أي مثيل سابق من النشاط في الأعلى. وعلى هذا النحو، قد يتم إنشاء مثيل لنشاط واحد في تطبيقك عدة مرات، حتى من مهام مختلفة، كما هو موضح في الشكل 3.

إذا عاد المستخدم إلى الخلف باستخدام زر الرجوع أو إيماءة الرجوع، يتم الكشف عن حالات النشاط بالترتيب الذي تم فتحه، ولكل منها حالة واجهة المستخدم الخاصة بها. ومع ذلك، يمكنك تعديل هذا السلوك إذا كنت لا تريد إنشاء مثيل لنشاط ما أكثر من مرة. تعرَّف على المزيد من المعلومات حول هذا الموضوع في القسم الذي يتناول إدارة المهام.

البيئات متعددة النوافذ

عند تشغيل التطبيقات في الوقت نفسه في بيئة متعددة النوافذ، ومتوافقة مع الإصدار Android 7.0 (المستوى 24 من واجهة برمجة التطبيقات) والإصدارات الأحدث، يدير النظام المهام بشكل منفصل لكل نافذة. يمكن أن تحتوي كل نافذة على مهام متعددة. وينطبق الأمر نفسه على تطبيقات Android التي تعمل على أجهزة Chromebook: حيث يدير النظام المهام أو مجموعات المهام على أساس كل نافذة.

ملخّص مراحل النشاط

في ما يلي ملخّص للسلوك التلقائي للأنشطة والمهام:

  • عندما يبدأ النشاط "أ"، يتوقف النشاط "أ"، ولكن يحتفظ النظام بحالته، مثل موضع التمرير وأي نص تم إدخاله في النماذج. إذا نقر المستخدم على إيماءة "رجوع" أو استخدمها أثناء وجوده في النشاط "ب"، فسيستأنف النشاط "أ" مع استعادة حالته.

  • عندما يترك المستخدم مهمة باستخدام زر الشاشة الرئيسية أو إيماءة، يتم إيقاف النشاط الحالي وتنتقل مهمته إلى الخلفية. ويحتفظ النظام بحالة كل نشاط في المهمة. إذا استأنف المستخدم المهمة لاحقًا من خلال تحديد رمز مشغّل التطبيقات الذي بدأ المهمة، تظهر المهمة في المقدمة وتستأنف النشاط في الجزء العلوي من الحزمة.

  • إذا قام المستخدم بالنقر أو الإيماءات إلى الوراء، فإن النشاط الحالي يبرز من المكدس ويتم تدميره. يتم استئناف النشاط السابق في الحزمة. في حال إتلاف نشاط، لا يحتفظ النظام بحالة النشاط.

    يختلف هذا السلوك بالنسبة إلى أنشطة مشغّل التطبيقات الجذر عندما يكون تطبيقك يعمل على جهاز يعمل بالإصدار 12 من نظام التشغيل Android أو إصدار أحدث.

  • يمكن إنشاء مثيل للأنشطة عدة مرات، حتى من مهام أخرى.

إدارة المهام

يدير Android المهام والحزمة الخلفية من خلال وضع جميع الأنشطة المتتالية في نفس المهمة، في آخر حزمة. يعمل هذا بشكل رائع مع معظم التطبيقات، ولا داعي للقلق عادةً بشأن كيفية ارتباط أنشطتك بالمهام أو كيفية وجودها في المجموعة الخلفية.

ومع ذلك، قد تُقرِّر أنّك تريد مقاطعة السلوك العادي. على سبيل المثال، قد ترغب في أن يبدأ نشاط في تطبيقك مهمة جديدة عند بدئه، بدلاً من وضعه ضمن المهمة الحالية. أو، عند بدء نشاط ما، قد ترغب في جلب مثيل موجود منه، بدلاً من إنشاء مثيل جديد أعلى المكدس الخلفي. أو قد ترغب في محو المكدس الخلفي من جميع الأنشطة باستثناء نشاط الجذر عندما يغادر المستخدم المهمة.

يمكنك تنفيذ هذه الإجراءات وغيرها باستخدام السمات المتوفّرة في عنصر البيان <activity> والعلامات في الغرض الذي تنقله إلى startActivity().

في ما يلي سمات <activity> الرئيسية التي يمكنك استخدامها لإدارة المهام:

في ما يلي علامات الأهداف الرئيسية التي يمكنك استخدامها:

تناقش الأقسام التالية كيفية استخدام سمات البيان هذه وعلامات النية لتحديد كيفية ارتباط الأنشطة بالمهام وكيف تتصرف في الحزمة الخلفية.

كما تمت مناقشتها أيضًا الاعتبارات الخاصة بكيفية تمثيل المهام والأنشطة وإدارتها في شاشة "العناصر الأخيرة". عادةً ما تسمح للنظام بتحديد كيفية تمثيل مهمتك وأنشطتك في شاشة "الأماكن الأخيرة"، ولن تحتاج إلى تعديل هذا السلوك. لمزيد من المعلومات، يمكنك الاطّلاع على شاشة "الأخيرة".

تحديد أوضاع الإطلاق

تتيح لك أوضاع التشغيل تحديد كيفية ارتباط مثيل جديد من النشاط بالمهمة الحالية. يمكنك تحديد أوضاع الإطلاق بطريقتين، على النحو الموضح في الأقسام التالية:

لذلك، إذا بدأ النشاط "أ" النشاط "ب"، يمكن للنشاط "ب" أن يحدد في بيانه كيفية ارتباطه بالمهمة الحالية، ويمكن أن يستخدم النشاط "أ" علامة النية لطلب كيفية ربط النشاط "ب" بالمهمة الحالية.

إذا كان كلا النشاطين يحددان كيفية ربط النشاط "ب" بمهمة ما، يتم احترام طلب النشاط "أ"، كما هو محدد في الغرض، على طلب النشاط "ب"، على النحو الموضح في البيان.

تحديد أوضاع التشغيل باستخدام ملف البيان

عند الإعلان عن نشاط في ملف البيان، يمكنك تحديد كيفية ربط النشاط بمهمة باستخدام السمة launchMode الخاصة بالعنصر <activity>.

هناك خمسة أوضاع تشغيل يمكنك تخصيصها للسمة launchMode:

  1. "standard"
    الوضع التلقائي: ينشئ النظام مثيلاً جديدًا للنشاط في المهمة التي بدأ منها ويوجه الغرض إليها. يمكن التحقق من النشاط عدة مرات، ويمكن أن تنتمي كل حالة إلى مهام مختلفة، وقد تتضمن مهمة واحدة مثيلات متعددة.
  2. "singleTop"
    في حال توفُّر مثيل للنشاط في أعلى المهمة الحالية، يوجِّه النظام الغرض إلى ذلك المثال من خلال استدعاء إلى طريقة onNewIntent() بدلاً من إنشاء مثيل جديد من النشاط. يتم إثبات النشاط عدة مرات، ويمكن أن ينتمي كل مثيل إلى مهام مختلفة، ويمكن أن تحتوي مهمة واحدة على مثيلات متعددة (ولكن فقط إذا كان النشاط في الجزء العلوي من الحزمة الخلفية ليس مثيلاً موجودًا من النشاط).

    على سبيل المثال، لنفترض أن المكدس الخلفي لمهمة يتكون من نشاط الجذر "أ" مع الأنشطة "ب" و"ج" و"د" في الأعلى (وبذلك تكون الحزمة من A-B-C-D، وتكون D في الأعلى). يصل الغرض لنشاط من النوع D. إذا كانت D تحتوي على وضع تشغيل "standard" التلقائي، سيتم إطلاق مثيل جديد من الفئة وتصبح الحزمة A-B-C-D-D. ومع ذلك، إذا كان وضع تشغيل D هو "singleTop"، يتلقى المثيل الحالي D الغرض من خلال onNewIntent()، لأنه يكون في أعلى الحزمة، ويظل المكدس A-B-C-D. من ناحية أخرى، إذا وصلت نية إلى نشاط من النوع B، تتم إضافة مثيل جديد من B إلى المكدس حتى إذا كان وضع الإطلاق الخاص به هو "singleTop".

  3. "singleTask"
    ينشئ النظام النشاط في جذر مهمة جديدة أو يحدّد موقع النشاط في مهمة حالية ذات الاهتمامات نفسها. في حال توفُّر مثيل للنشاط، يوجِّه النظام القصد إلى المثيل الحالي من خلال استدعاء إلى طريقته onNewIntent()، بدلاً من إنشاء مثيل جديد. وفي الوقت نفسه، يتم تدمير جميع الأنشطة الأخرى الموجودة فوقها.
  4. "singleInstance".
    يكون السلوك هو نفسه بخصوص "singleTask"، باستثناء أنّ النظام لا يشغِّل أي أنشطة أخرى في المهمة التي تتضمن المثيل. النشاط هو دائمًا العضو الوحيد في مهمته. يتم فتح أي أنشطة بدأها هذا النشاط في مهمة منفصلة.
  5. "singleInstancePerTask".
    يمكن تشغيل النشاط فقط باعتباره النشاط الجذري للمهمة، أي النشاط الأول الذي تم إنشاؤه للمهمة، وبالتالي يمكن أن يكون هناك مثيل واحد فقط من هذا النشاط في المهمة. على عكس وضع تشغيل singleTask، يمكن بدء هذا النشاط في عدة حالات ضمن مهام مختلفة إذا تم ضبط العلامة FLAG_ACTIVITY_MULTIPLE_TASK أو FLAG_ACTIVITY_NEW_DOCUMENT.

مثال آخر، يُعلن تطبيق متصفّح Android أنّ نشاط متصفّح الويب يفتح دائمًا في مهمته الخاصة من خلال تحديد وضع التشغيل singleTask في العنصر <activity>. يعني هذا أنّه إذا أصدر تطبيقك نية لفتح متصفّح Android، لن يتم وضع نشاطه في المهمة نفسها مثل تطبيقك. بدلاً من ذلك، قد تبدأ مهمة جديدة في المتصفّح أو إذا كان المتصفّح يحتوي على مهمة قيد التشغيل في الخلفية، يتم تقديم هذه المهمة للتعامل مع الغرض الجديد.

بغض النظر عما إذا كان النشاط يبدأ في مهمة جديدة أو في نفس مهمة النشاط الذي بدأه، فإن زر الرجوع والإيماءة ينقلان المستخدم دائمًا إلى النشاط السابق. ومع ذلك، إذا بدأت نشاطًا يحدّد وضع تشغيل singleTask وكان هناك مثيل لهذا النشاط في مهمة تعمل في الخلفية، سيتم عرض تلك المهمة بأكملها في المقدّمة. في هذه المرحلة، تتضمن المكدس الخلفي جميع الأنشطة من المهمة التي يتم تقديمها في الجزء العلوي من المكدس. يوضح الشكل 4 هذا النوع من السيناريو.

الشكل 4. تمثيل لطريقة إضافة نشاط باستخدام وضع الإطلاق "singleTask" إلى الحزمة الخلفية. إذا كان النشاط عبارة عن جزء من مهمة تعمل في الخلفية وتتضمّن حزمة خلفية خاصة بها، تظهر أيضًا هذه الحزمة بأكملها بالإضافة إلى المهمة الحالية.

لمزيد من المعلومات حول استخدام أوضاع التشغيل في ملف البيان، يُرجى الاطّلاع على مستندات عنصر <activity>.

تحديد أوضاع الإطلاق باستخدام علامات Intent

عند بدء نشاط ما، يمكنك تعديل الارتباط التلقائي لأحد الأنشطة بمهمته عن طريق تضمين علامات في الغرض الذي تريد إرساله إلى startActivity(). في ما يلي العلامات التي يمكنك استخدامها لتعديل السلوك التلقائي:

FLAG_ACTIVITY_NEW_TASK

يبدأ النظام النشاط في مهمة جديدة. في حال بدء تشغيل مهمة حاليًا، يتم عرض تلك المهمة في المقدمة مع استعادة آخر حالة لها، ويتلقى النشاط الغرض الجديد في onNewIntent().

ينتج عن ذلك السلوك نفسه كقيمة "singleTask" launchMode التي تمت مناقشتها في القسم السابق.

FLAG_ACTIVITY_SINGLE_TOP

إذا كان النشاط الذي يتم بدؤه هو النشاط الحالي، في أعلى الحزمة الخلفية، سيتلقّى المثيل الحالي اتصالاً بـ onNewIntent() بدلاً من إنشاء مثيل جديد من النشاط.

ينتج عن ذلك السلوك نفسه كقيمة launchMode "singleTop" التي تمّت مناقشتها في القسم السابق.

FLAG_ACTIVITY_CLEAR_TOP

إذا كان النشاط الذي يتم بدؤه قيد التشغيل بالفعل في المهمة الحالية، فبدلاً من إطلاق مثيل جديد من هذا النشاط - يقوم النظام بتدمير جميع الأنشطة الأخرى فوقه. يتم تسليم الغرض إلى الحالة الاستئنافية للنشاط، الآن في أعلى الصفحة، من خلال 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.

على سبيل المثال، تخيل ما قد يحدث إذا كان الفلتر غير متوفّر: تؤدي إحدى النية إلى إطلاق نشاط "singleTask"، وبدء مهمة جديدة، ويقضى المستخدم بعض الوقت في العمل على تلك المهمة. بعد ذلك، يستخدم المستخدم زر الصفحة الرئيسية أو إيماءة. يتم الآن إرسال المهمة إلى الخلفية ولا يمكن رؤيتها. ولا يكون لدى المستخدم الآن أي طريقة للعودة إلى المهمة، لأنها غير ممثلة في مشغّل التطبيقات.

في الحالات التي لا تريد أن يتمكّن فيها المستخدم من العودة إلى نشاط، يمكنك ضبط العنصر <activity> finishOnTaskLaunch على "true". لمزيد من المعلومات، يُرجى الاطّلاع على القسم حول محو الحزمة الخلفية.

تتوفر معلومات إضافية حول كيفية تمثيل المهام والأنشطة وإدارتها في شاشة "العناصر الأخيرة" في شاشة الأخيرة.

مزيد من المراجع