صفحه نمایش اخیر

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

صفحه Recents از یک مدل سندمحور استفاده می کند - که در Android 5.0 (سطح API 21) معرفی شده است - که در آن چندین نمونه از یک فعالیت یکسان حاوی اسناد مختلف می توانند به عنوان وظایف در صفحه Recents ظاهر شوند. به عنوان مثال، Google Drive ممکن است برای هر یک از چندین سند Google وظیفه ای داشته باشد. هر سند به عنوان یک کار در صفحه Recents ظاهر می شود:

صفحه اخیراً دو سند Google Drive را نشان می دهد که هر کدام به عنوان یک کار جداگانه نمایش داده می شوند.

مثال رایج دیگر زمانی است که کاربر از مرورگر خود استفاده می‌کند و روی Share > Gmail ضربه می‌زند. صفحه نوشتن برنامه Gmail ظاهر می شود. با ضربه زدن روی دکمه Recents در آن زمان، Chrome و Gmail در حال اجرا به عنوان وظایف جداگانه هستند:

صفحه نمایش اخیر که کروم و جیمیل را به عنوان کارهای جداگانه در حال اجرا نشان می دهد.

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

کلاس ActivityManager.AppTask به شما امکان می دهد وظایف را مدیریت کنید، و پرچم های فعالیت کلاس Intent به شما امکان می دهد مشخص کنید که یک فعالیت چه زمانی از صفحه Recents اضافه یا حذف شود. همچنین، ویژگی‌های <activity> به شما امکان می‌دهند رفتار را در مانیفست تنظیم کنید.

کارها را به صفحه اخیر اضافه کنید

استفاده از پرچم‌های کلاس Intent برای افزودن یک کار به شما کنترل بیشتری روی زمان و نحوه باز شدن یا بازگشایی یک سند در صفحه Recents می‌دهد. وقتی از ویژگی‌های <activity> استفاده می‌کنید، می‌توانید بین همیشه باز کردن سند در یک کار جدید یا استفاده مجدد از یک کار موجود برای سند یکی را انتخاب کنید.

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

هنگامی که یک سند جدید برای اکتیویتی خود ایجاد می کنید، متد startActivity() را فراخوانی می کنید و هدفی را که فعالیت را راه اندازی می کند به آن منتقل می کنید. برای درج یک شکست منطقی به طوری که سیستم با فعالیت شما به عنوان یک کار جدید در صفحه Recents رفتار کند، پرچم FLAG_ACTIVITY_NEW_DOCUMENT را در متد addFlags() در Intent که فعالیت را راه اندازی می کند، ارسال کنید.

اگر هنگام ایجاد سند جدید، پرچم FLAG_ACTIVITY_MULTIPLE_TASK را تنظیم کنید، سیستم همیشه یک کار جدید با فعالیت هدف به عنوان ریشه ایجاد می کند. این تنظیم به یک سند اجازه می دهد تا در بیش از یک کار باز شود. کد زیر نشان می دهد که چگونه اکتیویتی اصلی این کار را انجام می دهد:

کاتلین

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++)
        }

جاوا

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 بود، یک کار جدید با فعالیت به عنوان ریشه آن ایجاد می‌شود.

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

کاتلین

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)
}

جاوا

@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 است، همانطور که در بخش استفاده از پرچم قصد برای افزودن یک کار توضیح داده شده است.
always
فعالیت یک کار جدید برای سند ایجاد می کند، حتی اگر سند قبلاً باز شده باشد. استفاده از این مقدار همانند تنظیم پرچم‌های FLAG_ACTIVITY_NEW_DOCUMENT و FLAG_ACTIVITY_MULTIPLE_TASK است.
none
فعالیت کار جدیدی برای سند ایجاد نمی کند. صفحه Recents با فعالیت به صورت پیش فرض رفتار می کند. این یک کار واحد را برای برنامه نمایش می دهد، که از هر فعالیتی که کاربر آخرین بار فراخوانده است، از سر گرفته می شود.
never
فعالیت کار جدیدی برای سند ایجاد نمی کند. تنظیم این مقدار رفتار پرچم‌های FLAG_ACTIVITY_NEW_DOCUMENT و FLAG_ACTIVITY_MULTIPLE_TASK را لغو می‌کند. اگر هر یک از اینها در intent تنظیم شده باشد و صفحه Recents یک وظیفه را برای برنامه نمایش دهد، از هر فعالیتی که کاربر آخرین بار فراخوانده است از سر گرفته می شود.

وظایف را حذف کنید

به طور پیش‌فرض، پس از پایان فعالیت، یک کار سند به‌طور خودکار از صفحه اخیراً خارج می‌شود. می توانید این رفتار را با کلاس ActivityManager.AppTask ، با یک پرچم Intent یا با ویژگی <activity> لغو کنید.

همیشه می‌توانید با تنظیم ویژگی <activity> android:excludeFromRecents روی true ، یک کار را از صفحه Recents حذف کنید.

با تنظیم ویژگی <activity> android:maxRecents به یک مقدار صحیح، می‌توانید حداکثر تعداد کارهایی را که برنامه شما می‌تواند در صفحه Recents شامل شود، تنظیم کنید. وقتی به حداکثر تعداد کارها رسیدید، کار اخیراً کمتر استفاده شده از صفحه نمایش اخیر ناپدید می شود. پیش فرض 16 و حداکثر مقدار 50 است (25 در دستگاه های با حافظه کم). مقادیر کمتر از 1 معتبر نیستند.

از کلاس AppTask برای حذف وظایف استفاده کنید

در اکتیویتی که یک کار جدید در صفحه Recents ایجاد می‌کند، می‌توانید با فراخوانی متد finishAndRemoveTask() تعیین کنید که چه زمانی آن کار حذف شود و تمام فعالیت‌های مرتبط با آن تمام شود:

کاتلین

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

جاوا

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

کارهای تمام شده را حفظ کنید

اگر می‌خواهید یک کار را در صفحه Recents حفظ کنید، حتی اگر فعالیت آن تمام شده باشد، پرچم FLAG_ACTIVITY_RETAIN_IN_RECENTS را در متد addFlags() هدفی که فعالیت را راه‌اندازی می‌کند، ارسال کنید.

کاتلین

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())
        }

جاوا

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 یا بالاتر، کاربران می‌توانند پیوندهای محتوای وب را که اخیراً مشاهده کرده‌اند را مستقیماً از صفحه نمایش اخیر به اشتراک بگذارند. پس از بازدید از محتوای یک برنامه، کاربر می تواند به صفحه Recents بکشد و برنامه ای را که در آن محتوا را مشاهده کرده است بیابد، سپس روی دکمه پیوند ضربه بزنید تا URL را کپی یا به اشتراک بگذارید.

صفحه نمایش اخیر با پیوندی برای اشتراک گذاری محتوای وب که اخیراً مشاهده شده است.

همانطور که در مثال زیر نشان داده شده است، هر برنامه‌ای می‌تواند با ارائه یک رابط کاربری وب و نادیده گرفتن onProvideAssistContent() ، پیوند Recents را برای کاربران فعال کند:

کاتلین

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"))
    }
}

جاوا

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"));
    }
}