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网页的时候要有点区别,注意权限跟访问方式有点点区别,下面贴代码:

  1. package com.chinaonenet.mywebview;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.view.Menu;
  7. import android.view.MenuItem;
  8. import android.view.View;
  9. import android.view.View.OnClickListener;
  10. import android.webkit.WebSettings;
  11. import android.webkit.WebView;
  12. import android.widget.Button;
  13. /**
  14. * @author hujun
  15. *
  16. * QQ:563008597
  17. *
  18. * SuppressLint一定要加上去!!!
  19. * 低版本可能没问题,高版本JS铁定调不了Android里面的方法
  20. *
  21. */
  22. @SuppressLint("SetJavaScriptEnabled")
  23. public class MainActivity extends Activity {
  24. //声明一个webview
  25. private WebView mWebView;
  26. private MyWebViewClient WVClient;
  27. private WebSettings webSettings;
  28. private MyWebChromeClient chromeClient;
  29. //测试Button,忽略就行
  30. private Button testBtn;
  31. //调用JS的Button
  32. private Button callJSBtn;
  33. //双击返回退出应用
  34. private long exitTime = 0;
  35. //Object对象,用来跟JS网页绑定
  36. private JSObject  jsobject;
  37. //android调用JS网页的时候会用到
  38. private Handler mHandler = new Handler();
  39. @Override
  40. protected void onCreate(Bundle savedInstanceState) {
  41. super.onCreate(savedInstanceState);
  42. setContentView(R.layout.activity_main);
  43. initView();
  44. }
  45. private void initView() {
  46. // TODO Auto-generated method stub
  47. mWebView = (WebView) findViewById(R.id.webview);
  48. testBtn = (Button)findViewById(R.id.diyWeb);
  49. callJSBtn = (Button)findViewById(R.id.calljs);
  50. WVClient = new MyWebViewClient();
  51. chromeClient = new MyWebChromeClient();
  52. jsobject = new JSObject(MainActivity.this);
  53. webSettings = mWebView.getSettings();
  54. webSettings.setJavaScriptEnabled(true);
  55. webSettings.setBuiltInZoomControls(true);
  56. webSettings.setSavePassword(false);
  57. //支持多种分辨率,需要js网页支持
  58. webSettings.setUserAgentString("mac os");
  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(new OnClickListener() {
  68. @Override
  69. public void onClick(View v) {
  70. // TODO Auto-generated method stub
  71. String str = "test my web";
  72. mWebView.loadData("<html><body>"+str+"<html><body>", "text/html", "UTF-8");
  73. }
  74. });
  75. //调用JS网页
  76. callJSBtn.setOnClickListener(new OnClickListener() {
  77. @Override
  78. public void onClick(View v) {
  79. // TODO Auto-generated method stub
  80. mHandler.post(new Runnable() {
  81. @Override
  82. public void run() {
  83. // TODO Auto-generated method stub
  84. //调用JS中的 函数,当然也可以不传参
  85. mWebView.loadUrl("javascript:androidCallJS('顺便传个参数给JS!')");
  86. }
  87. });
  88. }
  89. });
  90. }
  91. @Override
  92. public boolean onCreateOptionsMenu(Menu menu) {
  93. // Inflate the menu; this adds items to the action bar if it is present.
  94. getMenuInflater().inflate(R.menu.main, menu);
  95. return true;
  96. }
  97. @Override
  98. public boolean onOptionsItemSelected(MenuItem item) {
  99. // Handle action bar item clicks here. The action bar will
  100. // automatically handle clicks on the Home/Up button, so long
  101. // as you specify a parent activity in AndroidManifest.xml.
  102. int id = item.getItemId();
  103. if (id == R.id.action_settings) {
  104. return true;
  105. }
  106. return super.onOptionsItemSelected(item);
  107. }
  108. //单击系统返回键网页回退
  109. @Override
  110. public void onBackPressed() {
  111. // TODO Auto-generated method stub
  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. }
  1. package com.chinaonenet.mywebview;
  2. import android.content.Context;
  3. import android.util.Log;
  4. import android.webkit.JavascriptInterface;
  5. import android.widget.Toast;
  6. public class JSObject {
  7. /*
  8. * 绑定的object对象
  9. * */
  10. private Context context;
  11. public JSObject(Context context){
  12. this.context = context;
  13. }
  14. /*
  15. * JS调用android的方法
  16. * @JavascriptInterface仍然必不可少
  17. *
  18. * */
  19. @JavascriptInterface
  20. public String  JsCallAndroid(){
  21. Toast.makeText(context, "JsCallAndroid", Toast.LENGTH_SHORT).show();
  22. return "JS call Andorid";
  23. }
  24. }

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

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

[转]JS调用Android里面的方法,Android调用JS里面的方法的更多相关文章

  1. Android 4.2版本以下使用WebView组件addJavascriptInterface方法存在JS漏洞

    JS注入漏洞存在的Android版本:Android < 4.2 综述:Android的SDK中提供了一个WebView组件,用于在应用中嵌入一个浏览器来进行网页浏览.WebView组件中的ad ...

  2. WebView中Js与Android本地函数的相互调用

    介绍 随着Html5的普及,html在表现力上不一定比原生应用差,并且有很强的扩展兼容性,所以越来越多的应用是采用Html与Android原生混合开发模式实现. 既然要实现混合开发,那么Js与Andr ...

  3. uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式

    前言: 关于H5的调用Android原生方法的方式有很多,在该片文章中我主要简单介绍三种与Android原生方法交互的方式. 一.H5+方法调用android原生方法 H5+ Android开发规范官 ...

  4. Android中通过WebView控件实现与JavaScript方法相互调用的地图应用

    在Android中通过WebView控件,可以实现要加载的页面与Android方法相互调用,我们要实现WebView中的addJavascriptInterface方法,这样html才能调用andro ...

  5. android开发中关于继承activity类中方法的调用

    android开发中关于继承activity类中的函数,不能在其他类中调用其方法. MainActivity.java package com.example.testmain; import and ...

  6. [android] 绑定方式开启服务&调用服务的方法

    需求:后台开启一个唱歌服务,这个服务里面有个方法切换歌曲 新建一个SingService继承系统Service 重写onCreate()和onDestory()方法 填一个自定义的方法changeSi ...

  7. Android app启动activity并调用onCreate()方法时都默默地干了什么?

    Android app启动activity并调用onCreate() 方法时都默默地干了什么?   在AndroidManifest.xml文件中的<intent-filter>元素中有这 ...

  8. Android -- service的开启方式, start开启和绑定开启服务,调用服务的的方法, aidl调用远程服务

    1. 概述 bindService() 绑定服务  可以得到服务的代理人对象,间接调用服务里面的方法. 绑定服务: 间接调用服务里面的方法.           如果调用者activity被销毁了, ...

  9. Android(安卓)开发通过NDK调用JNI,使用opencv做本地c++代码开发配置方法 边缘检测 范例代码

    以前写过两个Android开发配置文档,使用NDK进行JNI开发,这样能够利用以前已经写好的C++代码. 前两篇博客地址: http://blog.csdn.net/watkinsong/articl ...

  10. Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net

    Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net 1. 提升单例有能力的1 2. 减少工作数量2 2.1. 减少距 ...

随机推荐

  1. GCD中的dispatch_barrier_async函数的使用(栅栏函数)

    <一>什么是dispatch_barrier_async函数 毫无疑问,dispatch_barrier_async函数的作用与barrier的意思相同,在进程管理中起到一个栅栏的作用,它 ...

  2. DOTA2参数收集

    -language schinese 显示中文界面(使用英文语音的同学使用) -perfectworld 登陆国服(Steam平台) -novid 不显示启动动画

  3. 入CTF坑必不可少的地方-保持更新

    0x00 前言 没有交易,没有买卖,没有排名,纯属分享:p 0x01 CTF介绍 CTF领域指南CTF介绍大全CTF赛事预告 0x02 CTF练习 BIN:reversingpwnableexploi ...

  4. 微信企业号开发之-如何获取secret 序列号

    最近有项目基于微信企业号开发,简单记录下如何查看企业号secert 工具/原料 微信企业号   方法/步骤  用管理员的帐号登录后,选择[设置]-[权限管理]进入管理组设置界面      在左边点击[ ...

  5. Xtrabackup数据全备份与快速搭建从服务器

    Percona Xtrabackup可以说是一个完美的数据备份工具.特别是当数据库的容量达到了一定数量级的时候且存在单表达到几十G的数据量, 很难容忍一些逻辑备份的漫长时间.如单个数据库约200G,单 ...

  6. 讲讲js中的逻辑与(&&)以及逻辑或(||)

    前几天看到一个函数,百思不得其解,今天早上醒来看了本js的书,正好讲到操作符的用法,给大家分享下js中的&&,||,和我们用的其他的编程语言还是有点区别的. 直接上那个函数的代码: f ...

  7. 一致性算法Paxos详解

    分布式系统除了能提升整个系统的性能外还有一个重要的特性就是提高系统的可靠性,可靠性指的是当分布式系统中一台或N台机器宕掉后都不会导致系统不可用,分布式系统是state machine replicat ...

  8. shell流程控制&函数

    条件 if-then-elif-then-fi if的条件部分经常使用test EXPRESSION或[ EXPRESSION ]实现,test的用法可以参见test if 条件1 #if 条件1;t ...

  9. Android学习笔记之AndroidManifest.xml文件解析(转)

    //自已备注: <?xml version="1.0" encoding="utf-8"?>//说明了版本号,字符集 <manifest xm ...

  10. 清除MAC OS X上的流氓软件 - advance mac cleaner

    自3721开天辟地以来,流氓软件从来就没有消停过,连MAC OS X都难逃流氓软件的骚扰. 近日,因为从SourceForge上下载了一个软件安装包,结果中招了——莫名其妙被安装了advance ma ...