亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行Android Webview使用以及遇到過的問題分析

發布時間:2021-11-26 14:34:04 來源:億速云 閱讀:165 作者:柒染 欄目:移動開發

這期內容當中小編將會給大家帶來有關如何進行Android Webview使用以及遇到過的問題分析,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

正文

WebView  用來顯示網頁的一個View,它使用WebKit渲染引擎顯示web頁面,可以加載在線的或者本地的html頁面,WebView可以對頁面進行一系列操作,如歷史頁面的向前、向后,放大和縮小,執行文本搜索,與JS交互等等;

在使用Webview時,請記得在AndroidManifest.xml文件中聲明INTERNET權限:

<uses-permission android:name="android.permission.INTERNET" />

默認情況下,WebView不支持JavaScript,web頁面的錯誤也會被忽略,如果只是用Webview來顯示網頁而不用交互,默認配置就可以了,如果需要交互,就需要自定義配置了。

WebView初始化及加載URL

1、通過XML初始化:

<WebView      android:id="@+id/webview"     android:layout_width="fill_parent"     android:layout_height="fill_parent"/>

或者直接New:

WebView webview = new WebView(this);

2、加載URL:

WebView myWebView = (WebView) findViewById(R.id.webview);  myWebView.loadUrl("http://www.example.com");

或者可以直接加載Html:

String summary = "<html><body>You scored <b>192</b> points.</body></html>";  myWebView.loadData(summary, "text/html", null);

如果在加載URL的時候想添加Header信息,可以復寫loadUrl()方法,如:

@Override public void loadUrl(String url) {      Map<String, String> map = new HashMap<String, String>();             map.put("ajax", "true");             map.put("appversion", SharedPreferencesUtil.getAppVersion(getContext()));     map.put("clientid", SharedPreferencesUtil.getClientId(getContext()));      loadUrl(url, map);  }

WebSettings

WebSettings 中可以對WebView進行一系列配置,如:

WebSettings settings = getSettings(); //默認是false 設置true允許和js交互 settings.setJavaScriptEnabled(true); //  WebSettings.LOAD_DEFAULT 如果本地緩存可用且沒有過期則使用本地緩存,否加載網絡數據 默認值 //  WebSettings.LOAD_CACHE_ELSE_NETWORK 優先加載本地緩存數據,無論緩存是否過期 //  WebSettings.LOAD_NO_CACHE  只加載網絡數據,不加載本地緩存 //  WebSettings.LOAD_CACHE_ONLY 只加載緩存數據,不加載網絡數據 //Tips:有網絡可以使用LOAD_DEFAULT 沒有網時用LOAD_CACHE_ELSE_NETWORK settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //開啟 DOM storage API 功能 較大存儲空間,使用簡單 settings.setDomStorageEnabled(true); //設置數據庫緩存路徑 存儲管理復雜數據 方便對數據進行增加、刪除、修改、查詢 不推薦使用 settings.setDatabaseEnabled(true); final String dbPath = context.getApplicationContext().getDir("db", Context.MODE_PRIVATE).getPath(); settings.setDatabasePath(dbPath); //開啟 Application Caches 功能 方便構建離線APP 不推薦使用 settings.setAppCacheEnabled(true); final String cachePath = context.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath(); settings.setAppCachePath(cachePath); settings.setAppCacheMaxSize(5 * 1024 * 1024);

Webview中可以設置的幾種緩存對比:

如何進行Android Webview使用以及遇到過的問題分析

WebviewClient

WebCromeClient常用方法:

1、shouldOverrideUrlLoading(WebView view, String url)

在API  24以后過時,當一個url即將被webview加載時,給Application一個機會來接管處理這個url,方法返回true代表Application自己處理url;返回false代表Webview處理url。

