Android和H5之间的交互

hybrid App开发也不是什么新鲜事了,其中native和h5之间的交互则是必不可少的。Android中是如何和H5交互的?
1、webView加载页面

我们都知道在Android中是通过webView来加载html页面的,根据HTML文件所在的位置不同写法也不同:

//例如:加载assets文件夹下的test.html页面mWebView.loadUrl("file:///android_asset/test.html")//例如:加载网页mWebView.loadUrl("http://www.baidu.com")

如果只是这样调用mWebView.loadUrl()加载的话,那么当你点击页面中的链接时,页面将会在你手机默认的浏览器上打开。那如果想要页面在App内中打开的话,那么就得设置setWebViewClient:

mWebView.setWebViewClient(new WebViewClient() {        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {                mWebView.loadUrl(url);                return true;            }        }    });
2、Android本地通过Java调用HTML页面中的JavaScript方法

想要调用js方法那么就必须让webView支持

    WebSettings webSettings = mWebView.getSettings();    //设置为可调用js方法    webSettings.setJavaScriptEnabled(true);

若调用的js方法没有返回值,则直接可以调用mWebView.loadUrl("javascript:do()");其中do是js中的方法;若有返回值时我们可以调用mWebView.evaluateJavascript()方法:

 mWebView.evaluateJavascript("sum(1,2)", new ValueCallback() {        @Override        public void onReceiveValue(String value) {            Log.e(TAG, "onReceiveValue value=" + value);        }    });

js代码如下:

<script type="text/javascript">    function sum(a,b){    return a+b;    }    function do(){    document.getElementById("p").innerHTML="hello world";    }script>
2、js调用Android本地Java方法

在Android4.2以上可以直接使用@JavascriptInterface注解来声明,下面是在一个本地Java方法

 public class JsInteration {    @JavascriptInterface    public String back() {        return "hello world";    }}

定义完这个方法后再调用mWebView.addJavascriptInterface()方法:

 mWebView.addJavascriptInterface(new JsInteration(), "android");

那么在js中怎么来调用呢?

<script type="text/javascript">     function s(){     //调用Java的back()方法    var result =window.android.back();    document.getElementById("p").innerHTML=result;    }script>
4、拦截HTML页面中的点击事件
mWebView.setWebViewClient(new WebViewClient() {        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            //判断url拦截事件            if (url.equals("file:///android_asset/test2.html")) {                Log.e(TAG, "shouldOverrideUrlLoading: " + url);                startActivity(new Intent(MainActivity.this,Main2Activity.class));                return true;            } else {                mWebView.loadUrl(url);                return false;            }        }    });
以上就是Java调用js方法以及js调用Java方法的实现交互方式中的一种。下面给出完整代码:
mainActivity
public class MainActivity extends AppCompatActivity {public static final String TAG = "MainActivity";private WebView mWebView;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    mWebView = (WebView) findViewById(R.id.webView);    mWebView.loadUrl("file:///android_asset/test.html");    WebSettings webSettings = mWebView.getSettings();    webSettings.setJavaScriptEnabled(true);    mWebView.addJavascriptInterface(new JsInteration(), "android");    mWebView.setWebViewClient(new WebViewClient() {        @Override        public boolean shouldOverrideUrlLoading(WebView view, String url) {            if (url.equals("file:///android_asset/test2.html")) {                Log.e(TAG, "shouldOverrideUrlLoading: " + url);                startActivity(new Intent(MainActivity.this,Main2Activity.class));                return true;            } else {                mWebView.loadUrl(url);                return false;            }        }    });}//Android调用有返回值js方法@TargetApi(Build.VERSION_CODES.KITKAT)public void onClick(View v) {    mWebView.evaluateJavascript("sum(1,2)", new ValueCallback() {        @Override        public void onReceiveValue(String value) {            Log.e(TAG, "onReceiveValue value=" + value);        }    });}public class JsInteration {    @JavascriptInterface    public String back() {        return "hello world";    }}}
test.html
<html><head><title>title><script type="text/javascript">    function sum(a,b){    return a+b;    }     function s(){    var result =window.android.back();    document.getElementById("p").innerHTML=result;    }    script>head><body><button onclick="s()">调用本地方法button><a href="file:///android_asset/test2.html">点击a><p id="p">p>body>html>

更多相关文章

  1. Android不同版本获取当前wifi信息方法
  2. Android 启动页面优化 (白屏 、等待的问题)
  3. Android动态加载
  4. android动态加载已安装apk中的方法
  5. Android与H5交互,以及WebView加载进度条
  6. Android的SQLite学习及使用方法(1)
  7. FastBoot 刷机方法
  8. android SDK manager 提取慢或者下载慢解决方法

随机推荐

  1. 如何选择正确的因变量(控制变量),让你的计
  2. 儿时环境对其人生长远影响的综述, 包括前
  3. 他们只有本硕学历, 却发过了AER, JPE, QJ
  4. 气候经济学能发Nature,Science的三大热点
  5. nature首次出现经济学编辑!想发nature的学
  6. 什么时候需要标准化回归模型中的变量?
  7. 对数vs线性vs二次vs指数形式,到底选择哪种
  8. 机器学习方法出现在AER, JPE, QJE等顶刊
  9. 万字长文述"家庭经济学"进展, 诺奖得主贝
  10. 过去三十年, RCT, DID, RDD, LE, ML, DSG