成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android Webview使用和遇到過(guò)的坑總結(jié)

移動(dòng)開(kāi)發(fā) Android
WebView 用來(lái)顯示網(wǎng)頁(yè)的一個(gè)View,它使用WebKit渲染引擎顯示web頁(yè)面,可以加載在線的或者本地的html頁(yè)面,WebView可以對(duì)頁(yè)面進(jìn)行一系列操作,如歷史頁(yè)面的向前、向后,放大和縮小,執(zhí)行文本搜索,與JS交互等等;

正文

WebView 用來(lái)顯示網(wǎng)頁(yè)的一個(gè)View,它使用WebKit渲染引擎顯示web頁(yè)面,可以加載在線的或者本地的html頁(yè)面,WebView可以對(duì)頁(yè)面進(jìn)行一系列操作,如歷史頁(yè)面的向前、向后,放大和縮小,執(zhí)行文本搜索,與JS交互等等;

在使用Webview時(shí),請(qǐng)記得在AndroidManifest.xml文件中聲明INTERNET權(quán)限:

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

默認(rèn)情況下,WebView不支持JavaScript,web頁(yè)面的錯(cuò)誤也會(huì)被忽略,如果只是用Webview來(lái)顯示網(wǎng)頁(yè)而不用交互,默認(rèn)配置就可以了,如果需要交互,就需要自定義配置了。

WebView初始化及加載URL

1、通過(guò)XML初始化:

  1. <WebView  
  2.     android:id="@+id/webview" 
  3.     android:layout_width="fill_parent" 
  4.     android:layout_height="fill_parent"/>  

或者直接New:

  1. WebView webview = new WebView(this); 

2、加載URL:

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

或者可以直接加載Html:

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

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

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

WebSettings

WebSettings 中可以對(duì)WebView進(jìn)行一系列配置,如:

  1. WebSettings settings = getSettings(); //默認(rèn)是false 設(shè)置true允許和js交互 
  2. settings.setJavaScriptEnabled(true); //  WebSettings.LOAD_DEFAULT 如果本地緩存可用且沒(méi)有過(guò)期則使用本地緩存,否加載網(wǎng)絡(luò)數(shù)據(jù) 默認(rèn)值 
  3. //  WebSettings.LOAD_CACHE_ELSE_NETWORK 優(yōu)先加載本地緩存數(shù)據(jù),無(wú)論緩存是否過(guò)期 
  4. //  WebSettings.LOAD_NO_CACHE  只加載網(wǎng)絡(luò)數(shù)據(jù),不加載本地緩存 
  5. //  WebSettings.LOAD_CACHE_ONLY 只加載緩存數(shù)據(jù),不加載網(wǎng)絡(luò)數(shù)據(jù) 
  6. //Tips:有網(wǎng)絡(luò)可以使用LOAD_DEFAULT 沒(méi)有網(wǎng)時(shí)用LOAD_CACHE_ELSE_NETWORK 
  7. settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //開(kāi)啟 DOM storage API 功能 較大存儲(chǔ)空間,使用簡(jiǎn)單 
  8. settings.setDomStorageEnabled(true); //設(shè)置數(shù)據(jù)庫(kù)緩存路徑 存儲(chǔ)管理復(fù)雜數(shù)據(jù) 方便對(duì)數(shù)據(jù)進(jìn)行增加、刪除、修改、查詢(xún) 不推薦使用 
  9. settings.setDatabaseEnabled(true); final String dbPath = context.getApplicationContext().getDir("db", Context.MODE_PRIVATE).getPath(); 
  10. settings.setDatabasePath(dbPath); //開(kāi)啟 Application Caches 功能 方便構(gòu)建離線APP 不推薦使用 
  11. settings.setAppCacheEnabled(true); final String cachePath = context.getApplicationContext().getDir("cache", Context.MODE_PRIVATE).getPath(); 
  12. settings.setAppCachePath(cachePath); 
  13. settings.setAppCacheMaxSize(5 * 1024 * 1024);  

Webview中可以設(shè)置的幾種緩存對(duì)比: 

 

 

 

WebviewClient

WebCromeClient常用方法:

1、shouldOverrideUrlLoading(WebView view, String url)

在API 24以后過(guò)時(shí),當(dāng)一個(gè)url即將被webview加載時(shí),給Application一個(gè)機(jī)會(huì)來(lái)接管處理這個(gè)url,方法返回true代表Application自己處理url;返回false代表Webview處理url。

