FROM :http://blog.csdn.net/hj563308597/article/details/45197709

Android WebView

在公司Android的开发过程中遇到一个新的问题,那就是让android代码和Javascript代码进行交互,然后在网上找到了关于webView的资料,之前并没有深入去了解WebView,一直以为Android 的WebView是一个用来显示网页的组件而已,没想到功能如此强大,竟然能跟JS互调传参,太牛了!

1、什么是webView?

WebView是一个webkit的内核,android对其做了很好的优化跟封装,主要用来处理网页相关的问题,盗图一张

2、webView相关类的作用可以去查api,网站上面也很多,主要就是WebChromeClient,WebViewClient、WebSettings几个类,比较关键的就是加载本地js网页跟网络js网页的时候要有点区别,注意权限跟访问方式有点点区别,下面贴代码:

[java] view plain copy
  1. packagecom.chinaonenet.mywebview;
  2. importandroid.annotation.SuppressLint;
  3. importandroid.app.Activity;
  4. importandroid.os.Bundle;
  5. importandroid.os.Handler;
  6. importandroid.view.Menu;
  7. importandroid.view.MenuItem;
  8. importandroid.view.View;
  9. importandroid.view.View.OnClickListener;
  10. importandroid.webkit.WebSettings;
  11. importandroid.webkit.WebView;
  12. importandroid.widget.Button;
  13. /**
  14. *@authorhujun
  15. *
  16. *QQ:563008597
  17. *
  18. *SuppressLint一定要加上去!!!
  19. *低版本可能没问题,高版本JS铁定调不了Android里面的方法
  20. *
  21. */
  22. @SuppressLint("SetJavaScriptEnabled")
  23. publicclassMainActivityextendsActivity{
  24. //声明一个webview
  25. privateWebViewmWebView;
  26. privateMyWebViewClientWVClient;
  27. privateWebSettingswebSettings;
  28. privateMyWebChromeClientchromeClient;
  29. //测试Button,忽略就行
  30. privateButtontestBtn;
  31. //调用JS的Button
  32. privateButtoncallJSBtn;
  33. //双击返回退出应用
  34. privatelongexitTime=0;
  35. //Object对象,用来跟JS网页绑定
  36. privateJSObjectjsobject;
  37. //android调用JS网页的时候会用到
  38. privateHandlermHandler=newHandler();
  39. @Override
  40. protectedvoidonCreate(BundlesavedInstanceState){
  41. super.onCreate(savedInstanceState);
  42. setContentView(R.layout.activity_main);
  43. initView();
  44. }
  45. privatevoidinitView(){
  46. //TODOAuto-generatedmethodstub
  47. mWebView=(WebView)findViewById(R.id.webview);
  48. testBtn=(Button)findViewById(R.id.diyWeb);
  49. callJSBtn=(Button)findViewById(R.id.calljs);
  50. WVClient=newMyWebViewClient();
  51. chromeClient=newMyWebChromeClient();
  52. jsobject=newJSObject(MainActivity.this);
  53. webSettings=mWebView.getSettings();
  54. webSettings.setJavaScriptEnabled(true);
  55. webSettings.setBuiltInZoomControls(true);
  56. webSettings.setSavePassword(false);
  57. //支持多种分辨率,需要js网页支持
  58. webSettings.setUserAgentString("macos");
  59. webSettings.setDefaultTextEncodingName("utf-8");
  60. //显示本地js网页
  61. mWebView.loadUrl(StringUrl.TEST_NET);
  62. mWebView.setWebViewClient(WVClient);
  63. mWebView.setWebChromeClient(chromeClient);
  64. //注意第二个参数JsTest,这个是JS网页调用Android方法的一个类似ID的东西
  65. mWebView.addJavascriptInterface(jsobject,"JsTest");
  66. //测试自定义网页,忽略
  67. testBtn.setOnClickListener(newOnClickListener(){
  68. @Override
  69. publicvoidonClick(Viewv){
  70. //TODOAuto-generatedmethodstub
  71. Stringstr="testmyweb";
  72. mWebView.loadData("<html><body>"+str+"<html><body>","text/html","UTF-8");
  73. }
  74. });
  75. //调用JS网页
  76. callJSBtn.setOnClickListener(newOnClickListener(){
  77. @Override
  78. publicvoidonClick(Viewv){
  79. //TODOAuto-generatedmethodstub
  80. mHandler.post(newRunnable(){
  81. @Override
  82. publicvoidrun(){
  83. //TODOAuto-generatedmethodstub
  84. //调用JS中的函数,当然也可以不传参
  85. mWebView.loadUrl("javascript:androidCallJS('顺便传个参数给JS!')");
  86. }
  87. });
  88. }
  89. });
  90. }
  91. @Override
  92. publicbooleanonCreateOptionsMenu(Menumenu){
  93. //Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
  94. getMenuInflater().inflate(R.menu.main,menu);
  95. returntrue;
  96. }
  97. @Override
  98. publicbooleanonOptionsItemSelected(MenuItemitem){
  99. //Handleactionbaritemclickshere.Theactionbarwill
  100. //automaticallyhandleclicksontheHome/Upbutton,solong
  101. //asyouspecifyaparentactivityinAndroidManifest.xml.
  102. intid=item.getItemId();
  103. if(id==R.id.action_settings){
  104. returntrue;
  105. }
  106. returnsuper.onOptionsItemSelected(item);
  107. }
  108. //单击系统返回键网页回退
  109. @Override
  110. publicvoidonBackPressed(){
  111. //TODOAuto-generatedmethodstub
  112. //if(System.currentTimeMillis()-exitTime>1500){
  113. if(mWebView.canGoBack()){
  114. mWebView.goBack();
  115. }/*else{
  116. Toast.makeText(this,"再按一次返回键退出",Toast.LENGTH_SHORT).show();
  117. }
  118. exitTime=System.currentTimeMillis();
  119. }*/
  120. else{
  121. this.finish();
  122. }
  123. }
  124. }

