webview學習筆記以及JSBridge

WebView是用來顯示網頁的控件,使用WebKit渲染引擎加載顯示網頁。
使用WebView需要申請android.permission.INTERNET 權限。
加載網頁只需要調用:loadUrl或者loadData函數即可。
如果你只是簡單的打開一個webView顯示網頁內容,不需要記錄數據交互等等,可以不用在app中寫WebView,使用以下代碼打開瀏覽器顯示:

Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.baidu.com"));
startActivity(intent);

支持的功能:

  • WebSettings:設置屬性,例如支持JavaScript、ZoomControl等等。
  • 注入Java:注入Java代碼供JS調用,後面會講到JSBridge,Java和JavaScript通信。如果顯示的HTML有JS代碼,則需要設置支持JS:webview.getSettings().setJavaScriptEnabled(true)
  • WebClient:主要是處理頁面加載(onPageStarted、onPageFinished等)、請求相關(SSL請求、攔截請求和Url等)、處理錯誤(onReceivedError等)。
  • WebChromeClient:處理音頻、控制檯日誌、JS對話框(Alert、Confirm、Prompt)、進度條、文件選擇、圖標標題等。幫助WebView處理各種通知、權限請求事件。

注意的事項:
- Activity的重建銷燬都會導致webview的重新加載,例如屏幕旋轉、系統設置改變等,需要對WebView當前的狀態進行保存。
- 聲頻支持的話要開啓硬件加速

WebView的內存泄漏,主要原因是如果Activity中用到webView,退出Activity即使調用webview.destroy(); webView = null;也沒有用,WebView依舊引用Activity,造成內存泄漏。例如該篇文章的描述:http://www.cnblogs.com/kimmy/p/4791657.html
搜索了以下,解決該問題的辦法:

不要寫WebView在XML中,通過在代碼中動態添加WebView,在初始化WebView的時候傳入ApplicationContext而不是Activity,因爲ApplicationContext是一直存在的。但是這種辦法也有問題,如果要在頁面上顯示什麼,是需要Activity這種Context的,ApplicationContext則不行,所以會出錯。但是如果你只是簡單的瀏覽而不用交互的話,那就傳ApplicationContext好了。

也看到有人使用反射去強制的釋放Activity。

接下來就是講JSBridge,簡單的來說就是Java和Javascript通信,互相調用代碼。
現在主流的方法就是兩種:

  • JSPrompt:網頁可以彈出三種類型的彈框,分別是alert(警告框)、confirm(確認框,類似登錄的框)、prompt(提示框),在JS中,prompt這種類型的框是很少被用到的,那麼可以通過該方法來通知Java,剛剛說到WebChromeClient裏面可以接收到js彈出prompt對話框的消息,如果該方法返回true,則表示客戶端處理該消息,如果返回false,則會彈出js的prompt對話框。所以只要將該方法返回true,按邏輯處理自己的事情即可。該方法還有一些參數,那麼傳遞給java的參數就可以通過這個方法形參傳過來。
  • shouldOverrideUrlLoading:通過webViewClient去攔截url,可以這麼理解,如果需要調用java代碼時,通過跳轉到新的url來觸發,每次跳轉新的url時,會觸發webViewClient的shouldOverrideUrlLoading方法,如果該方法返回true,則客戶端已處理,webView不需要處理,如果返回false,則讓WebView跳轉到新的url。

上面講的兩種方法,主要都是通過url的方式來,那麼url就很重要了,需要定義兩端通信的schema,只要檢測到url的schema是預先定義好的,則說明是需要進行通信,否則按照WebView原有的邏輯來。

那麼Javascript調Java的很明顯了,那Java調用Javascript呢?更簡單了,要麼調用loadUrl或者調用evaluateJavascript即可。

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