Android WebView使用总结

本文详细介绍Android中WebView组件的使用方法,包括配置网络权限、支持JavaScript、加载本地与远程页面、拦截网页链接、处理Back按键行为及自定义JavaScript接口。此外还介绍了如何利用WebViewClient和WebChromeClient提升用户体验。
基础篇
在Android手机中内置了一款高性能webkit内核浏览器,在SDK中封装为一个叫做WebView组件。 
什么是webkit 
        WebKit是Mac OS X v10.3及以上版本所包含的软件框架(对v10.2.7及以上版本也可通过软件更新获取)。 同时,WebKit也是Mac OS X的Safari网页浏览器的基础。WebKit是一个开源项目,主要由KDE的KHTML修改而来并且包含了一些来自苹果公司的一些组件。 
     传统上,WebKit包含一个网页引擎WebCore和一个脚本引擎JavaScriptCore,它们分别对应的是KDE的KHTML和KJS。不过, 随着JavaScript引擎的独立性越来越强,现在WebKit和WebCore已经基本上混用不分(例如Google Chrome和Maxthon 3采用V8引擎,却仍然宣称自己是WebKit内核)。 
这里我们初步体验一下在android是使用webview浏览网页,在SDK的Dev Guide中有一个WebView的简单例子。在看下面这些总结知识之前,大家请看示例代码中MainActivtiy的代码,运行整个程序后,第一个页面显示的就是MainActivity的运行效果。上面的Button按钮是点击到第二个Activity进行测试用的。

在开发过程中应该注意几点:
1.AndroidManifest.xml中必须使用许可"android.permission.INTERNET",否则会出Web page not available错误。
2.如果访问的页面中有Javascript,则webview必须设置支持Javascript。webview.getSettings().setJavaScriptEnabled(true);  
3. 在要Activity中生成一个WebView组件:WebView webView = new WebView(this);
4. 设置WebView基本信息:
如果访问的页面中有Javascript,则webview必须设置支持Javascript。
   webview.getSettings().setJavaScriptEnabled(true);  
   触摸焦点起作用 requestFocus(); 
取消滚动条  this.setScrollBarStyle(SCROLLBARS_OUTSIDE_OVERLAY)
5. 设置WevView要显示的网页: 
互联网用:webView.loadUrl("http://www.google.com"); 
   本地文件用:webView.loadUrl(file:///android_asset/xx.html);固定格式
    本地文件存放在:assets文件中
6. 如果希望点击链接由自己处理,而不是新开Android的系统browser中响应该链接。
给WebView添加一个事件监听对象(WebViewClient)      
   并重写其中的一些方法
    shouldOverrideUrlLoading:对网页中超链接按钮的响应。当按下某个连接时WebViewClient会调用这个方法,并传递参数:按下的url 
     onLoadResource   
     onPageStart  
     onPageFinish  
     onReceiveError
     onReceivedHttpAuthRequest
7.如果页面中链接,如果希望点击链接继续在当前browser中响应,而不是新开Android的系统browser中响应该链接,必须覆盖 webview的WebViewClient对象。
1.        mWebView.setWebViewClient(new WebViewClient(){       
2.            public boolean shouldOverrideUrlLoading(WebView view, String url) { 
3.                                view.loadUrl(url);       
4.                                return true;       
5.                            }       
6.                });
8.如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。
1.        public boolean onKeyDown(int keyCode, KeyEvent event) {       
2.            if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) {  
3.                    mWebView.goBack();       
4.                           return true;       
5.                }       
6.                return super.onKeyDown(keyCode, event);       
7.            }     
9.  @Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, android.net.http.SslError error) { // 重写此方法可以让webview处理https请求
handler.proceed();
}

});

提高篇(一)
    下一步让我们来了解一下android中webview是如何支持javascripte自定义对象的,在w3c标准中js有 window,history,document等标准对象,同样我们可以在开发浏览器时自己定义我们的对象调用手机系统功能来处理,这样使用js就可以为所欲为了。
看一个实例:
public class WebViewDemo extends Activity {        
private WebView mWebView;       
private Handler mHandler = new Handler();       

public void onCreate(Bundle icicle) {       
super.onCreate(icicle);       
setContentView(R.layout.webviewdemo);       
mWebView = (WebView) findViewById(R.id.webview);       
WebSettings webSettings = mWebView.getSettings();       
  webSettings.setJavaScriptEnabled(true);       
mWebView.addJavascriptInterface(new Object() {       
public void clickOnAndroid() {       
mHandler.post(new Runnable() {       
                public void run() {       
                 mWebView.loadUrl("javascript:wave()");       
               }       
           });       
           }       
       }, "demo");       
       mWebView.loadUrl("file:///android_asset/demo.html");       
    }       
}

       我们看addJavascriptInterface(Object obj,String interfaceName)这个方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName(demo),作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的。

<html>       
<mce:script language="javascript"><!--     

   function wave() {       
               document.getElementById("droid").src="android_waving.png";       
      }       
         
// --></mce:script>       
   <body>       
        <a onClick="window.demo.clickOnAndroid()">       
                             <img id="droid" src="android_normal.png" mce_src="android_normal.png"/><br>       
                            Click me!       
         </a>       
      </body>       
</html>      

        这样在javascript中就可以调用java对象的clickOnAndroid()方法了,同样我们可以在此对象中定义很多方法(比 如发短信,调用联系人列表等手机系统功能。),这里wave()方法是java中调用javascript的例子。
这里还有几个知识点: 
1)为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html" 
2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用 Handler的目的。


提高篇(二)

Android中使用WebView, WebChromeClient和WebViewClient加载网页

     在android应用中,有时要加载一个网页,如果能配上一个进度条就更好了,而android中提供了其很好的支持,运行示例程序后点击Button,跳转到WebPageLoader中,就可以看到进度条的效果了。
要注意的是,其中的webView的一系列用法,比如 webView.getSettings().setJavaScriptEnabled(true);设置可以使用javscript; 
webView.getSettings().setJavaScriptEnabled(true);    
webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);    
webView.setHorizontalScrollBarEnabled(false);    
webView.getSettings().setSupportZoom(true);    
webView.getSettings().setBuiltInZoomControls(true);    
webView.setInitialScale(70);    
webView.setHorizontalScrollbarOverlay(true);


等等,具体参考API 
而进度条的使用是在new出一个setWebChromeClient后,可以在内部类中写 
onProgressChanged事件 
在WebView的设计中,不是什么事都要WebView类干的,有些杂事是分给其他人的,这样WebView专心干好自己的解析、渲染工作就行了。WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括: 
onLoadResource 
onPageStart 
onPageFinish 
onReceiveError 
onReceivedHttpAuthRequest 
WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等 
onCloseWindow(关闭WebView) 
onCreateWindow() 
onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出) 
onJsPrompt 
onJsConfirm 
onProgressChanged 
onReceivedIcon 
onReceivedTitle 

示意图如下:


1.PNG 

2.PNG 

3.PNG 
### Android WebView 使用教程 #### 什么是 WebView? `WebView` 是 Android 提供的一个控件,用于在应用内部加载和展示网页内容。它允许开发者嵌入 HTML 页面到应用程序中,并支持 JavaScript 和 CSS 的执行。 --- #### 基本初始化与配置 要使用 `WebView`,首先需要在布局文件中定义该组件: ```xml <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 接着,在 Activity 或 Fragment 中获取并初始化 `WebView` 实例: ```java import android.os.Bundle; import android.webkit.WebSettings; import android.webkit.WebView; public class MainActivity extends AppCompatActivity { private WebView webView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); webView = findViewById(R.id.webView); // 启用JavaScript支持 WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); // 加载URL webView.loadUrl("https://www.example.com"); } } ``` 上述代码展示了如何启用 JavaScript 支持以及加载指定 URL[^1]。 --- #### 数据提交 (POST 请求) 如果需要通过 POST 方法向服务器发送数据,则可以使用以下方式: ```java String postData = "username=admin&password=secret"; webView.postUrl("https://example.com/login", EncodingUtils.getBytes(postData, "base64")); ``` 注意:这里的数据编码应遵循目标服务端的要求[^2]。 --- #### 处理 Cookies 为了处理 cookies,可以通过 `CookieManager` 设置或读取 cookie: ```java import android.webkit.CookieManager; // 添加Cookie CookieManager.getInstance().setCookie("https://example.com", "name=value"); // 获取所有Cookies String allCookies = CookieManager.getInstance().getCookie("https://example.com"); System.out.println(allCookies); ``` 此部分操作有助于保持用户的登录状态或其他个性化设置。 --- #### 清除缓存与历史记录 当用户退出或者切换账户时,可能需要清理 WebView 缓存及相关信息: ```java // 清楚缓存 webView.clearCache(true); // 删除历史记录 webView.clearHistory(); // 移除基本认证凭证 webView.removeJavascriptInterface("interfaceName"); // 如果存在敏感数据存储需求,可进一步调用清除函数 webView.clearFormData(); ``` 需要注意的是,移除 Java 对象接口可能会因不同版本的 Android 而表现不一致^。 --- #### 高级特性 除了基础功能外,`WebView` 还具备更多高级选项,比如手势识别、离线浏览模式等。这些都可以通过调整其设置来实现[^4]: ```java WebSettings webSettings = webView.getSettings(); webSettings.setDomStorageEnabled(true); // 开启DOM storage API webSettings.setDatabaseEnabled(true); // 允许数据库API webSettings.setAppCacheEnabled(true); // 启动应用缓存 webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN); // 自适应屏幕宽度 ``` 然而值得注意的一点是,对于 H5 AJAX 请求无法直接拦截修改响应头等内容[^5]。因此某些场景下需借助外部工具完成更复杂的交互逻辑。 --- ### 总结 以上介绍了关于 Android 平台下的 WebView 组件的基础运用技巧及其扩展能力。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值