Android中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true

Android(Java)与JavaScript(HTML)交互有四种情况:

1) Android(Java)调用HTML中js代码

2) Android(Java)调用HTML中js代码(带参数)

3) HTML中js调用Android(Java)代码

4) HTML中js调用Android(Java)代码(带参数)

代码如下:

android端

MainActivity:

[java] view plain copy
  1. packagecom.home.jsandandroid;
  2. importandroid.app.Activity;
  3. importandroid.os.Bundle;
  4. importandroid.view.KeyEvent;
  5. importandroid.view.View;
  6. importandroid.webkit.WebChromeClient;
  7. importandroid.webkit.WebSettings;
  8. importandroid.webkit.WebView;
  9. importandroid.widget.Toast;
  10. publicclassMainActivityextendsActivity{
  11. privateWebViewmWebView;
  12. @Override
  13. protectedvoidonCreate(BundlesavedInstanceState){
  14. super.onCreate(savedInstanceState);
  15. showWebView();
  16. }
  17. /**
  18. *显示webView并实现webView与js交互
  19. */
  20. privatevoidshowWebView(){
  21. try{
  22. mWebView=newWebView(this);
  23. setContentView(mWebView);
  24. mWebView.requestFocus();
  25. mWebView.setWebChromeClient(newWebChromeClient(){
  26. @Override
  27. publicvoidonProgressChanged(WebViewview,intprogress){
  28. MainActivity.this.setTitle("Loading...");
  29. MainActivity.this.setProgress(progress);
  30. if(progress>=80){
  31. MainActivity.this.setTitle("JsAndroidTest");
  32. }
  33. }
  34. });
  35. mWebView.setOnKeyListener(newView.OnKeyListener(){//webviewcan
  36. //goback
  37. @Override
  38. publicbooleanonKey(Viewv,intkeyCode,KeyEventevent){
  39. if(keyCode==KeyEvent.KEYCODE_BACK
  40. &&mWebView.canGoBack()){
  41. mWebView.goBack();
  42. returntrue;
  43. }
  44. returnfalse;
  45. }
  46. });
  47. WebSettingswebSettings=mWebView.getSettings();
  48. webSettings.setJavaScriptEnabled(true);
  49. webSettings.setDefaultTextEncodingName("utf-8");
  50. mWebView.addJavascriptInterface(getHtmlObject(),"jsObj");
  51. //此html放在assets目录下
  52. mWebView.loadUrl("file:///android_asset/test.html");
  53. //如果html直接来源于网页上,可以使用下面形式
  54. //mWebView.loadUrl("http://192.168.1.121:8080/jsandroid/index.html");
  55. }catch(Exceptione){
  56. e.printStackTrace();
  57. }
  58. }
  59. privateObjectgetHtmlObject(){
  60. ObjectinsertObj=newObject(){
  61. publicStringHtmlcallJava(){
  62. return"HtmlcallJava";
  63. }
  64. publicStringHtmlcallJava2(finalStringparam){
  65. return"HtmlcallJava:"+param;
  66. }
  67. publicvoidJavacallHtml(){
  68. runOnUiThread(newRunnable(){
  69. @Override
  70. publicvoidrun(){
  71. mWebView.loadUrl("javascript:showFromHtml()");
  72. Toast.makeText(MainActivity.this,"clickBtn",
  73. Toast.LENGTH_SHORT).show();
  74. }
  75. });
  76. }
  77. publicvoidJavacallHtml2(){
  78. runOnUiThread(newRunnable(){
  79. @Override
  80. publicvoidrun(){
  81. mWebView.loadUrl("javascript:showFromHtml2('IT-homerblog')");
  82. Toast.makeText(MainActivity.this,"clickBtn2",
  83. Toast.LENGTH_SHORT).show();
  84. }
  85. });
  86. }
  87. };
  88. returninsertObj;
  89. }
  90. }

js(HTML)

