Экран «Последние», также называемый экраном «Обзор», списком последних задач или экраном последних приложений, представляет собой пользовательский интерфейс системного уровня, в котором перечислены недавно использованные действия и задачи . Пользователь может перемещаться по списку, выбирать задачу для возобновления или удалять задачу из списка, проведя по ней пальцем.
На экране «Недавние» используется модель, ориентированная на документы , представленная в Android 5.0 (уровень API 21), в которой несколько экземпляров одного и того же действия, содержащих разные документы, могут отображаться как задачи на экране «Недавние». Например, на Google Диске может быть задача для каждого из нескольких документов Google. Каждый документ отображается как задача на экране «Последние».
Другой распространенный пример — когда пользователь использует свой браузер и нажимает «Поделиться» > Gmail . Появится экран создания сообщения в приложении Gmail. Нажатие кнопки «Недавние» в этот момент показывает, что Chrome и Gmail выполняются как отдельные задачи:
Обычно вы позволяете системе определять, как ваши задачи и действия будут представлены на экране «Последние». Вам не нужно изменять это поведение. Однако ваше приложение может определять, как и когда действия появляются на экране «Последние».
Класс ActivityManager.AppTask
позволяет управлять задачами, а флаги активности класса Intent
позволяют указать, когда действие добавляется или удаляется с экрана «Последние». Кроме того, атрибуты <activity>
позволяют задать поведение в манифесте.
Добавьте задачи на экран «Последние»
Использование флагов класса Intent
для добавления задачи дает вам больший контроль над тем, когда и как документ будет открыт или повторно открыт на экране «Последние». Используя атрибуты <activity>
, вы можете выбирать: всегда открывать документ в новой задаче или повторно использовать существующую задачу для документа.
Используйте флаг намерения, чтобы добавить задачу
Когда вы создаете новый документ для своей активности, вы вызываете метод startActivity()
, передавая ему намерение, которое запускает активность. Чтобы вставить логический разрыв, чтобы система воспринимала ваше действие как новую задачу на экране «Последние», передайте флаг 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
, создается новая задача с действием в качестве ее корня.
Если система находит задачу, намерение которой соответствует имени компонента намерения и данным намерения, она выводит эту задачу на передний план и передает новое намерение в onNewIntent()
. Новое действие получает намерение и создает новый документ на экране «Последние», как показано в следующем примере:
Котлин
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
- Действие не создает новую задачу для документа. На экране «Недавние» действия обрабатываются так, как по умолчанию. Он отображает одну задачу для приложения, которая возобновляется с любого действия, которое последний раз вызывал пользователь.
-
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()
:
Котлин
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(); }
Сохраняйте выполненные задачи
Если вы хотите сохранить задачу на экране «Последние», даже если ее действие завершено, передайте флаг 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 или более поздней версии пользователи могут делиться ссылками на недавно просмотренный веб-контент прямо с экрана «Последние». После посещения контента в приложении пользователь может перейти на экран «Недавние» и найти приложение, в котором он просматривал контент, а затем нажать кнопку ссылки, чтобы скопировать или поделиться URL-адресом.
Любое приложение может включить для пользователей связывание последних данных, предоставив веб-интерфейс и переопределив onProvideAssistContent()
, как показано в следующем примере:
Котлин
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")); } }