舉個(gè)例子,項(xiàng)目中需要處理傳過(guò)來(lái)的URL是一個(gè)事件還是一個(gè)HTTP鏈接,可以通過(guò)自定義協(xié)議頭 (nativeapi://) 來(lái)過(guò)濾,如:

  1. @Override 
  2.  public boolean shouldOverrideUrlLoading(WebView view, String url) { 
  3.      Uri uri = Uri.parse(url); 
  4.      String scheme = uri.getScheme();      
  5.             if (TextUtils.isEmpty(scheme)) return true;      
  6.             if (scheme.equals("nativeapi")) {          
  7.             //如定義nativeapi://showImg是用來(lái)查看大圖,這里添加查看大圖邏輯 
  8.          return true
  9.      } else if (scheme.equals("http") || scheme.equals("https")) {          
  10.             //處理http協(xié)議 
  11.          if (Uri.parse(url).getHost().equals("www.example.com")) {             
  12.             // 內(nèi)部網(wǎng)址,不攔截,用自己的webview加載 
  13.              return false
  14.          } else {              
  15.                 //跳轉(zhuǎn)外部瀏覽器 
  16.              Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
  17.              context.startActivity(intent);              
  18.                     return true
  19.          } 
  20.      }     return super.shouldOverrideUrlLoading(view, url); 
  21.  }  

注:如果使用的是Post請(qǐng)求方式,則此方法不會(huì)被回調(diào)

2、shouldOverrideUrlLoading(WebView view, WebResourceRequest request)

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

3、shouldInterceptRequest(WebView view, String url)

在API 21以后過(guò)時(shí),通知Application加載資源的請(qǐng)求并返回請(qǐng)求的資源,如果返回值是Null,Webview仍然會(huì)按正常加載資源;否則返回的數(shù)據(jù)將會(huì)被使用。

注:回調(diào)發(fā)生在子線程中,不能直接進(jìn)行UI操作

4、shouldInterceptRequest(WebView view, WebResourceRequest request)

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

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

通知Application頁(yè)面已經(jīng)開(kāi)始加載資源,頁(yè)面加載過(guò)程中,onPageStarted至多會(huì)被執(zhí)行一次。

6、onPageFinished(WebView view, String url)

通知Application頁(yè)面已經(jīng)加載完畢。

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

通知Application有錯(cuò)誤發(fā)生,這些錯(cuò)誤是不可恢復(fù)的(即主要的資源不可用)。errorCode參數(shù)對(duì)應(yīng)于一個(gè)ERROR_ *常量

WebCromeClient

1、onProgressChanged(WebView view, int newProgress)

通知Application的加載進(jìn)度,newProgress取值范圍[0,100],可以通過(guò)這個(gè)方法來(lái)編寫(xiě)一個(gè)帶加載進(jìn)度條的Webview,具體例子請(qǐng)參考:Android 編寫(xiě)一個(gè)帶進(jìn)度條的Webview

2、onReceivedTitle(WebView view, String title)

當(dāng)加載頁(yè)面標(biāo)題有改變時(shí)會(huì)通知Application,title即為新標(biāo)題。

控制Webview加載歷史網(wǎng)頁(yè)

WebView重寫(xiě)URL加載時(shí),它會(huì)自動(dòng)累積的歷史訪問(wèn)的web頁(yè)面??梢酝ㄟ^(guò)向后goBack()和向前goForward()。

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

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

Webview和Js交互

1、Js調(diào)用Android接口:

  1. public class WebAppInterface { 
  2.     Context mContext;     
  3.      /** Instantiate the interface and set the context */ 
  4.     WebAppInterface(Context c) { 
  5.         mContext = c; 
  6.     }    /** Show a toast from the web page */ 
  7.     @JavascriptInterface     
  8.             public void showToast(String toast) { 
  9.         Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); 
  10.     } 
  11.  

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

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

通過(guò)上面的配置,就可以在Js中調(diào)用了:

  1. <input type="button" value="Say hello" onClick="showAndroidToast('Hello Android!')" /> 
  2. <script type="text/javascript"
  3.     function showAndroidToast(toast) { 
  4.         //調(diào)用Android中的showToast方法 
  5.         Android.showToast(toast); 
  6.     }</script>  

2、Android調(diào)用Js的接口:

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

  1. /** 
  2.     * 加載帶參數(shù)的JS函數(shù) 
  3.     * 
  4.     * @param JsName JS函數(shù)名 
  5.     * @param params 不定參數(shù) 
  6.     */ 
  7.    public void loadJSWithParam(String JsName, String... params) { 
  8.        String TotalParam = "";         
  9.               for (int i = 0; i < params.length; i++) {             
  10.                  if (i == params.length - 1) {                 
  11.                      //***一個(gè) 
  12.                TotalParam += (params[i]); 
  13.            } else { 
  14.                TotalParam += (params[i] + "','"); 
  15.            } 
  16.        }        this.loadUrl("javascript:" + JsName + "('" + TotalParam + "')"); 
  17.    }    /** 
  18.     * 加載不帶參數(shù)的JS函數(shù) 
  19.     * 
  20.     * @param JsName JS函數(shù)名 
  21.     */ 
  22.    public void loadJS(String JsName) {         
  23.         this.loadUrl("javascript:" + JsName + "()"); 
  24.    }  

Webview的一些優(yōu)化和遇到的坑

1、Webview打開(kāi)一個(gè)鏈接,播放一段音樂(lè),退出Activity時(shí)音樂(lè)還在后臺(tái)播放,可以通過(guò)在Activity的onPause中調(diào)用webview.onPause()解決,并在Activity的onResume中調(diào)用webview.onResume()恢復(fù),如下:

  1. @Override 
  2.     protected void onPause() { 
  3.        h5_webview.onPause(); 
  4.        h5_webview.pauseTimers();        
  5.           super.onPause(); 
  6.     } @Override 
  7.     protected void onResume() { 
  8.        h5_webview.onResume(); 
  9.        h5_webview.resumeTimers();        
  10.           super.onResume(); 
  11.     }  

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

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().

通知內(nèi)核嘗試停止所有處理,如動(dòng)畫(huà)和地理位置,但是不能停止Js,如果想全局停止Js,可以調(diào)用pauseTimers()全局停止Js,調(diào)用onResume()恢復(fù)。

2、5.0 以后的WebView加載的鏈接為Https開(kāi)頭,但是鏈接里面的內(nèi)容,比如圖片為Http鏈接,這時(shí)候,圖片就會(huì)加載不出來(lái),解決方法:

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

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

3、WebView與JavaScript相互調(diào)用時(shí),如果是debug沒(méi)有配置混淆時(shí),調(diào)用時(shí)沒(méi)問(wèn)題的,但是當(dāng)設(shè)置混淆后發(fā)現(xiàn)無(wú)法正常調(diào)用了,解決方法:

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

  1. -keepattributes *Annotation*   
  2. -keepattributes *JavascriptInterface* 
  3. -keep public class org.mq.study.webview.DemoJavaScriptInterface{     
  4.     public <methods>; 
  5.  

如果是內(nèi)部類(lèi):  

  1. -keepattributes *Annotation* 
  2. -keepattributes *JavascriptInterface* 
  3. -keep public class org.mq.study.webview.webview.DemoJavaScriptInterface$InnerClass{     
  4.     public <methods>; 
  5.  
責(zé)任編輯:龐桂玉 來(lái)源: 安卓巴士Android開(kāi)發(fā)者門(mén)戶(hù)
相關(guān)推薦

2021-08-29 18:36:17

MySQL技術(shù)面試題

2020-10-12 09:49:14

C++ 開(kāi)發(fā)代碼

2019-10-28 14:07:29

研發(fā)管理技術(shù)

2019-12-05 08:44:20

MybatisSQL場(chǎng)景

2022-10-20 18:00:59

OCP模型參數(shù)

2021-05-27 09:27:35

開(kāi)發(fā)技能緩存

2020-11-08 14:38:35

JavaScript代碼開(kāi)發(fā)

2009-07-23 15:07:32

2020-04-26 14:40:19

戴爾

2025-05-28 00:00:01

MySQL場(chǎng)景索引

2011-04-26 09:22:05

SQLite

2018-04-25 10:57:00

AIX報(bào)錯(cuò)vios

2023-03-13 07:41:34

分頁(yè)查詢(xún)數(shù)據(jù)排序

2021-04-04 22:31:26

白帽子廠商漏洞

2020-09-24 10:49:09

iOSiPadOSBug

2021-06-09 19:25:13

IODubbo

2021-02-19 11:01:46

異步競(jìng)態(tài)接口異步

2017-09-07 15:23:21

神經(jīng)網(wǎng)絡(luò)數(shù)據(jù)網(wǎng)絡(luò)

2018-03-26 09:39:06

大數(shù)據(jù)IT互聯(lián)網(wǎng)

2024-03-18 08:14:07

SpringDAOAppConfig
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 又爽又黄axxx片免费观看 | 国产精品一区二区av | 日韩最新网址 | 久久亚洲精品久久国产一区二区 | 日韩在线观看一区 | 日韩视频中文字幕 | 国产精品99久久久久久www | 日韩中文在线视频 | 国产精品18hdxxxⅹ在线 | 亚洲视频欧美视频 | 日本韩国电影免费观看 | 日韩男人天堂 | 欧美视频 | 国产精品免费观看视频 | 日日骚网 | 精品日韩在线 | 精品视频免费 | 亚洲精品日韩一区二区电影 | 国产伦精品一区二区三毛 | 一级黄色片毛片 | 亚洲成人一区二区三区 | 高清色| 国产美女在线观看 | 色综合99| 日本不卡视频在线播放 | 久久精品青青大伊人av | 国产精品久久久久久亚洲调教 | 精品国产欧美一区二区三区成人 | 精品视频免费 | 国产成人久久精品一区二区三区 | 久久草在线视频 | 国产精品久久久久久久白浊 | 亚州一区二区三区 | 久在线 | 99亚洲精品| 中文字幕一区二区三区日韩精品 | 亚洲精品欧洲 | 国产在线一区二区三区 | 一级a爱片久久毛片 | 中文字幕亚洲区 | 91精品国产乱码久久久久久久久 |