WebView提供了在Android应用中展示网页的强大功能。也是目前Hybird app的大力发展的基础。作为Android系统的一个非常重要的组件,它提供两方面的强大的能力:对HTML的解析,布局和绘制;对JavaScript的解释和执行。Hybird App的组成是Native+H5,Native部分是java语言实现;而JavaScript是H5中必不可少的部分。因此就会遇到Java与JavaScript互相调用的情况!这里记录了一个最基本的互相调用的例了!

1.Native布局中添加WebView组件

 <WebView
android:id="@+id/wv_contacts"
android:layout_below="@id/tv_title"
android:layout_width="match_parent"
android:layout_height="match_parent">
</WebView>

2.初始化WebView,设置允许使用JavaScript并载入页面

   private void initWebView() {
mWebView = (WebView) findViewById(R.id.wv_contacts);
WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
mWebView.loadUrl("file:///android_asset/constacts.html");
}

3.java调用javaScript(mWebView.loadUrl("javascript:method(param)");)
首先定义好JavaScript函数:

 function showData(constactsData){
var html="";
var ullist = document.getElementById("contacts_list");
var constactsJsonData = eval(constactsData);
for(var i = 0; i < constactsJsonData.length; i++){
html += "<li onclick=callPhone(\"" + constactsJsonData[i].number + "\")>" + constactsJsonData[i].name + "</li>";
}
ullist.innerHTML = html;
}

然后在java调用JavaScript,放在onPageFinished回调中调用是为了保证,调用Js时,Js已全部加载完成

 mWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
} @Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
showContactsInfo();
}
}); private void showContactsInfo() {
String info = jsInterface.readContacts();
mWebView.loadUrl("javascript:showData(" + info + ")");
}

4.在Js中调用Java(mWebView.addJavascriptInterface(new JavaScriptInterface(), "interface");)。如代码所示,在Js中调用Java Native方法。需要将需要调用的方法所属对象转化为一个别名。将这个别名透传到JavaScript中,然后在JavaScript中通过别名访问Native方法。

首先添加别名

mWebView.addJavascriptInterface(new JSInterface(this.getApplicationContext()), "jsinterface"); 
然后定义Native方法

 public void callPhone(String number) {
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + number));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}

最后通过别名在JavaScript中进行调用
  function callPhone(number){ jsinterface.callPhone(number); }

如果便完成了Hybird App中的最基本的Java和JavaScript的通信的功能!

最新文章

  1. NetBean 8 创建EJB
  2. 控制移动端页面的缩放(meta)
  3. 安装MySQL5.7
  4. C使用相关笔记
  5. method chaining
  6. struts2与cookie实现自动登录和验证码验证
  7. 【疯狂Java讲义学习笔记】【数据类型与运算符】
  8. 手把手教你从Core Data迁移到Realm
  9. Arcgis sde 10.1您不能创建在安装后的空间库,提示User has privileges required to create database objects.
  10. 认识ASP.NET MVC6
  11. iOS-延迟操作方法总结
  12. sgu176 Flow Construction【有源汇有上下界最小流】
  13. Mirantis MCP 1.0:OpenStack 和 Kubernetes 整合的第一步
  14. mysql 从一个表中查询,插入到另一个表中
  15. Luogu P2602 [ZJOI2010]数字计数
  16. spring 代理注解 &lt;aop:aspectj-autoproxy /&gt;
  17. gitlab无法push或clone的错误:JWT::DecodeError (Nil JSON web token): lib/gitlab/workhorse.rb:120:in `verify_api_request!&#39;
  18. 首页设计的可用性和PET
  19. 从Objective-C到Swift,你必须会的(二)组合options
  20. Software Testing Techniques Homework 2

热门文章

  1. 【转】Mybatis Generator最完整配置详解
  2. iOS 详解NSXMLParser方法解析XML数据方法
  3. Modbus Poll master-slave测试 Dtech USB转485(worldsing 笔记)
  4. JavaScript要点(七) 函数调用
  5. 完全分布式Hadoop2.3安装与配置
  6. Android真机抓屏- Android Screen Monitor
  7. 利用sqlmap和burpsuite绕过csrf token进行SQL注入 (转)
  8. EXE文件结构及读取方法
  9. SQLSERVER复制表的方法
  10. android学习日记27--Dialog使用及其设计模式