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(安卓)home键和back键区别
  2. Android横竖屏切换
  3. Android中使用WebView, WebChromeClient和WebViewClient加载网页
  4. 横竖屏切换问题
  5. Android(安卓)模块化完整方案实现
  6. Android(安卓)MediaPlayer
  7. 逐帧(Frame)动画
  8. ReactNative(嵌入到android)调用android原生组件与原生模块(比如某
  9. Android(安卓)AsyncTask

随机推荐

  1. Android(安卓)Intent
  2. popwindow动画显示消失,activity切换动画
  3. android 使用Intent传递对象 Serializabl
  4. android中LayoutInflater的使用
  5. android 使用私有maven仓库发布、打包、
  6. Android(安卓)UI(5)Getting Started - Sh
  7. Android中的Button自定义点击效果
  8. Android(安卓)Studio3.3.2 +OpenCV3.4.3
  9. Android获取存储卡路径的方式
  10. Android(安卓)手电筒源码