目的:實現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進行分發設置可見
優點:不方便重寫時候使用
缺點:前后台切換會卡頓下