Android与WebWiew的同步和异步访问机制

通过WebView可以在Android客户端用Web开发的方式来开发我们的应用。其实就只需要通过html和javascript来跟服务器交互就可以了。

1)首先定义一个布局,就是一个WebView:

    <linearlayout  xmlns: android = "http://schemas.android.com/apk/res/android"

                             android: layout_width = "match_parent"

                             android: layout_height = "match_parent"

                             android: orientation = "vertical"  >

           <webview android: id = "@+id/html5_webview"

                              android: layout_width = "match_parent"

                              android: layout_height = "match_parent"  >

           </webview>

     </linearlayout>


2) 在对应的Activity中,对WebView进行一些初始化

    mWebView = (WebView) findViewById (R.id.html5_webview) ;

   WebSettings webSettings = mWebView.getSettings();

   WindowsAutomatically (webSettings.setJavaScriptEnabled (true));    //告诉WebView让它能够去执行JavaScript语句

   webSettings.setLayoutAlgorithm (LayoutAlgorithm.NOMAL) ;

   mWebView.setWebChromeClient (new WebServerChromeClient()) ;

   mWebView.setWebViewClient (new WebServerChromeClient()) ;

   mWebView.setVerticalScrollBarEnabled (false) ;

   mWebView.reguestFocusFromTouch() ;

   mWebView.addJavaScriptInterface (new AppJavascriptInterface(), "nintf") ;

这个JavascriptInterface则是android原生环境和javascript交互的另一个窗口,将我们自定义的AppJavascriptInterface类,调用mWebView的addJavascriptInterface方法,可以将这个对象传递给mWebView中Window对象的nintf属性(“nintf”这个属性名称是自定义的)之后,可直接在javascript中调用这个Java对象的方法。


3) Html中的javascript是如何跟android原生环境来交互的{同步,异步}

同步访问:

         在JavaScript中,我们定义了这样一个方法,如下:

             var exec = function (service, action, args) {

                   var json = { "service": service, "action": action } ;

                   var result_str = prompt (JSON.stringify (json).args) ;

                   var result;

                   try {

                           result = JSON.parse (result_str);

                         } catch (e) {

                             console.error (e.message); }

                   var status = result.status;

                    var message = result.message;

                 if (status == 0) {

                          return message ;

                    } else {

                          console.error( "service:" + service + "action: " + action + "error:"+ message);

     }

   }

对此方法调用: exec("Toast","makeTextShort", JSON.stringify(text));

        class WebServerChromeClient extends WebChromeClient {

           @override

           public boolean onJsPrompt(WebView view, String url, String message,String defaultValue,JsPromptResult result){

           System.out.println("onJsPrompt:defaultValue:"+defaultValue+"1"+url+","+message);

JSONObject args = null;

JSONObject head = null;

try{

    head = new JSONObject(message);

    args = new JSONObject(defaultValue);

    String execResult = mPluginManager.exe(head.getString(IPluginACTION),args);

    result.confirm(execResult);

    return true;

   }....

}

当OnJsPrompt方法返回true时,说明WebChromeClient已处理了这个prompt事件。



异步访问:

  var exec.asyn=function(service,action,args,success,fail)

  {

    var json={"service":service, "action":action};

    var result= AndroidHtml5.callNative(json.args,success,fail);}

我们会调用AndroidHtml5的callNative,此方法有四个参数:

a)json:调用的服务和操作

b)args:对应的参数数

c)success:成功时的回调方

d)fail:失败时的回调方

调用如下:

var success = function(data){ };

var fail = function(data){ };

exec_asyn( "Contacts", "openContacts", '{ }',successful, fail);


对AndroidHtml5是在Javascript中定义的一个对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值