舉個例子,項目中需要處理傳過來的URL是一個事件還是一個HTTP鏈接,可以通過自定義協議頭 (nativeapi://) 來過濾,如:

@Override  public boolean shouldOverrideUrlLoading(WebView view, String url) {      Uri uri = Uri.parse(url);      String scheme = uri.getScheme();                  if (TextUtils.isEmpty(scheme)) return true;                  if (scheme.equals("nativeapi")) {                      //如定義nativeapi://showImg是用來查看大圖,這里添加查看大圖邏輯          return true;      } else if (scheme.equals("http") || scheme.equals("https")) {                      //處理http協議          if (Uri.parse(url).getHost().equals("www.example.com")) {                         // 內部網址,不攔截,用自己的webview加載              return false;          } else {                              //跳轉外部瀏覽器              Intent intent = new Intent(Intent.ACTION_VIEW, uri);              context.startActivity(intent);                                  return true;          }      }     return super.shouldOverrideUrlLoading(view, url);  }

注:如果使用的是Post請求方式,則此方法不會被回調

2、shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

在API 24以后新加的,使用同上。

3、shouldInterceptRequest(WebView view, String url)

在API  21以后過時,通知Application加載資源的請求并返回請求的資源,如果返回值是Null,Webview仍然會按正常加載資源;否則返回的數據將會被使用。

注:回調發生在子線程中,不能直接進行UI操作

4、shouldInterceptRequest(WebView view, WebResourceRequest request)

在API 21以后新加,使用同上。

5、onPageStarted(WebView view, String url, Bitmap favicon)

通知Application頁面已經開始加載資源,頁面加載過程中,onPageStarted至多會被執行一次。

6、onPageFinished(WebView view, String url)

通知Application頁面已經加載完畢。

7、onReceivedError(WebView view, int errorCode, String description, String  failingUrl)

通知Application有錯誤發生,這些錯誤是不可恢復的(即主要的資源不可用)。errorCode參數對應于一個ERROR_ *常量

WebCromeClient

1、onProgressChanged(WebView view, int newProgress)

通知Application的加載進度,newProgress取值范圍[0,100],可以通過這個方法來編寫一個帶加載進度條的Webview,具體例子請參考:Android  編寫一個帶進度條的Webview

2、onReceivedTitle(WebView view, String title)

當加載頁面標題有改變時會通知Application,title即為新標題。

控制Webview加載歷史網頁

WebView重寫URL加載時,它會自動累積的歷史訪問的web頁面。可以通過向后goBack()和向前goForward()。

舉例,可以在Activity中的回退鍵控制向后回退到前一個頁面:

@Override  public boolean onKeyDown(int keyCode, KeyEvent event) {              // Check if the key event was the Back button and if there's history      if ((keyCode == KeyEvent.KEYCODE_BACK) && webview.canGoBack()) {          webview.goBack();                          return true;      }     // If it wasn't the Back key or there's no web page history, bubble up to the default      // system behavior (probably exit the activity)      return super.onKeyDown(keyCode, event);     }

Webview和Js交互

1、Js調用Android接口:

public class WebAppInterface {     Context mContext;          /** Instantiate the interface and set the context */     WebAppInterface(Context c) {         mContext = c;     }    /** Show a toast from the web page */     @JavascriptInterface                 public void showToast(String toast) {         Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show();     } }

SDK>=17(Android4.2)以上,必須添加@JavascriptInterface聲明,然后通過  addJavascriptInterface() 方式供Js調用,如:

webView.addJavascriptInterface(new WebAppInterface(this), "android");

通過上面的配置,就可以在Js中調用了:

<input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> <script type="text/javascript">     function showAndroidToast(toast) {         //調用Android中的showToast方法         Android.showToast(toast);     }</script>

2、Android調用Js的接口:

可以通過webview.loadUrl("javascript:JsMethod()")方式加載Js接口,如果有參數,直接加到JsMethod()里面即可,下面封裝了兩個方法,分別是加載帶參數和不帶參數的Js函數:

/**     * 加載帶參數的JS函數     *     * @param JsName JS函數名     * @param params 不定參數     */    public void loadJSWithParam(String JsName, String... params) {        String TotalParam = "";                       for (int i = 0; i < params.length; i++) {                              if (i == params.length - 1) {                                      //***一個                TotalParam += (params[i]);            } else {                TotalParam += (params[i] + "','");            }        }        this.loadUrl("javascript:" + JsName + "('" + TotalParam + "')");    }    /**     * 加載不帶參數的JS函數     *     * @param JsName JS函數名     */    public void loadJS(String JsName) {                 this.loadUrl("javascript:" + JsName + "()");    }

Webview的一些優化和遇到的坑

1、Webview打開一個鏈接,播放一段音樂,退出Activity時音樂還在后臺播放,可以通過在Activity的onPause中調用webview.onPause()解決,并在Activity的onResume中調用webview.onResume()恢復,如下:

@Override     protected void onPause() {        h6_webview.onPause();        h6_webview.pauseTimers();                  super.onPause();     } @Override     protected void onResume() {        h6_webview.onResume();        h6_webview.resumeTimers();                  super.onResume();     }

Webview的onPause()方法官網是這么解釋的:

Does a best-effort attempt to pause any processing that can be paused safely,  such as animations and geolocation. Note that this call does not pause  JavaScript. To pause JavaScript globally, use pauseTimers(). To resume WebView,  call onResume().

通知內核嘗試停止所有處理,如動畫和地理位置,但是不能停止Js,如果想全局停止Js,可以調用pauseTimers()全局停止Js,調用onResume()恢復。

2、5.0 以后的WebView加載的鏈接為Https開頭,但是鏈接里面的內容,比如圖片為Http鏈接,這時候,圖片就會加載不出來,解決方法:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {  webSetting.setMixedContentMode(webSetting.getMixedContentMode());  }

原因是5.0之后不支持Https和Http的混合模式,具體可參看:Android5.0 WebView中Http和Https混合問題

3、WebView與JavaScript相互調用時,如果是debug沒有配置混淆時,調用時沒問題的,但是當設置混淆后發現無法正常調用了,解決方法:

在proguard-rules.pro文件中配置:

-keepattributes *Annotation*   -keepattributes *JavascriptInterface* -keep public class org.mq.study.webview.DemoJavaScriptInterface{         public <methods>; }

如果是內部類:  

-keepattributes *Annotation* -keepattributes *JavascriptInterface* -keep public class org.mq.study.webview.webview.DemoJavaScriptInterface$InnerClass{         public <methods>; }

上述就是小編為大家分享的如何進行Android Webview使用以及遇到過的問題分析了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

承德市| 镇沅| 沭阳县| 渭南市| 平罗县| 桐庐县| 古浪县| 翼城县| 确山县| 肥城市| 岳阳市| 望奎县| 酉阳| 海门市| 祁连县| 永修县| 三都| 呼玛县| 五指山市| 海宁市| 平乐县| 汶川县| 都匀市| 静宁县| 洛扎县| 六盘水市| 奎屯市| 威宁| 华容县| 建昌县| 柳林县| 曲松县| 正阳县| 长海县| 汉阴县| 汝阳县| 依兰县| 高台县| 上栗县| 静海县| 蓝山县|