Экран обзора

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

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

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

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

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

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

При создании нового документа для операции вы вызываете метод startActivity() класса ActivityManager.AppTask, передавая ему intent, который запускает операцию. Для вставки логического разрыва, чтобы система обрабатывала вашу операцию как новую задачу на экране обзора, передайте флаг FLAG_ACTIVITY_NEW_DOCUMENT в метод addFlags() Intent, который запускает операцию.

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

Если вы установили флаг 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++;
  }
}

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

Когда основная операция запускает новую операцию, система ищет в существующих задачах одну, значение intent которой соответствует имени компонента и данным Intent для операции. Если задача не найдена или intent содержит флаг FLAG_ACTIVITY_MULTIPLE_TASK, создается новая задача с операцией в качестве корня. Если задача найдена, система выводит эту задачу на передний план и передает новое значение intent в 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> , 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, и на экране обзора отображается одна задача для приложения, которая возобновляется с любой последней операции, вызванной пользователем.

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

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

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

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

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

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

В операции, которая создает новую задачу на экране обзора, можно указать время удаления задачи и завершения всех связанных с ней операций, вызвав метод finishAndRemoveTask().

NewDocumentActivity.java

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

Примечание. Использование метода finishAndRemoveTask(), который переопределяет использование тега FLAG_ACTIVITY_RETAIN_IN_RECENTS, рассмотрен ниже.

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

Чтобы сохранить задачу на экране обзора, даже если ее операция завершена, передайте флаг FLAG_ACTIVITY_RETAIN_IN_RECENTS в метод 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> android:autoRemoveFromRecents значение false. Значение по умолчанию true для операций документа и false для обычных операций. Использование этого атрибута переопределяет флаг FLAG_ACTIVITY_RETAIN_IN_RECENTS, описанный выше.