在android系统中提供了js与java互调的接口函数,通过webview中的addJavascriptInterface方法,可以将java函数类注册进webkit,并提供给js进行调用,而webview的loadUrl方法是给webkit传递一个uri,供浏览器来进行解析。
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mWebView = (WebView) findViewById(R.id.webview);
WebSettings webSettings = mWebView.getSettings();
webSettings.setSavePassword(false);
webSettings.setSaveFormData(false);
webSettings.setJavaScriptEnabled(true);
webSettings.setSupportZoom(false);
mWebView.setWebChromeClient(new MyWebChromeClient());
mWebView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo");
mWebView.loadUrl("file:///android_asset/eluosi.html");
}
final class DemoJavaScriptInterface {
DemoJavaScriptInterface() {
}
/**
* This is not called on the UI thread. Post a runnable to invoke
* loadUrl on the UI thread.
*/
public void left() {
mHandler.post(new Runnable() {
public void run() {
mWebView.loadUrl("javascript:keyControl(37)");
}
});
}
上面的这个例子中在addJavascriptInterface中注册了函数DemoJavaScriptInterface,而此函数中的left方法就是供js文件进行解析的。方法调用就是借用loadUrl来传递javascript函数。
抽象图形如下:
在html中的JavaScript文件中有这么一个函数:
function keyControl(s)
{
if(gameState!=1)return;
switch(s){
case 37:{ //left
for(i=0;i<4;i++)if(BX[i]==0)return;
for(i=0;i<4;i++)if(getClass(BX[i]-1,BY[i])=="SB")return;
for(i=0;i<4;i++)setClass(BX[i],BY[i],"BK");
for(i=0;i<4;i++)BX[i]=BX[i]-1;
for(i=0;i<4;i++)setClass(BX[i],BY[i],"MB");
break;}
case 38:{ //up
var preMBarX=new Array(4);
var preMBarY=new Array(4);
var cx=Math.round((BX[0]+BX[1]+BX[2]+BX[3])/4);
var cy=Math.round((BY[0]+BY[1]+BY[2]+BY[3])/4);
for(i=0;i<4;i++){
preMBarX[i]=Math.round(cx-cy+BY[i]);
preMBarY[i]=Math.round(cx+cy-BX[i]);
if(preMBarX[i]<0 || preMBarX[i]>9 || preMBarY[i]<0 || preMBarY[i]>15)return;
if(getClass(preMBarX[i],preMBarY[i])=="SB")return;
}
for(i=0;i<4;i++)setClass(BX[i],BY[i],"BK");
for(i=0;i<4;i++){
BX[i]=preMBarX[i];
BY[i]=preMBarY[i];
}
for(i=0;i<4;i++)setClass(BX[i],BY[i],"MB");
break;}
case 39:{ //right
for(i=0;i<4;i++)if(BX[i]==9)return;
for(i=0;i<4;i++)if(getClass(BX[i]+1,BY[i])=="SB")return;
for(i=0;i<4;i++)setClass(BX[i],BY[i],"BK");
for(i=0;i<4;i++)BX[i]=BX[i]+1;
for(i=0;i<4;i++)setClass(BX[i],BY[i],"MB");
break;}
case 40:{ //down
moveBar();
break;}
}
}
是Java文件调用的JavaScript方法。
而html中的
<tr><td ><input type=button id="left" style="width:60px" value="right" onclick="return right();"></td></tr>
就是调用了JavaScript中的:
function right(){
window.demo.right();
}
window.demo.right();调用了java的一个方法。
html产生一个事件,传给JavaScript,JavaScript通过window.demo.right();函数调用java方法。在java方法中产生一个回调,使html开始工作。