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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM