شاشة الأحدث

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

تستخدم شاشة "التطبيقات الأخيرة" نظامًا يركز على المستند : تم طرحه في 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() يحصل النشاط الجديد على الهدف وينشئ مستندًا جديدًا في "Recent" (الأحدث) كما هو موضح في المثال التالي:

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 الأعلام. إذا تم ضبط أي من هذين الخيارين في intent، وستظهر شاشة "Recents" (الأحدث) مهمة واحدة للتطبيق، فإنه يستأنف من أي نشاط تم استدعاء آخر مرة.

إزالة المهام

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