最近做了一个demo,利用HTML+JS+CSS做Android的客户端。了解到WebView的强大之处在于Java和javascript可以直接相互调用。重点分析一下java与javascript如何相互调用。

先看Activity的代码

  1. public class WebViewerActivity extends Activity {
  2. /*
  3. * The WebView that is placed in this Activity
  4. */
  5. private WebView mWebView;

  6. /*
  7. * The index page uri
  8. */
  9. private String contentUri = "file:///android_asset/index.html";//A

  10. private Handler mHandler = new Handler(); //B
  11. @Override
  12. public void onCreate(Bundle savedInstanceState) {
  13. super.onCreate(savedInstanceState);

  14. CookieSyncManager.createInstance(this);

  15. requestWindowFeature(Window.FEATURE_NO_TITLE);

  16. mWebView = new WebView(this);
  17. setContentView(mWebView);

  18. WebSettings settings = mWebView.getSettings();
  19. //settings.setAllowFileAccess(true);
  20. settings.setJavaScriptEnabled(true);
  21. settings.setJavaScriptCanOpenWindowsAutomatically(true);
  22. //settings.setBuiltInZoomControls(true);
  23. settings.setDefaultTextEncodingName("utf-8");

  24. mWebView.addJavascriptInterface(new Object() { //C
  25. public void exit() {
  26. Log.i("javascript", "exit");
  27. finish();
  28. }

  29. /**
  30. *
  31. * @param type the resource type.
  32. * @param id the resource id.
  33. * @return
  34. */
  35. public String getContent(String type, String id) { //D
  36. return “resource type is ” + type + “ and id is ” + id;
  37. }, "demo");
  38. mWebView.loadUrl(contentUri);
  39. }
  40. ……………………………………
  41. public void openMenu() {
  42. mHandler.post(new Runnable() { //B
  43. public void run() {
  44. mWebView.loadUrl("javascript:openMenu()");
  45. }
  46. });
  47. }

  48. @Override
  49. public boolean onCreateOptionsMenu(Menu menu) {
  50. return true;
  51. }

  52. @Override
  53. public boolean onPrepareOptionsMenu(Menu menu) {
  54. openMenu();
  55. return true;
  56. }
复制代码

上述代码有以下几点需要注意的。
1. //A为了让WebView从apk文件加载assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的assets目录中寻找内容。如上面的file:///android_asse/index.html
2. //B 在java中访问javascript的方法时,要跑在其他的线程中。这边与弹出菜单栏为例。
3. //C addJavascriptInterface(Object obj,String interfaceName)方法非常关键,是java和javasript的桥梁。该方法将一个java对象绑定到一个javascript对象中。javascript对象名就是interfaceName,作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过javascript:window.demo访问到绑定的java对象了。而且javascript访问java 的方法可以带参数。本人只试过传String类型。

接着看HTML中如何调用。

  1. <html xmlns="http://www.w3.org/1999/xhtml">
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  4. <title>demo index</title>
  5. <script type="text/javascript">
  6. function showMenuItems() //A
  7. {
  8. var menuDiv = document.getElementById ("menu_div");
  9. menuDiv.innerHTML =”<b>open menu</b>”
  10. }
  11. </script>
  12. </head>
  13. <body>
  14. <script type="text/javascript">
  15. var data = window.demo.getContent ("music","1"); //B
  16. document.write(“<h3>” + data + “</h3>”);
  17. </script>
  18. <div id="menu_div"></div>
  19. </body>
  20. </html>
复制代码

//A 当点击手机上的menu按钮就会被触发。
//B 调用java代码 //D (getContent方法)

通过这段时间开发,总结了一点经验。由于每次修改一点HTML,CSS或者JS都要装载在手机模拟器看效果。但是这个过程比较慢,严重影响效率。所以,最好通过FireFox或其他浏览器调试好了。在转载到手机模拟器上。

更多相关文章

  1. 如何用同一份代码产生不同包名得APK包
  2. android LayoutInflater实例化的方法
  3. Android中滑屏实现----手把手教你如何实现触摸滑屏以及Scroller
  4. android audio系统的概况
  5. arcgis for android访问arcgis server上自己制作部署的地图服务
  6. (Linux平台)在Android中调用JNI
  7. android中View的实时刷新
  8. [转]Android(安卓)中Preferences的使用
  9. Android(安卓)Studio获取SHA1(获取SHA1的通用方法)

随机推荐

  1. Android(安卓)View
  2. Android(安卓)横竖屏切换时候重新进行数
  3. Android安卓应用版本命名规范
  4. android 流量管理
  5. Android开发面试经——2.常见Android基础
  6. android xml 设置半透明
  7. 带着问题学习 Android(安卓)Handler 消息
  8. android设置跑马灯效果
  9. Android(安卓)进程管理
  10. 视频教程-FFmpeg+OpenGL ES+OpenSL ES打