Как выйти из режима Picture-in-Picture?
У нас есть enterPictureInPictureMode()
для перемещения активности из ее текущей формы в представление "картинка в картинке" .
Каковы средства, с помощью которых мы возвращаем это, возвращая активность в нормальное состояние, помимо уничтожения активности? В Activity
нет метода exitPictureInPictureMode()
, leavePictureInPictureMode()
или janeGetMeOffThisCrazyPictureInPictureModeThing()
, и в документации, похоже, не рассматривается альтернатива.
Меня интересует решение для Android O, для режима "картинка в картинке" на мобильных устройствах, хотя, если это работает и для Android TV, замечательно!
UPDATE 2017-04-08. Если вы хотите вернуться в обычный режим, когда пользователь нажимает кнопку X для выхода из режима "картинка в картинке" , вы можете сделать что-то вроде этого:
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode);
if (!isInPictureInPictureMode) {
getApplication().startActivity(new Intent(this, getClass())
.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT));
}
}
Ключевыми битами являются вызов startActivity()
, чтобы снова запустить текущую активность с помощью FLAG_ACTIVITY_REORDER_TO_FRONT
. При активности singleTask
вам нужно вызвать это в некотором контексте не Activity
, например, Application
singleton. Кажется, это не вызывает onStop()
или onStart()
, но вызывает триггер onNewIntent()
(с любым Intent
вы переходите к startActivity()
).
Ответы
Ответ 1
-
Переместите операцию на спину
activity.moveTaskToBack(false /* nonRoot */);
-
восстановить активность на передней панели
Intent startIntent = new Intent(PipActivity.this, PipActivity.class);
startIntent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
activity.startActivity(startIntent);
Ответ 2
Я не думаю, что активность может решить оставить режим Picture-in-picture.
Из Предварительный просмотр Android O API:
Действие, входящее в режим PIP, переходит в состояние паузы, но остается включенным. Если пользователь отбирает активность PIP, система показывает меню для взаимодействия с пользователем; никакие события касания не достигают активности, пока она находится в состоянии PIP.
Активность будет уведомляться onPictureInPictureModeChanged()
.
Ответ 3
Официальная документация говорит, что в окне PIP появляется меню, которое позволяет переключаться на полный экран.
Окно PIP 240x135 dp и отображается на самом верхнем слое в одном из четырех углов экрана, выбранных системой. Пользователь может вывести меню PIP, которое позволяет им переключаться в окно PIP. в полноэкранном режиме или закрыть окно PIP, удерживая кнопку "Домой" на пульте дистанционного управления. Если на главном экране начинает воспроизводиться другое видео, Окно PIP автоматически закрывается.
И вы можете переопределить событие PIP, чтобы обрабатывать элементы пользовательского интерфейса, когда пользователь переключает режим PIP.
ссылка на onPictureInPictureModeChanged
@Override
public void onPictureInPictureModeChanged(boolean isInPictureInPictureMode) {
if (isInPictureInPictureMode) {
// Hide the controls in picture-in-picture mode.
...
} else {
// Restore the playback UI based on the playback status.
...
}
}
Ответ 4
Я нашел 100% надежный способ сделать это.
- Установите атрибут
taskAffinity
для вашей активности PIP в манифесте, например, "com.package.pip". Неважно, что, оно просто должно отличаться от имени вашего пакета, которое является заданием по умолчанию. Это заставит его запускаться в совершенно отдельном стеке, как если бы это было совсем другое приложение. - Всякий раз, когда вы хотите выйти из PIP, запустите его с помощью
startActivity(new Intent(this, PipActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
из другого действия.
Я просто посмотрел на то, что происходит, когда основное действие приложения в данный момент находится в режиме PIP, и вы запускаете его из панели запуска, и думали, что я могу повторить это, и я действительно мог.
Ответ 5
У меня такая же проблема:
-
MainActivity
открывает VideoPlayerActivity
котором включен режим PIP. - Нажмите кнопку назад, чтобы перейти в режим PIP.
- Нажмите кнопку "Назад" еще раз, пока я не
MainActivity
из MainActivity
. - Нажмите кнопку закрытия (
X
) в окне PIP. - Откройте приложение, оно откроет
VideoPlayerActivity
.
Хотя ни одно из перечисленных выше решений не работает для меня, я обнаружил, что единственный способ прослушать кнопку X
- это переопределить onStop
.
Когда действие восстанавливается из PIP, onResume
и onPictureInPictureModeChanged
, при нажатии кнопки X
onStop
и onPictureInPictureModeChanged
.
Поэтому я попытался вызвать onPictureInPictureModeChanged
finish()
внутри onPictureInPictureModeChanged
когда onStop
уже вызывается.
override fun onStop() {
super.onStop()
onStopCalled = true
}
override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) {
if (isInPictureInPictureMode) {
// ...
} else {
if (onStopCalled) {
finish()
}
}
}