android系统中的js与java之间的互调

 

 

在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开始工作。

 

你可能感兴趣的:(JavaScript,java,html,android,function,webkit)