[java] view plain copy
  1. packagecom.chinaonenet.mywebview;
  2. importandroid.content.Context;
  3. importandroid.util.Log;
  4. importandroid.webkit.JavascriptInterface;
  5. importandroid.widget.Toast;
  6. publicclassJSObject{
  7. /*
  8. *绑定的object对象
  9. **/
  10. privateContextcontext;
  11. publicJSObject(Contextcontext){
  12. this.context=context;
  13. }
  14. /*
  15. *JS调用android的方法
  16. *@JavascriptInterface仍然必不可少
  17. *
  18. **/
  19. @JavascriptInterface
  20. publicStringJsCallAndroid(){
  21. Toast.makeText(context,"JsCallAndroid",Toast.LENGTH_SHORT).show();
  22. return"JScallAndorid";
  23. }
  24. }

下面上传工程下载链接:http://download.csdn.net/detail/hj563308597/8624449

http://www.cnblogs.com/greatverve/archive/2012/01/18/android-javascript.html

更多相关文章

  1. Android Native代码中的status_t定义
  2. 3.6.3新版本AndroidStudio报Could not resolve all artifacts fo
  3. Android 混淆代码问题总结
  4. 在android中显示网络图片及查看页面源代码
  5. Android中Market的Loading效果实现方法
  6. android:TabHost使用方法
  7. Android内核开发:理解和掌握repo工具(含被墙后的下载方法)

随机推荐

  1. Android(安卓)studio 动态fragment的用法
  2. Android的权限机制之—— “沙箱”机制sh
  3. Android更新UI用法AsyncTask
  4. Android入门
  5. Android(安卓)自定义view 基础篇(一)
  6. Android查看源码
  7. Android第一讲笔记(常用控件以及线性布局
  8. 在Android中使用FFmpeg(android studio环
  9. Android通过http协议POST传输方式
  10. Android(安卓)O添加Settings设置项的方法