native 和 H5 的交互

来源:互联网 发布:java解压缩gz文件 编辑:程序博客网 时间:2024/05/01 17:17

 

源生代码和H5的交互

android:

1: 默认的事情:

android 通过内置的UI控件WebView来加载网页。
         网页是用一个网络地址来表示的:
         其整个使用方法很简单如下:(android不关心实际的html5代码)

String mUrl ="http://www.baidu.com";    //代表了某个网页的网址
       WebView mWebView = newWebView();    //用来家在网址的UI控件
       mWebView.loadUrl(mUrl);                         //加载指定网址

 

2:Html5 调用 android 本地方法

2.1 Html5 调用 android 本地方法一

a: android 本地将被Html5调用的方法都定义在一个Object中。【假定这个Object 叫 JavaScriptInterface1 】(暴露给html5的方法)

b:WebView通过addJavascriptInterface(new JavaScriptInterface1(), "robot"); 
将定义了回调方法的对象注入WebView中,这样html5就能通过注入的这个对象调用本地方法。【注入的对象的引用叫 “robot”】

c: 在html5中,如下书写 ,就能调用android本地的方法

<p>
<button onclick="robot. callAndroidMethod()">点击我调用android 方法</button>
</p>

<p>
<button onclick="interface.callFromJSBasicDataType(100,100,'a',true)">callnative method to test basic datatype through javascriptInterface</button>
</p>

d: 要是需要带参数交互那么android 本地代码和 JS中定义的方法可以如下书写:

//------android 代码示例------
     public voidcallFromJSBasicDataType(int x,float y,char c,boolean result){
            String str ="-"+(x+1)+"-"+(y+1)+"-"+c+"-"+result;
        }

public void callAndroidMethod(){
            AppUtils.showDialog();
        }

//------JS配合上面的android示例如下------
<p>
<buttononclick="robot.callFromJSBasicDataType(100,100,'a',true)">点击我调用android 方法</button>
</p>

 

2.2 Html5 调用 android 本地方法二

在网页跳转的时候【必须有跳转】,截获跳转地址Url,分析Url从而得知意图。

android 本地通过自定义WebView中使用到的WebClent对象,从而截获跳转地址:

private class CustomWebViewClient extendsWebViewClient {
//重写webclient,从而截获跳转的地址
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//注意,下面的判断就是意图分析
if (url.contains("www.mystore.com.cn")) {
String msg = url;
AppUtils.showAlertDialog(Html5CallNativeFromSelfWebClient.this,msg);
return true;
}
return false;
}
}

 

 

3  android 本地方法调用html5

android主要是通过WebView的webView.loadUrl("javascript:xxmethod();"); 来调用嵌入html5中的 方法。 例子如下:

a:html5 中 定义一个方法,名叫 "noParamFunction()"

<html>
<head>
<script>
function noParamFunction() {
var component = document.getElementById("noparam_ta");
component.value = component.value + "native button clicked,call js with noparams\n";
}
</script>
</head>
</html>

b: 在android本地:想调用javascript中的noParamFunction方法,如下即可

webView.loadUrl("javascript:noParamFunction();");

 

 

4: 再往下就是URL中附加的私有协议了

 

后端给前端发送数据的约定

1:后端给前端发送的数据整个就是一个网页地址 +#myrainbowparams#+ json +#myrainbowparams#的组合结构。 
(比如:
http://mystore.com.cn/v1/page/goods_info?#myrainbowprams#{"clientaction":"1","actionid": "100","params": {"bugoodsid": "1000"}}#myrainbowprams#

2:注意:
只有满足下面2个条件前端才会acitonid去执行动作
a
h5给的数据中包含#myrainbowprams#
b: clientaction = 1

3:参数说明

参数  

必选  

类型及范围  

说明  

备注  

clientaction

TRUE

string

是否需要app自己处理H5给的数据" 0->不需要处理" ; "1-->需要处理"

actionid

true

string

clientaction0 actionid填为-1clientaction1 actionid填为正常的编号

params

TRUE

jsonobject

clientaction0 params填为null ; clientaction1 params正常填写

登录:可选

h5给前段的整个数据示例如下

http://mystore.com.cn/v1/page/goods_info?#myrainbowprams#{
"clientaction": "1",
"actionid": "100",
"params": {
"bugoodsid": "1000" 

}
}
#myrainbowprams#

对上面的这些信息前段接收到之后理解如下:
1
:前端需要自己处理,而不是简单的利用webkit引擎去进行页面跳转
2
:前端需要执行编号为100的动作
3
执行编号为100的动作所需要的参数在params中,有 bugoodsid , url等。。请按照需求取。

 

 

 

8 0