目的:实现app后台播放音视频
存在问题原因分析
app中页面不可见后webview会暂停视频播放
解决方案:
通过修改view可见性.让webview 恢复播放
实现方式1
重写onWindowVisibilityChanged强制调用父类是可见的super.onWindowVisibilityChanged(View.VISIBLE)
优点:系统webview直接重写后设置可见即可.不需要判断
缺点:需要自定义view才能行.且x5webview 重写不生效
点击查看代码
class BackgroundMediaWebView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : WebView(context, attrs, defStyleAttr) {
override fun onWindowVisibilityChanged(visibility: Int) {
super.onWindowVisibilityChanged(View.VISIBLE) ;//设置可见
}
}
实现方式2
通过dispatchWindowVisibilityChanged进行分发设置可见
优点:x5webview 以及系统webview都支持
缺点:无
点击查看代码
class BackgroundMediaWebView @JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : WebView(context, attrs, defStyleAttr) {
private fun toReadableVisibility(visibility: Int): String {
return when(visibility) {
View.VISIBLE -> "Visible"
View.INVISIBLE -> "Invisible"
View.GONE -> "Gone"
else -> "Unknown"
}
}
override fun dispatchWindowVisibilityChanged(visibility: Int) {
if(windowVisibility==View.VISIBLE ){
//如果当前是可见的就不让设置不可见.防止系统webviewView切换前后台卡顿.x5可以不用判断
return
}
super.dispatchWindowVisibilityChanged(View.VISIBLE)
Log.i("BackgroundMediaWebView", "dispatchWindowVisibilityChanged " + "应该=${toReadableVisibility(visibility)} 实际=${toReadableVisibility(getVisibility())}")
}
}
实现方式3
通过dispatchWindowVisibilityChanged进行分发设置可见
优点:不方便重写时候使用
缺点:前后台切换会卡顿下