Активность onStop() не вызывается при нажатии кнопки «Домой» в многооконном режиме Android N

Я пытаюсь сделать так, чтобы наше видеоприложение поддерживало многооконный режим Android N. Я обнаружил, что жизненный цикл активности становится запутанным в многооконном режиме. Явление заключается в том, что когда наше приложение размещается на верхнем экране со всем экраном в портретной ориентации, затем я нажимаю кнопку «Домой», верхнее приложение onPause() вызывается, но onStop() не вызывается.

Согласно руководству Google https://developer.android.com/guide/topics/ui/multi-window.html#lifecycle видеоприложение должно приостанавливать воспроизведение видео в обратном вызове onStop(), а не в обратном вызове onPause().

В этой ситуации кнопка «Домой» нажата, действие переходит в фоновый режим и становится невидимым для пользователя, наше приложение должно приостановить воспроизведение видео, но мы не можем получить обратный вызов onStop(). Между тем, активность не запускает обратный вызов onMultiWindowChanged(), это означает, что активность все еще находится в многооконном режиме, хотя и находится в фоновом режиме. В этом случае isInMultiWindowMode() вернет true.

Та же проблема возникает, когда приложение находится на левом экране, а весь экран находится в альбомной ориентации.

Я искал этот вопрос и обнаружил, что у кого-то уже есть проблемы с публикацией в Google, но они не обрабатываются в выпуске Android Nougat.

https://code.google.com/p/android/issues/detail?id=215650&can=1&q=multi%20window%20onstop&colspec=ID%20Status%20Priority%20Wowner%20Summary%20Stars%20Reporter%20Opened

Итак, когда в такой ситуации следует приостановить воспроизведение видео? Если мы приостановим видео в обратном вызове onPause(), но активность может быть видна пользователю в многооконном режиме. Если мы этого не сделаем, в этом случае мы не сможем получить обратный вызов onStop(). Есть ли какой-то правильный обходной путь для таких случаев?


person zjupure    schedule 28.09.2016    source источник


Ответы (2)


Когда вы нажимаете кнопку «Домой» в многооконном режиме, система находится в переходном состоянии, позволяя пользователю выбрать приложение для запуска, в то время как ваше приложение продолжает работать (если вы самое верхнее приложение, вы заметите, что можете по-прежнему видеть строку состояния из вашего приложения). Переход в этот переходный режим не связан с обратным вызовом, и вам не следует менять свое поведение при входе в этот переходный режим.

Вместо этого вы должны продолжать воспроизводить любое видео — останавливать воспроизведение только тогда, когда вы получаете обратный вызов на onStop().

person ianhanniballake    schedule 28.09.2016
comment
(Я знаю, это кажется странным, но предполагается, что это режим, в котором пользователи находятся ненадолго) - person ianhanniballake; 28.09.2016
comment
когда я щелкаю нижнюю часть приложения и делаю его самым верхним приложением, а затем нажимаю кнопку «Домой», я вижу, что строка состояния все еще находится в верхней части приложения, а onStop() верхнего приложения также не вызывается. Хотя это может быть временное состояние, мы не можем гарантировать, что пользователь скоро загрузит другое приложение. Несколько секунд важны для видеоприложения - person zjupure; 28.09.2016
comment
Невозможно определить, когда возникает это состояние, поэтому у вас действительно нет выбора. - person ianhanniballake; 28.09.2016
comment
@zjupure: я подал запрос функции, чтобы иметь какой-то API, чтобы сообщить нам, когда мы находимся в этом состоянии. Я согласен с вами, что продолжать проигрывать видео бесконечно — не лучший план. Еще больше меня беспокоит полная блокировка пробуждения, которую используют многие приложения (например, setKeepScreenOn(true)); если пользователь нажимает HOME и уходит, нам нужно знать, что нам нужно снять этот wakelock. - person CommonsWare; 28.09.2016
comment
@ianhanniballake в некоторых приложениях, таких как «звезды футбола», этой проблемы не существует. что они делают?! - person Hamidreza Shokouhi; 16.12.2016
comment
@ianhanniballake Я проверяю процент видимости представления (например, видно 50% представления), используя view.getGlobalVisibleRect(Rect). Но в переходном режиме, даже когда View не видны, использование вышеприведенной функции для View (который был виден на 100% в многооконном режиме) возвращает тот же результат. Могу ли я каким-либо образом определить, что View виден на 0%, потому что приложение находится в переходном состоянии? - person Diffy; 05.01.2017
comment
@Diffy - нет, нет API для определения этого состояния. - person ianhanniballake; 05.01.2017

Согласно официальному документу MultiWinodw LifeCycle:

«Многооконный режим не меняет жизненный цикл активности».

В многооконном режиме единственное действие, с которым пользователь взаимодействовал последним, будет самым верхним действием, а другое действие перейдет в режим onPause(), поскольку оно будет частично видимым. Когда пользователь попытается взаимодействовать с другим действием, которое перейдет в состояние onResume(), оно станет самым верхним действием, а остальные перейдут в режим onPause().

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

Остановите видео только тогда, когда будет вызван метод onStop().

person Jai    schedule 28.09.2016