[html] view plain copy
  1. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <!--savedfromurl=(0032)http://localhost:8080/jsandroid/-->
  3. <htmlxmlns="http://www.w3.org/1999/xhtml"><head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8">
  4. <metahttp-equiv="Expires"content="0">
  5. <metahttp-equiv="Pragma"content="no-cache">
  6. <metahttp-equiv="Cache-Control"content="no-store,no-cache">
  7. <metaname="Handheldfriendly"content="true">
  8. <metaname="viewport"content="width=100%;initial-scale=1.0;user-scalable=yes">
  9. <metaname="robots"content="all">
  10. <metaname="keywords"contect="doodle,mobile,doodlemobile,game,games">
  11. <metaname="description"content="MakePeople'sMobileLifeMoreConnectedThroughGames.">
  12. <title>jsandroid_test</title>
  13. <scripttype="text/javascript"language="javascript">
  14. functionshowHtmlcallJava(){
  15. varstr=window.jsObj.HtmlcallJava();
  16. alert(str);
  17. }
  18. functionshowHtmlcallJava2(){
  19. varstr=window.jsObj.HtmlcallJava2("IT-homerblog");
  20. alert(str);
  21. }
  22. functionshowFromHtml(){
  23. document.getElementById("id_input").value="JavacallHtml";
  24. }
  25. functionshowFromHtml2(param){
  26. document.getElementById("id_input2").value="JavacallHtml:"+param;
  27. }
  28. </script>
  29. </head>
  30. <body>
  31. helloIT-homer
  32. <br>
  33. <br>
  34. <br>
  35. <inputtype="button"value="HtmlcallJava"onclick="showHtmlcallJava()"/>
  36. <br>
  37. <inputtype="button"value="HtmlcallJava2"onclick="showHtmlcallJava2()"/>
  38. <br>
  39. <br>
  40. <br>
  41. <br>
  42. <inputid="id_input"style="width:90%"type="text"value="null"/>
  43. <br>
  44. <inputtype="button"value="JavacallHtml"onclick="window.jsObj.JavacallHtml()"/>
  45. <br>
  46. <br>
  47. <br>
  48. <inputid="id_input2"style="width:90%"type="text"value="null"/>
  49. <br>
  50. <inputtype="button"value="JavacallHtml2"onclick="window.jsObj.JavacallHtml2()"/>
  51. </body>
  52. </html>

代码解析:

(1) 允许Android执行js脚本设置

Android(Java)与js(HTML)交互的接口函数是: mWebView.addJavascriptInterface(getHtmlObject(), "jsObj"); // jsObj 为桥连对象

Android容许执行js脚本需要设置:webSettings.setJavaScriptEnabled(true);

(2) js(HTML)访问Android(Java)代码

js(HTML)访问Android(Java)端代码是通过jsObj对象实现的,调用jsObj对象中的函数,如:window.jsObj.HtmlcallJava()

(3) Android(Java)访问js(HTML)代码

Android(Java)访问js(HTML)端代码是通过loadUrl函数实现的,访问格式如:mWebView.loadUrl("javascript: showFromHtml()");

说明:

1) Android访问url网址,需在AndroidManifest.xml文件,配置容许访问网络的权限:
<uses-permission android:name="android.permission.INTERNET" />

2) Android(Java)调用js(HTML)时,使用的mWebView.loadUrl("javascript: showFromHtml()");函数需在UI线程运行,因为mWebView为UI控件

[java] view plain copy
  1. publicvoidJavacallHtml(){
  2. runOnUiThread(newRunnable(){
  3. @Override
  4. publicvoidrun(){
  5. mWebView.loadUrl("javascript:showFromHtml()");
  6. Toast.makeText(JSAndroidActivity.this,"clickBtn",Toast.LENGTH_SHORT).show();
  7. }
  8. });
  9. }

更多相关文章

  1. android控件背景揭密--NinePatch
  2. Android spinner控件的实现
  3. android动态创建控件
  4. Android应用开发——TextView控件属性列表
  5. Android JSON解析示例代码
  6. 【Android】Android Studio 1.5+ 中混合调试Native和Java代码

随机推荐

  1. mysql和oracle的区别小结(功能性能、选择
  2. MySQL全文索引、联合索引、like查询、jso
  3. Mysql中批量替换某个字段的部分数据(推荐
  4. Mysql update多表联合更新的方法小结
  5. mysql 替换字段部分内容及mysql 替换函数
  6. mysql并发控制原理知识点
  7. mysql创建表的sql语句详细总结
  8. Windows 64位重装MySQL的教程(Zip版、解压
  9. mysql 悲观锁与乐观锁的理解及应用分析
  10. mysql 复制原理与实践应用详解