Android和H5之间的交互

说到android与H5的交互,首先要讲下WebView基本使用.

WebView是View的一个子类,可以让你在activity中显示网页。 可以在布局文件中写入WebView:比如下面这个写了一个填满整个屏幕的WebView:

"1.0" encoding="utf-8"?>
"http://schemas.android.com/apk/res/android"
    android:id="@+id/webview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
/>
复制代码

加载一个网页,使用

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

复制代码

当然还要注意要在manifest中加上访问网络的权限:

 
    "android.permission.INTERNET" /> 
    ... 

复制代码

设置WebView要显示的网页

设置WevView要显示的网页方法有很多:

互联网页面直接用: 

myWebView.loadUrl(“http://www.google.com“);
复制代码

  本地文件用:

myWebView.loadUrl(“file:///android_asset/XX.html“);  
复制代码

  本地文件存放在:assets文件中。

  还可以直接载入html的字符串,如:

String htmlString = "

Title

This is HTML text
Formatted in italics
Anothor Line

"
; // 载入这个html页面 myWebView.loadData(htmlString, "text/html", "utf-8"); 复制代码

在WebView中使用JavaScript

   如果你想要载入的页面中用了JavaScript,你必须为你的WebView使能 JavaScript。 一旦使能之后,你也可以自己创建接口在你的应用和JavaScript代码间进行交互。

WebView myWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = myWebView.getSettings();
//支持JS
webSettings.setJavaScriptEnabled(true);
复制代码

处理页面浏览   当用户点击了你的WebView中的一个链接,默认的行为是Android启动一个处理URL的应用,通常,默认的浏览器打开并下载目标URL。   但是,你可以在你的WebView中覆盖这一行为,使得连接仍在你的WebView中打开。   之后,根据在WebView中维护的网页浏览历史,你可以允许用户向前或向后浏览他们的网页。

在WebView中打开所有链接

WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebViewClient(new WebViewClient());
复制代码

 此时就OK了, 就可以在你的WebView中打开链接了。

关于打开链接位置的更多控制 如果你对在哪里打开链接需要更多的控制,你可以创建自己的类,继承WebViewClient,然后覆写shouldOverrideUrlLoading方法。

private class MyWebViewClient extends WebViewClient
    {
        //在这个方法里面进行拦截用户点击的Url
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url){
              
                mWebView.loadUrl(url);
                return true;
            }
    }
复制代码

与H5交互也很简单

WebView mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
//支持JS
webSettings.setJavaScriptEnabled(true);
 mWebView.addJavascriptInterface(new JsInteration(), "android");
/**
 * 打开js接口給H5调用,参数1为本地类名,参数2为别名;h5用window.别名.类名里的方法名才能调用方法里面的内容,例如:window.android.back();
* */
webView.addJavascriptInterface(new JSInterface(parentActivity), "jump");
	/**
     * 自己写一个类,里面是提供给H5访问的方法
     * */
public class JSInterface {
private Context mContxt;	
public JSInterface(Context mContxt) {
       this.mContxt = mContxt;
 }
        
    @JavascriptInterface
	public void trade(String jsonStr) {
         System.out.println("jsonStr===========" +jsonStr);
	}
 }
复制代码

H5页面关联设置


function shareAndroid(){
window.jump.trade(json_str_dict);
}
复制代码

H5里面这行代码

window.jump.trade(shareValue);  
复制代码

其中jump 对应

webView.addJavascriptInterface(new JSInterface(parentActivity),"jump");
复制代码

中的"jump",而trade()则对应接口JSInterface 里面的trade方法,这两个地方JS怎么写的我们安卓要对应上就行,然后从H5那边传来的数据就存在jsonStr里面,我们获取到这个数据进行操作就行了。是不是很简单!

在这里也说下可能碰到的webview加载网页出现的问题。

Webview 加载一些链接出现白板现象,经过调试onLoadResource已经正常执行,也就是资源文件都已经成功加载,onReceivedSslError也没有回调到,用自带浏览器和UC都是正常,证明链接本身没有问题, Webview也正常运行,没有出现错误,那就是Webview的配置问题了。 经过N个测试,把

webView.getSettings().setJavaScriptEnabled(true);//设置支持javascript脚本
        webView.getSettings().setAllowContentAccess(true);
        webView.getSettings().setAllowFileAccessFromFileURLs(true);
        webView.getSettings().setAppCacheEnabled(true);
        webView.getSettings().setLoadWithOverviewMode(true);
        webView.getSettings().setUseWideViewPort(true);
        webView.getSettings().setPluginState(WebSettings.PluginState.ON);

复制代码

都打开,还是未解决。 最终设置 webView.getSettings().setDomStorageEnabled(true);后成功。 按照API的说明 Sets whether the DOM storage API is enabled. The default value is false. 也就是是否开启本地DOM存储。应该是Html 5中的localStorage(可以使用Android4.4手机和Chrome Inspcet Device联调),用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的,绝大多数的浏览器都是支持 localStorage 的,但是鉴于它的安全特性(任何人都能读取到它,尽管有相应的限制,将敏感数据存储在这里依然不是明智之举),Android 默认是关闭该功能的。

还有一种是加载https的URL时在5.0以上加载不了,5.0以下可以加载,这种情况可能是网页中存在非https得资源,在5.0以上是默认关闭,需要设置,

webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
复制代码

另外记录几个websetting常用的几个设置:

 webSettings.setDomStorageEnabled ( boolean );//是否支持持久化存储,保存到本地
        webSettings.setSupportZoom ( boolean ) ;// 设置支持缩放
        webSettings.setBuiltInZoomControls ( boolean );//设置是否出现缩放工具
        webSettings.setDatabaseEnabled ( boolean );//开启database storage API 功能
        webSettings.setDatabasePath(path);//设置数据库缓存路径
        webSettings.setAppCacheEnabled(boolean);//设置开启application H5 Caches 功能
        webSettings.setAppCachePath(path);//设置application caches 缓存目录
        //设置webview自适应屏幕
        webSettings.setLayoutAlgorithm ( LayoutAlgorithm.SINGLE_COLUMN );
        webSettings.setLoadWithOverviewMode ( true ); 
复制代码

你可能感兴趣的:(Android和H5之间的交互)