شاشة الأحدث

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

تستخدم شاشة "العناصر الأخيرة" نموذجًا يتمحور حول المستندات، تم طرحه في Android 5.0 (مستوى واجهة برمجة التطبيقات 21)، وفيه يمكن أن تظهر أمثلة متعددة من النشاط نفسه الذي يحتوي على مستندات مختلفة كمهام في شاشة "الأخيرة". على سبيل المثال، قد يكون لدى Google Drive مهمة لكل مستند من مستندات Google المتعددة. تظهر كل مستند كمهمة في شاشة "الأحدث":

شاشة "العناصر الأخيرة" التي تعرض مستندَين من Google Drive، ويتم تمثيل كل منهما كمهمة منفصلة.

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

شاشة "العناصر الأخيرة" التي تعرض Chrome وGmail كمهام منفصلة.

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

تتيح لك الفئة ActivityManager.AppTask إدارة المهام، وتتيح لك علامات النشاط لفئة Intent إمكانية تحديد وقت إضافة نشاط أو إزالته من شاشة "العناصر الأخيرة". بالإضافة إلى ذلك، تتيح لك سمات <activity> ضبط السلوك في البيان.

إضافة مهام إلى شاشة "الأماكن الأخيرة"

يمنحك استخدام علامات الفئة Intent لإضافة مهمة تحكمًا أكبر في وقت وكيفية فتح مستند أو إعادة فتحه في شاشة "العناصر الأخيرة". عند استخدام السمات <activity>، يمكنك الاختيار بين فتح المستند دائمًا في مهمة جديدة أو إعادة استخدام مهمة حالية للمستند.

استخدام علامة Intent لإضافة مهمة

عند إنشاء مستند جديد لنشاطك، عليك استدعاء الطريقة startActivity()، وتمرير الهدف الذي يُطلق النشاط إليه. لإدراج فاصل منطقي حتى يتعامل النظام مع نشاطك كمهمة جديدة في شاشة "العناصر الأخيرة"، مرِّر العلامة FLAG_ACTIVITY_NEW_DOCUMENT في طريقة addFlags() ضمن طريقة Intent التي تبدأ النشاط.

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

Kotlin

fun createNewDocument(view: View) {
    val newDocumentIntent = newDocumentIntent()
    if (useMultipleTasks) {
        newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK)
    }
    startActivity(newDocumentIntent)
}

private fun newDocumentIntent(): Intent =
        Intent(this, NewDocumentActivity::class.java).apply {
            addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT or
                    android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS)
            putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, documentCounter++)
        }

Java

public void createNewDocument(View view) {
      final Intent newDocumentIntent = newDocumentIntent();
      if (useMultipleTasks) {
          newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
      }
      startActivity(newDocumentIntent);
  }

  private Intent newDocumentIntent() {
      boolean useMultipleTasks = checkbox.isChecked();
      final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
      newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
      newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, documentCounter++);
      return newDocumentIntent;
  }

}

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

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

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_new_document)
    documentCount = intent
            .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0)
    documentCounterTextView = findViewById(R.id.hello_new_document_text_view)
    setDocumentCounterText(R.string.hello_new_document_counter)
}

override fun onNewIntent(newIntent: Intent) {
    super.onNewIntent(newIntent)
    /* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this Activity
    will be reused. */
    setDocumentCounterText(R.string.reusing_document_counter)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_document);
    documentCount = getIntent()
            .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0);
    documentCounterTextView = (TextView) findViewById(
            R.id.hello_new_document_text_view);
    setDocumentCounterText(R.string.hello_new_document_counter);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    /* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this activity
    is reused to create a new document.
     */
    setDocumentCounterText(R.string.reusing_document_counter);
}

استخدام سمة النشاط لإضافة مهمة

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

intoExisting
يعيد النشاط استخدام مهمة حالية للمستند. يماثل هذا ضبط العلامة FLAG_ACTIVITY_NEW_DOCUMENT بدون ضبط العلامة FLAG_ACTIVITY_MULTIPLE_TASK على النحو الموضّح في القسم استخدام علامة Intent لإضافة مهمة.
always
ينشئ النشاط مهمة جديدة للمستند، حتى إذا كان المستند مفتوحًا. وتُستخدم هذه القيمة، تمامًا كإعداد كل من علامتَي FLAG_ACTIVITY_NEW_DOCUMENT وFLAG_ACTIVITY_MULTIPLE_TASK.
none
لا يؤدي النشاط إلى إنشاء مهمة جديدة للمستند. تتعامل شاشة "الأماكن الأخيرة" مع النشاط كما تفعل بشكل افتراضي. ويعرض مهمة واحدة للتطبيق يتم استئنافها من أي نشاط استدعى المستخدم آخر مرة.
never
لا يؤدي النشاط إلى إنشاء مهمة جديدة للمستند. يؤدي ضبط هذه القيمة إلى إلغاء سلوك العلامتين FLAG_ACTIVITY_NEW_DOCUMENT وFLAG_ACTIVITY_MULTIPLE_TASK. فإذا تم تعيين أي منهما في الغرض، وعرضت شاشة "العناصر الأخيرة" مهمة واحدة للتطبيق، يتم استئنافها من أي نشاط استدعى المستخدم آخر مرة.

