Android 開發基於Webview 自制一個簡單的手機瀏覽器

初衷:

雖然現在市場上瀏覽器很多,比如chrome,夸克,沒有廣告,新聞等亂七八糟的東西,頁面簡單清晰,但是自己的瀏覽記錄還是存放在別人的服務器,就算刪除了,開隱身模式了,但是具體後臺的操作誰又知道呢,鑑於此自己做一個瀏覽器,實現最基本的搜索,地址加載,響應下載等,實現最基本的功能,沒有廣告,沒有啓動頁,沒有新聞資訊,沒有推送,沒有後臺記錄,沒有進程保活等煩人的東西。

開始

1. 首先準備一個空白的Android項目(我此處語言採用Kotlin)。

O(∩_∩)O哈哈~  

2. 寫佈局

非常簡單,哈哈

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <EditText
        android:id="@+id/editText"
        android:layout_width="0dp"
        android:layout_height="35dp"
        android:lines="1"
        android:singleLine="true"
        android:inputType="textUri"
        android:imeOptions="actionSend"
        android:textSize="12sp"
        tools:text="asdasdasdas"
        android:textColor="#333333"
        android:paddingStart="10dp"
        android:paddingEnd="10dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:background="@drawable/url_bac"/>

    <ProgressBar
        android:id="@+id/progressBar"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:progress="50"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editText" />

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/progressBar" />

</androidx.constraintlayout.widget.ConstraintLayout>

3. 初始化Webview的一些設置


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initView()
        initListener()
        loadDefaultUrl()
    }

    private fun initView() {
        webView = findViewById(R.id.webView)
        editText = findViewById(R.id.editText)
        progressBar = findViewById(R.id.progressBar)
        val settings = webView.settings
        settings.javaScriptEnabled = true
        settings.javaScriptCanOpenWindowsAutomatically = true//js和android交互
        settings.allowFileAccess = true // 允許訪問文件
        settings.setAppCacheEnabled(true) //設置H5的緩存打開,默認關閉
        settings.useWideViewPort = true//設置webview自適應屏幕大小
        settings.layoutAlgorithm = WebSettings.LayoutAlgorithm.NARROW_COLUMNS//設置,可能的話使所有列的寬度不超過屏幕寬度
        settings.loadWithOverviewMode = true//設置webview自適應屏幕大小
        settings.domStorageEnabled = true//設置可以使用localStorage
        settings.setSupportZoom(false)//關閉zoom按鈕
        settings.builtInZoomControls = false//關閉zoom
    }

    private fun loadDefaultUrl() {
        //訪問網頁
        webView.loadUrl("http://www.baidu.com")
    }

4. 監聽返回鍵,當webview可以後退的時候,不結束應用


    override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean {
        if(event?.keyCode == KeyEvent.KEYCODE_BACK){
            if(webView.canGoBack()) {
                webView.goBack()
                return true;
            }
        }
        return super.onKeyDown(keyCode, event)
    }

5. 監聽輸入框,加載輸入的地址

editText.setOnEditorActionListener { p0, p1, p2 ->
            if(p2?.keyCode == KeyEvent.KEYCODE_ENTER){
                var url = editText.text.toString()
                if(!url.startsWith("http")&&!url.startsWith("https")){
                    url="http://$url"
                }
                webView.loadUrl(url)
                ImTool.closeKeyBoard(baseContext,editText)
            }
            false
        }

6.設置webviewclient,並且監聽頁面加載進度,當頁面加載結束的時候,設置url到輸入框

webView.webChromeClient = object : WebChromeClient() {

    override fun onProgressChanged(view: WebView, newProgress: Int) {
        super.onProgressChanged(view, newProgress)
        if(newProgress >= 99){
            progressBar.visibility = View.GONE
        }else if(progressBar.visibility == View.GONE){
            progressBar.visibility = View.VISIBLE
        }
        progressBar.progress = newProgress
    }
}
webView.webViewClient = object:WebViewClient(){
    override fun onPageFinished(view: WebView?, url: String?) {
        super.onPageFinished(view, url)
        editText.setText(url)
    }
}

7.響應頁面的下載

        webView.setDownloadListener { url, userAgent, contentDisposition, mimetype, contentLength ->
            val i = Intent(Intent.ACTION_VIEW)
            i.data = Uri.parse(url)
            startActivity(i)
        }

8. 運行一下試試:

至此,基本的功能就有了,再也不用擔心瀏覽器泄漏你的瀏覽記錄了,但是也還是防不了百度和其他網站有可能會泄漏你的瀏覽記錄,畢竟這還得靠這些網站自覺了。

最後帶上源碼鏈接:

https://github.com/MaXiaopingIT/MinewebBrowser

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章