page.title=Экран обзора page.tags="recents","overview" @jd:body

Содержание документа

  1. Добавление задач на экран обзора
    1. Использование флага Intent для добавления задачи
    2. Использование атрибута Операция для добавления задачи
  2. Удаление задач
    1. Использование класса AppTask для удаления задач
    2. Сохранение завершенных задач

Ключевые классы

  1. {@link android.app.ActivityManager.AppTask}
  2. {@link android.content.Intent}

Пример кода

  1. Приложения для работы с документами

Экран обзора (также используются названия: экран последних задач, список последних задач или последние приложения) является элементом пользовательского интерфейса системного уровня, в котором содержится список последних операций и задач. Пользователь может перемещаться по списку и выбирать задачи для возобновления, или жестом удалять задачи из списка. В версии Android 5.0 (уровень API 21) несколько экземпляров одной операции, содержащие различные документы, могут отображаться в виде задач на экране обзора. Например, Google Диск может иметь задачу для каждого из нескольких документов Google. На экране обзора каждый документ отображается в виде задачи.

Рисунок 1. Экран обзора, на котором показаны три документа Google Диск, представленные в виде отдельных задач.

Обычно следует разрешить системе определить способ представления ваших задач и операций на экране обзора. Вам не нужно менять это поведение. Однако приложение может определять способ и время появления операции на экране обзора. С помощью класса {@link android.app.ActivityManager.AppTask} можно управлять задачами, а с помощью флагов операции класса {@link android.content.Intent} указывается, когда операция добавляется на экран обзора или удаляется с него. Кроме того, атрибуты <activity> позволяют устанавливать поведение в манифесте.

Добавление задач на экран обзора

Использование флагов класса {@link android.content.Intent} для добавления задачи обеспечивает лучшее управление временем и способом открытия или повторного открытия документа на экране обзора. С помощью атрибутов <activity> можно выбрать открытие документа в новой задаче или повторное использование существующей задачи для документа.

Использование флага Intent для добавления задачи

При создании нового документа для операции вы вызываете метод {@link android.app.ActivityManager.AppTask#startActivity(android.content.Context, android.content.Intent, android.os.Bundle) startActivity()} класса {@link android.app.ActivityManager.AppTask}, передавая ему intent, который запускает операцию. Для вставки логического разрыва, чтобы система обрабатывала вашу операцию как новую задачу на экране обзора, передайте флаг {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} в метод {@link android.content.Intent#addFlags(int) addFlags()} {@link android.content.Intent}, который запускает операцию.

Примечание. Флаг {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} замещает флаг {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET}, который является устаревшим для систем Android 5.0 и выше (уровень API 21).

Если вы установили флаг {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} при создании нового документа, система всегда создает новую задачу с целевой операцией в качестве корня. Этот параметр позволяет открывать один документ в нескольких задачах. Следующий код показывает, как это делает основная операция:

DocumentCentricActivity.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 = mCheckbox.isChecked();
      final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
      newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
      newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
      return newDocumentIntent;
  }

  private static int incrementAndGet() {
      Log.d(TAG, "incrementAndGet(): " + mDocumentCounter);
      return mDocumentCounter++;
  }
}

Примечание. Операции, запущенные с флагом {@code FLAG_ACTIVITY_NEW_DOCUMENT}, должны иметь значение атрибута {@code android:launchMode="standard"} (по умолчанию), установленное в манифесте.

Когда основная операция запускает новую операцию, система ищет в существующих задачах одну, значение intent которой соответствует имени компонента и данным Intent для операции. Если задача не найдена или intent содержит флаг {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}, создается новая задача с операцией в качестве корня. Если задача найдена, система выводит эту задачу на передний план и передает новое значение intent в {@link android.app.Activity#onNewIntent onNewIntent()}. Новая операция получает intent и создает новый документ на экране обзора, как в следующем примере:

NewDocumentActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_new_document);
    mDocumentCount = getIntent()
            .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0);
    mDocumentCounterTextView = (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> , {@code android:documentLaunchMode}. Этот атрибут имеет четыре значения, которые работают следующим образом, когда пользователь открывает документ в приложении:

"{@code intoExisting}"
Операция повторно использует существующую задачу для документа. Это равносильно установке флага {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} без установки флага {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}, как описано в разделе Использование флага Intent для добавления задачи выше.
"{@code always}"
Операция создает новую задачу для документа, даже если документ уже открыт. Использование этого значения равносильно установке обоих флагов {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} и {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}.
"{@code none”}"
Операция не создает новой задачи для документа. Экран обзора обрабатывает операцию как операцию по умолчанию: на экране обзора отображается одна задача для приложения, которая возобновляется с любой последней операции, вызванной пользователем.
"{@code never}"
Операция не создает новой задачи для документа. Установка этого значения переопределяет поведение флагов {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} и {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}, если оба они установлены в intent, и на экране обзора отображается одна задача для приложения, которая возобновляется с любой последней операции, вызванной пользователем.

Примечание. Для значений кроме {@code none} и {@code never} операция должна быть определена с атрибутом {@code launchMode="standard"}. Если этот атрибут не указан, используется {@code documentLaunchMode="none"}.

Удаление задач

По умолчанию задача документа автоматически удаляется с экрана обзора после завершения соответствующей операции. Можно переопределить это поведение с помощью класса {@link android.app.ActivityManager.AppTask}, с флагом {@link android.content.Intent} или атрибутом <activity>.

Можно в любой момент полностью убрать задачу с экрана обзора, установив для атрибута <activity> {@code android:excludeFromRecents} значение {@code true}.

Можно установить максимальное число задач, которое ваше приложение может включить в экран обзора, установив для атрибута <activity> {@code android:maxRecents} целое значение. Значение по умолчанию: 16. При достижении максимального количества задач самая долго не используемая задача удаляется с экрана обзора. Максимальное значение {@code android:maxRecents} составляет 50 (25 для устройств с малым объемом памяти); Значения менее 1 не допускаются.

Использование класса AppTask для удаления задач

В операции, которая создает новую задачу на экране обзора, можно указать время удаления задачи и завершения всех связанных с ней операций, вызвав метод {@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()}.

NewDocumentActivity.java

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

Примечание. Использование метода {@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()}, который переопределяет использование тега {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS}, рассмотрен ниже.

Сохранение завершенных задач

Чтобы сохранить задачу на экране обзора, даже если ее операция завершена, передайте флаг {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} в метод {@link android.content.Intent#addFlags(int) addFlags()} объекта Intent, который запускает операцию.

DocumentCentricActivity.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, incrementAndGet());
    return newDocumentIntent;
}

Для достижения того же результата установите для атрибута <activity> {@code android:autoRemoveFromRecents} значение {@code false}. Значение по умолчанию {@code true} для операций документа и {@code false} для обычных операций. Использование этого атрибута переопределяет флаг {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS}, описанный выше.