إزالة المهام

بشكل افتراضي، يتم الخروج من مهمة المستند تلقائيًا من شاشة "العناصر الأخيرة" عند انتهاء نشاطها. يمكنك إلغاء هذا السلوك باستخدام الفئة ActivityManager.AppTask من خلال وضع علامة Intent أو باستخدام السمة <activity>.

يمكنك دائمًا استبعاد مهمة من شاشة "العناصر الأخيرة" بالكامل من خلال ضبط سمة <activity> android:excludeFromRecents على true.

يمكنك ضبط الحدّ الأقصى لعدد المهام التي يمكن لتطبيقك تضمينها في شاشة "الأخيرة" عن طريق ضبط السمة <activity> android:maxRecents على قيمة عدد صحيح. عند الوصول إلى الحد الأقصى لعدد المهام، تختفي المهمة الأقل استخدامًا مؤخرًا من شاشة "العناصر الأخيرة". القيمة الافتراضية هي 16، والحد الأقصى للقيمة هو 50 (25 على الأجهزة ذات الذاكرة المنخفضة). القيم الأقل من 1 غير صالحة.

استخدام فئة AppTask لإزالة المهام

في النشاط الذي ينشئ مهمة جديدة في شاشة "العناصر الأخيرة"، يمكنك تحديد وقت إزالة المهمة وإنهاء جميع الأنشطة المرتبطة بها من خلال استدعاء الطريقة finishAndRemoveTask():

Kotlin

fun onRemoveFromOverview(view: View) {
    // It is good pratice to remove a document from the overview stack if not needed anymore.
    finishAndRemoveTask()
}

Java

public void onRemoveFromRecents(View view) {
    // The document is no longer needed; remove its task.
    finishAndRemoveTask();
}

الاحتفاظ بالمهام المكتملة

إذا أردت الاحتفاظ بمهمة في شاشة "العناصر الأخيرة"، حتى إذا كان نشاطها قد انتهى، ضَع علامة FLAG_ACTIVITY_RETAIN_IN_RECENTS في طريقة addFlags() للهدف الذي يؤدي إلى بدء النشاط.

Kotlin

private fun newDocumentIntent() =
        Intent(this, NewDocumentActivity::class.java).apply {
            addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT or
                    android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS)
            putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, getAndIncrement())
        }

Java

private Intent newDocumentIntent() {
    final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
    newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT |
      android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
    newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, getAndIncrement());
    return newDocumentIntent;
}

لتحقيق التأثير نفسه، اضبط السمة <activity> android:autoRemoveFromRecents على false. القيمة التلقائية هي true لأنشطة المستندات وfalse للأنشطة العادية. يؤدي استخدام هذه السمة إلى إلغاء العلامة FLAG_ACTIVITY_RETAIN_IN_RECENTS.

تفعيل مشاركة عناوين URL الحديثة (على هواتف Pixel فقط)

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

شاشة "الأماكن الأخيرة" التي تحتوي على رابط لمشاركة محتوى الويب الذي تم الاطّلاع عليه مؤخرًا.

يمكن لأي تطبيق تفعيل ربط "العناصر الأخيرة" للمستخدمين من خلال توفير واجهة مستخدم على الويب وتجاهل onProvideAssistContent()، كما هو موضّح في المثال التالي:

Kotlin

class MainActivity : AppCompatActivity() {
    protected fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    fun onProvideAssistContent(outContent: AssistContent) {
        super.onProvideAssistContent(outContent)
        outContent.setWebUri(Uri.parse("https://example.com/myCurrentPage"))
    }
}

Java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    public void onProvideAssistContent(AssistContent outContent) {
        super.onProvideAssistContent(outContent);

        outContent.setWebUri(Uri.parse("https://example.com/myCurrentPage"));
    }
}