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中定义的一个对象
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中定义的一个对象
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories