** 在Android开发中,越来越多的商业项目使用了Android原生控件与WebView进行混合开发,当然不仅仅就是显示一个WebView那么简单,有时候还需要本地Java代码与HTML中的JavaScript进行交互,Android也对交互做了很好的封装,所以很容易实现例如:点击网页中的按钮Android调用原生对话框,点击网页中的电话号码调用Android拨号APP。这篇给大家介绍下如何实现Android与HTML+JS的交互。

本篇的主要功能点:
1、webView如何加载H5页面
2、Android如何调用H5中的方法
3、H5如何调用Android中的方法

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

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

图1:加载本地assets里的test.html文件截图
2、Android如何调用H5中的方法**
想要调用js方法那么就必须让webView支持

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

**
如何调用?
Android调用H5中的方法,其实很简单,直接调用就可以了,不需要额外的操作。
①调用H5中无参无返回值的方法***
直接可以调用mWebView.loadUrl("JavaScript:show()");图2为H5中show()方法。*

**mWebView.loadUrl("JavaScript:show()");**
 
 

图2:android 调用H5中无参数无返回值的方法,截图为H5中的方法

**
②调用H5中带返回值的方法***
可以调用mWebView.evaluateJavascript()方法,该方法只在安卓4.4以上版本适用,图3为Android调用H5中带返回值的方法。

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

图3:安卓调用H5中带返回值的方法

**
③调用H5中带参数的方法***
当调用H5中带参数的方法时,势必要传入一个字符串,当传入固定字符串时,用单引号括起来即可;当传入变量名时,需要用到转义符(这里我也是花费半个小时才搞懂的,嘿嘿)。两种情况代码,分别在下面贴出,应用截图如图4。

mWebView.loadUrl("javascript:alertMessage('哈哈')");
*String  content="9880";*
mWebView.loadUrl( "javascript:alertMessage(\" " +content+ "\")" );
 
 

图4:Android调用H5中带参数的方法

3、H5如何调用android中的方法
*** *H5调用Android里的方法,相对复杂一些,双方具体操作如下:

*** Android需要做什么呢?????***
说白了就是新建一个类,里面写提供给H5操作的方法,并规定别名。这里我新建的class为JsInteration,方法为back(),规定的别名为android。先贴截图,后贴代码。*

 
 

图4:H5调用Android里的方法,Android需要的操作


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

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

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

mWebView.addJavascriptInterface(newJsInteration(),"android");

在H5中怎么来调用呢?
调用格式为 window.别名.android中的方法名(parameter Values) ,此示例中我们用的别名为android,方法名为back()。先截图,后贴代码。

 
 

图4:H5调用Android里的方法,Android需要的操作
**
H5代码如下:***

*function s() {*
var result=window.android.back();
document.getElementById("p").innerHTML=result;
}

以上就是Android调用H5方法以及H5调用Android方法的实现交互方式中的一种。下面给出完整代码:
**
MainActivity代码:***

package com.e_valmont.javaandjsinteractivedemo;

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast; public class MainActivity extends AppCompatActivity{ private static final String TAG = "MainActivity";
private WebView mWebView; @SuppressLint("JavascriptInterface")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); mWebView = (WebView) findViewById(R.id.webview);
mWebView.loadUrl("file:///android_asset/js_java_interaction.html");//加载本地asset下面的js_java_interaction.html文件
//mWebView.loadUrl("https://www.baidu.com/");//加载本地assets下面的js_java_interaction.html文件 WebSettings webSettings = mWebView.getSettings();
webSettings.setJavaScriptEnabled(true);//打开js支持
/**
* 打开js接口給H5调用,参数1为本地类名,参数2为别名;h5用window.别名.类名里的方法名才能调用方法里面的内容,例如:window.android.back();
* */
mWebView.addJavascriptInterface(new JsInteration(), "android");
mWebView.setWebViewClient(new WebViewClient());
mWebView.setWebChromeClient(new WebChromeClient());
} /**
* 自己写一个类,里面是提供给H5访问的方法
* */
public class JsInteration { @JavascriptInterface//一定要写,不然H5调不到这个方法
public String back() {
return "我是java里的方法返回值";
}
} //点击按钮,访问H5里带返回值的方法
@TargetApi(Build.VERSION_CODES.KITKAT)
public void onClick(View v) {
Log.e("TAG", "onClick: "); // mWebView.loadUrl("JavaScript:show()");//直接访问H5里不带返回值的方法,show()为H5里的方法 //传固定字符串可以直接用单引号括起来
mWebView.loadUrl("javascript:alertMessage('哈哈')");//访问H5里带参数的方法,alertMessage(message)为H5里的方法 //当出入变量名时,需要用转义符隔开
String content="9880";
mWebView.loadUrl("javascript:alertMessage(\"" +content+ "\")" ); //Android调用有返回值js方法,安卓4.4以上才能用这个方法
mWebView.evaluateJavascript("sum(1,2)", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
Log.d(TAG, "js返回的结果为=" + value);
Toast.makeText(MainActivity.this,"js返回的结果为=" + value,Toast.LENGTH_LONG).show();
}
});
}
}

activiy_main.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <WebView
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="9"
/> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="点击调用js中的方法"/> </LinearLayout>

js_java_interaction.html代码:

<html>
<head>
<!--从assert中加载的中文网页会出现乱码,解决办法就是给html指定编码-->
<meta http-equiv="content-type" content="text/html;charset=gb2312">
<title>
</title> </head>
<body>
这是html页面 <br/>
<button onclick="s()">点击调用本地方法</button>
<a href="file:///android_asset/js_java_interaction.html">点击跳转到原生页面</a>
<p id="p"></p> <script type="text/javascript"> //有参有返回值的方法
function sum(a,b) {
<!--gygguuuiu-->
return a+b;
} //有参无返回值的方法
function alertMessage(message) {
alert(message);
} //无参无返回值的方法
function show(){
//显示hello world
document.getElementById("p").innerHTML="hello world";
} function s() {
//调用原生的方法,android为约定的别名;back()为原生的方法
var result=window.android.back();
//将返回结果显示在id为p的控件上
document.getElementById("p").innerHTML=result;
}
</script>
</body>
</html>

**
注意事项:***
1、当自己写html文件时,可能会出现显示乱码,我们需要指定格式

 
截图为Html显示乱码,需要执行的操作

2、当H5调用我们的方法时,我们需要把规定的别名传给H5(切记一定不能错),而且我们要在自己的方法里执行H5想要的操作。

 
截图中的别名是需要我们传给H5的

3、给H5调用的方法一定要加@JavascriptInterface,不然H5调不到我们的方法

 
@JavascriptInterface一定要加

4、 调用js有参数有返回值的函数时,只有安卓4.4以上才能用webView.evaluateJavascript方法直接拿到返回值;当版本低于4.4的时候,常用的思路是 java调用js方法,js方法执行完毕,再次调用java代码将值返回。

①.Java调用js代码

String call = "javascript:sumToJava(1,2)";
webView.loadUrl(call);

②.js函数处理,并将结果通过调用java方法返回

function sumToJava(number1, number2){
window.control.onSumResult(number1 + number2)
}

③.Java在回调方法中获取js函数返回值

@JavascriptInterface
public void onSumResult(int result) {
Log.i(LOGTAG, "onSumResult result=" + result);
}

5、加载本地assets里的H5界面,要写成android_asset,而不是assets,不然加载不到

 
注意格式

参考文章:Android和H5之间的交互

作者:码客_Yang
链接:https://www.jianshu.com/p/0b986d6e2e17
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

安卓混合开发——原生Java和H5交互,保证你一看就懂!的更多相关文章

  1. [Hybrid App]--Android混合开发,Android、Js的交互

    AndroidJs通信 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !imp ...

  2. iOS原生APP和H5交互-delegate和第三方

    一.原生代码中直接加载页面(拦截) 1.    具体案例 加载本地/网络HTML5作为功能介绍页 2.    代码示例 //本地 -(void)loadLocalPage:(UIWebView*)we ...

  3. 教你判断一个APP页面是原生的还是H5页面 。(还没看)

    来源:https://www.25xt.com/appdesign/11851.html 刚好是周末,无意之间学堂君在收集相关资料的时候,发现有部分童鞋在问<如何判断一个APP页面是不是H5页面 ...

  4. h5课件是什么?h5(html5)怎样实现交互动画开发?-----浅谈h5交互动画课件的优势

    目前很多交互课件,尤其幼儿类的交互课件以动画和交互相结合的类型居多,越来越多的教育机构发现了这种课件对于幼儿的吸引力远大于其他类型的课件,随着flash逐渐被市场淘汰,动画和交互相结合的html5跨平 ...

  5. 图解安卓-c++开发-通过java 调用c++ jni的使用

    接着上一节 ,很多事情用java做,效率要差一点(尤其是游戏),所以要用c++来实现,那么java如何调用c++ 首先建议一个工程 HelloJni如下图: 按照默认的配置下一步,直到完成 . 如下图 ...

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

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

  7. 基于H5的混合开发介绍(一)WebView

    转自: https://www.cnblogs.com/sanchang/p/9261461.html 一 WebView到底是什么    1 WebView是一种控件,它基于webkit引擎,因此具 ...

  8. iOS原生APP与H5+JS交互////////////////////zzzz

    原生代码中直接加载页面 1.    具体案例 加载本地/网络HTML5作为功能介绍页 2.    代码示例 //本地 -(void)loadLocalPage:(UIWebView*)webView ...

  9. iOS原生App与H5页面交互笔记

    文/MikeZhangpy(简书作者)原文链接:http://www.jianshu.com/p/4ed3e5ed99c6著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 最近在做一个项 ...

随机推荐

  1. 11、springboot之包扫描

    如上图,将Application启动类放入hello.aaa文件夹下面 启动springboot,访问http://localhost:9999/testJson,报404错误,在启动类上面加上@Co ...

  2. CODEFORCES 429B 动态规划

    http://codeforces.com/problemset/problem/429/B 可以参考这篇文章: http://blog.csdn.net/pure_lady/article/deta ...

  3. luogu P3065 first——trie树相关

    题目描述 Bessie has been playing with strings again. She found that by changing the order of the alphabe ...

  4. cf1060C. Maximum Subrectangle(思维 枚举)

    题意 题目链接 Sol 好好读题 => 送分题 不好好读题 => 送命题 开始想了\(30\)min数据结构发现根本不会做,重新读了一遍题发现是个傻逼题... \(C_{i, j} = a ...

  5. 关于构造器和Serlvet的知识点

    关于java的构造器方法: 1.java构造方法可以有任何的访问修饰符:public.protected.private或者没有修饰(通常被package或者friendly调用)但是不能有非访问性质 ...

  6. 测试canvas绘制旋转文字的性能

    canvas 绘制各种动画效果时,我们经常会使用画布旋转,使绘制上去的元素有旋转的效果. 最近在项目中碰到了很严重的性能问题,经常排查发现是因为绘制批量文字时使用了画布旋转,且每行文字的旋转角度是不一 ...

  7. Python爬虫框架Scrapy教程(1)—入门

    最近实验室的项目中有一个需求是这样的,需要爬取若干个(数目不小)网站发布的文章元数据(标题.时间.正文等).问题是这些网站都很老旧和小众,当然也不可能遵守 Microdata 这类标准.这时候所有网页 ...

  8. ViewDragHelper详解(侧滑栏)

    1.Drag拖拽:ViewDrag拖拽视图,拖拽控件:ViewDragHelper拖拽视图助手,拖拽操作类.利用ViewDragHelper类可以实现很多绚丽的效果,比如:拖拽删除,拖拽排序,侧滑栏等 ...

  9. Css3中拖拽效果的实例(带有注释~欢迎指教)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. 为什么说对象字面量赋值比new Object()高效?

    http://www.cnblogs.com/mushishi/p/5811743.html