Как запустить приложение на втором экране на устройствах с несколькими дисплеями

#android #kotlin #android-activity #android-multi-display

Вопрос:

Я работаю над приложением для Android, предназначенным для работы только на устройствах с двумя экранами (под управлением API 29). У меня есть два несколько связанных вопроса:

1. Можно ли запустить приложение непосредственно на втором дисплее вместо основного дисплея? Прямо сейчас он запускается на основном дисплее, и затем я могу запустить последующее действие на втором дисплее с помощью ActivityOptions .

Например:

 val exampleIntent = Intent(this, ExampleActivity::class.java)
exampleIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(
    exampleIntent, 
    ActivityOptions.makeBasic().setLaunchDisplayId(secondDisplayId).toBundle() 
)
 

2) Можно ли явно завершить действие, выполняемое на втором дисплее, перед его перезапуском?

У меня есть случай использования, в котором мне нужно перезапустить действие на втором дисплее (с основного дисплея) при выполнении некоторого условия. Однако, если это действие уже выполняется на втором экране, оно не перезапускается.

Есть ли способ завершить/закрыть это действие перед его запуском?

Ответ №1:

Можно ли запустить приложение непосредственно на втором дисплее вместо основного дисплея?

Это зависит от того, кто будет осуществлять запуск. Например, если запуск выполняется программой запуска, она должна будет указать, что действие точки входа вашего приложения должно отображаться на дополнительном дисплее.

Можно ли явно завершить действие, выполняемое на втором дисплее, перед его перезапуском?

Это действие может потребовать finish() завершения самого себя. Вам нужно сказать упражнению, чтобы оно сделало это тем или иным способом, или упражнение должно само по себе знать, что пришло время заканчивать. Например, действие вторичного отображения может реагировать на то же условие, которое вы приводите в следующем предложении:

У меня есть случай использования, в котором мне нужно перезапустить действие на втором дисплее (с основного дисплея) при выполнении некоторого условия

Честно говоря, это похоже на ограничение в кодировании, которое вы сами себе навязали. С точки зрения операционной системы неясно, что вы получаете, уничтожая и воссоздавая действие.

И это поведение может выглядеть плохо, в зависимости от того, какую среду с двумя экранами вы используете. Например, если дополнительный дисплей представляет собой что-то вроде телевизора, монитора или проектора, поведение Android по умолчанию заключается в отображении основного дисплея на дополнительном дисплее. Я бы ожидал, что в вашем предлагаемом поведении будет заметное мерцание:

  • Вы уничтожаете старую вторичную деятельность
  • Android начинает зеркальное отображение основного дисплея на дополнительном дисплее
  • Вы начинаете замещающее вторичное действие

Поэтому я приложил бы большие усилия, чтобы избежать необходимости уничтожать и перезапускать активность. Например, возможно, на дополнительном дисплее должно отображаться не действие, а скорее a Presentation (что больше похоже на a Dialog ). Или, возможно, вторичное действие может просто обновить свой собственный пользовательский интерфейс в ответ на ваше указанное условие, а не перестраиваться с нуля.

Комментарии:

1. Спасибо за подробный ответ. Не могли бы вы, пожалуйста, немного подробнее рассказать о том, что лаунчер должен указывать точку входа приложения, чтобы перейти на дополнительный дисплей?

2. @hamrosvet: В принципе, нужно было бы использовать пусковую ActivityOptions установку , как вы указали в своем вопросе.