您的位置:首页 > 移动开发 > Android开发

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

2015-10-07 15:31 369 查看
通过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中定义的一个对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  webview android