在Android N多窗口模式下按下主页按钮时未调用Activity onStop()
Posted
技术标签:
【中文标题】在Android N多窗口模式下按下主页按钮时未调用Activity onStop()【英文标题】:Activity onStop() not called when home button is pressed in Android N multi window mode 【发布时间】:2017-02-05 20:37:15 【问题描述】:我正在尝试使我们的视频应用程序支持 android N 多窗口模式。我发现活动生命周期在多窗口模式下变得混乱。现象是当我们的应用布局在顶部屏幕上,整个屏幕是纵向的,然后我点击主页按钮,上面的应用onPause()
被调用但onStop()
没有被调用。
根据谷歌指南https://developer.android.com/guide/topics/ui/multi-window.html#lifecycle,视频应用应该在onStop()
回调而不是onPause()
回调中暂停视频播放。
在这种情况下,按下主页按钮,活动进入后台并且对用户不可见,我们的应用程序应该暂停视频播放但我们无法获得onStop()
回调。同时,活动不会触发onMultiWindowChanged()
回调,这意味着活动虽然在后台,但仍处于多窗口模式。在这种情况下,isInMultiWindowMode()
将返回 true
。
当应用在左侧屏幕且整个屏幕为横向时,也会出现同样的问题。
我搜索了这个问题,发现有人已经向谷歌发布了问题,但在 Android Nougat 版本中没有处理。
https://code.google.com/p/android/issues/detail?id=215650&can=1&q=multi%20window%20onstop&colspec=ID%20Status%20Priority%20Owner%20Summary%20Stars%20Reporter%20Opened
那么,在这种情况下,什么时候暂停我们的视频播放才是合适的呢?如果我们在onPause()
回调中暂停视频,但在多窗口模式下用户可能会看到该活动。如果我们不这样做,在这种情况下我们将无法获得onStop()
回调。
是否有针对此类情况的适当解决方法?
【问题讨论】:
【参考方案1】:当您在多窗口模式下点击主页按钮时,系统处于过渡状态,允许用户在您的应用继续运行时选择启动一个应用(如果您是最顶层的应用,您将请注意,您仍然可以从您的应用中看到状态栏)。进入此瞬态模式没有关联的回调,您不应在进入此瞬态模式时更改您的行为。
相反,您应该继续播放任何视频 - 仅当您收到对 onStop()
的回调时才停止播放视频。
【讨论】:
(我知道,感觉怪怪的,但应该是用户短暂进入的模式) 当我点击应用程序底部并使其成为最顶部的应用程序然后按主页按钮时,我看到状态栏仍在应用程序顶部,顶部应用程序的onStop()
也没有叫。虽然这种情况可能是暂时的,但我们不能保证用户很快就会拿起另一个应用程序。几秒钟对于视频应用很重要
这种状态什么时候出现无法判断,所以你真的别无选择。
@zjupure:我提交了a feature request 以获取某种 API 让我们知道我们何时处于这种状态。我同意你的观点,无限期地继续播放视频不是一个好计划。我更关心许多应用程序使用的完整唤醒锁(例如,setKeepScreenOn(true)
);如果用户按下 HOME 并走开,我们需要知道我们需要释放唤醒锁。
@ianhanniballake 我使用view.getGlobalVisibleRect(Rect)
检查视图的可见性百分比(例如 50% 的视图可见)。但是在瞬态模式下,即使View
s 不可见,对View
(在多窗口模式下 100% 可见)使用上述函数也会返回相同的结果。有什么方法可以确定 View
是 0% 可见,因为应用程序处于瞬态?【参考方案2】:
根据官方文档MultiWinodw LifeCycle:
"多窗口模式不会改变活动生命周期。"
在多窗口模式下,用户最近交互的唯一活动将是最顶部的活动,其他活动将进入onPause()
模式,因为它是部分可见的。当用户尝试与其他将进入onResume()
状态的活动进行交互时,它将成为最顶层的活动,其余活动将进入onPause()
模式。
现在对于音乐播放器,他们已经明确提到如果您支持多窗口模式,即使onPause()
方法会被调用,您也应该继续播放音乐。
只有在调用 onStop() 时才停止视频。
【讨论】:
以上是关于在Android N多窗口模式下按下主页按钮时未调用Activity onStop()的主要内容,如果未能解决你的问题,请参考以下文章
Android Fragment 在按下后退按钮时未保存 UI 状态