webview 让前端拥有后台播放视频以及音频的方案

目的:实现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进行分发设置可见
优点:不方便重写时候使用
缺点:前后台切换会卡顿下
点击查看代码 / 在生命周期的onStop种调用. 如果在onPause中调用无效 webview.dispatchWihndowVisibilityChanged(View.VISIBLE)//设置可见

总结:

重写的方式:

统一化推荐:方式2

仅系统webview 推荐使用:方式1

不方便重写?:

使用:方式3

posted @ 2022-01-28 16:18  烟花易冷心易碎  阅读(954)  评论(0编辑  收藏  举报