转载请注明出处:  http://blog.csdn.net/forwardyzk/article/details/46819925

在工作中,有一个这种需求,须要用到WebView与javascript进行交互,以下我们就通过一个简单的需求来介绍.

先看一下效果图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

需求:

1.点击一个button进入一个载入WebView的界面,假设此界面须要分享此界面到其它平台,那么就在当前界面展示"分享"button,假设不须要分享,那么就不展示"分享"button.

2.在H5界面上,有一个登陆button,点击登陆,

2.1 假设没有登陆,则调起登陆界面,登陆成功后,在H5界面展示登陆者.

2.2 假设登陆了,就在H5界面直接显示当前的登陆者.

1.使webview支持js的调用.

webview.addJavascriptInterface(new JsHost(JsActivity.this, mHandler, webview), "jsObject");

当中JsHost是自己定义的一个类, jsObject是H5页面调用clientjs方法的对象(名字也是自己定义的,仅仅要和H5javascriprt用的对象名字一样就可以).

2.分享需求.

当H5页面载入完成后,H5页面调用client是否分享的方法(通过此方法讲是否分享和分享的内容传递给client),然后控制分享button是否展示

H5页面javascrip方法:

window.onload = function share() {
//分享
var json = "{'isShare':0,'shareContent':'我是分享内容'}";
//不分享
var noShare = "{'isShare':-1}";
window.jsObject.toShare(json);
}

这是H5调用client的javascript方法

window:代表当前页面的对象

window.onload表示当前的H5页面载入完成后,调用后面的方法

json:表示须要分享的json字符串

noshare:表示不分享额json字符串

jsObject:是client定义的javascript对象

toShare(json):client的javascript方法,这样在client就能够收到json字符串.(这里传的是须要分享的json字符串)

在client的JsHost中定义javascript的分享方法

 /**
* 分享的方法
*
* @param json
*/
@JavascriptInterface
public void toShare(String json) {
Log.d(TAG, "web:" + json); try {
JSONObject jsonObject = new JSONObject(json);
int isShare = jsonObject.optInt("isShare");
if (isShare == 0) {//表示须要分享
mHandler.sendEmptyMessage(0);
} else if (isShare == -1) { //表示不须要分享
mHandler.sendEmptyMessage(1);
}
} catch (JSONException e) {
Log.d(TAG, "解析异常");
}
}

首先要添加标识javascript的注解,@JavascriptInerface

解析传递过来的json字符串,通过Handler对象发送消息来控制分享button是否展示

在JsActivity方法中定义了mHandler,通过WebView的设置addJavascriprtInterface方法传递给了JsHost类中

JsActivty相应的不局文件:

activity_js.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"> <Button
android:id="@+id/btn_share"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="分享" /> <WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/btn_share"></WebView>
</RelativeLayout>
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 0) {//显示分享
btnShare.setVisibility(View.VISIBLE);//显示分享button
} else if (msg.what == 1) {//隐藏分享button
btnShare.setVisibility(View.GONE);//隐藏分享button
} else if (msg.what == 2) {//调用登录
Intent intent = new Intent(JsActivity.this, LoginActivity.class);
startActivityForResult(intent, JsActivity.RESULT_OK);
}
super.handleMessage(msg);
}
};

3.登陆需求

3.1点击登陆,假设没有登陆,弹起登陆界面

先看H5页面点击登陆,调用client的js方法

<input id="loginName" type="button" onclick="isLogin()" value="登录">
function isLogin() {
var name = window.jsObject.requestToken();
document.getElementById("loginName").value = name;
}

点击"登录",调用了javascript中的isLogin()方法,在isLogin方法中调用client的requestToken()方法.此requestToken()有返回值,返回值是当前登陆者的名字.

client的requestToken方法

    /**
* 请求登陆者
*
* @return
*/
@JavascriptInterface
public String requestToken() {
if (TextUtils.isEmpty(App.getName())) {
mHandler.sendEmptyMessage(2);
}
Log.d(TAG, "登陆者名字" + "name=" + App.getName());
return TextUtils.isEmpty(App.getName()) ? "未登录" : App.getName();
}

当中App操作登陆者的信息,有写入登陆者信息和读取登陆者信息

假设App.getName()获取登陆者的名字,假设为空,则通过mHandelr方法调起登录界面的通知.同一时候将当前登陆者返回给H5页面.

Intent intent = new Intent(JsActivity.this, LoginActivity.class);
startActivityForResult(intent, JsActivity.RESULT_OK);

通过startActivityForResult方法开启登陆页面

startActivityForResult的用法请參考:点击

看一下登陆页面:

activity_login.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="10dp"
android:orientation="vertical"> <RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/name_des"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="name:" /> <EditText
android:id="@+id/edit_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/name_des" />
</RelativeLayout> <RelativeLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginTop="20dp"
android:gravity="center_vertical"
android:orientation="horizontal"> <TextView
android:id="@+id/pass_des"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="pass:" /> <EditText
android:id="@+id/edit_pass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/pass_des" />
</RelativeLayout> <Button
android:id="@+id/btn_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="Login" />
</LinearLayout>

当点击了loginbutton,运行登陆操作

private void login() {
String name = editName.getText().toString().trim();
String pass = editPass.getText().toString().trim();
if (TextUtils.isEmpty(name)) {
Toast.makeText(getApplicationContext(), "name is empty", Toast.LENGTH_SHORT).show();
return;
} else if (TextUtils.isEmpty(pass)) {
Toast.makeText(getApplicationContext(), "pass is empty", Toast.LENGTH_SHORT).show();
return;
} else {
App.writeLoginInfo(name, pass);
setResult(JsActivity.RESULT_OK);
finish();
}
}

登陆成功后,把name和pass存到了App中

public class App extends Application {
private static SharedPreferences sharedPreferences; @Override
public void onCreate() {
super.onCreate();
sharedPreferences = getApplicationContext().getSharedPreferences("login", Context.MODE_PRIVATE);
} public static void writeLoginInfo(String name, String pass) {
sharedPreferences.edit().putString("name", name).putString("pass", pass).commit();
} public static String getName() {
return sharedPreferences.getString("name", "");
}
}

同一时候在JsActivity中的onActivityResult方法中获取到通知,然后调用H5页面的loginSuccess方法,传递给H5client的登录者

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RESULT_OK) { String name = App.getName();
name = TextUtils.isEmpty(name) ? "未登录" : name;
Log.d(TAG, "onActivityResult:" + "name=" + name);
//调用H5的javascript中的loginSuccess方法
webview.loadUrl("javascript:loginSuccess('" + name + "')"); } }

webview.loadUrl("javascript:loginSuccess('"+name+"')");

这是client调用H5中的javascript的方法.

function loginSuccess(name) {
document.getElementById("loginName").value = name;
}

讲name赋给id为loginName控件的value属性.

loginSuccess:是H5中的javascript方法

name:是方法參数

总结:

使用webview的addJavascriprtInterface(操作的对象,"javascript对象名称");

H5调用client方法:

无返回值: window.javascript对象.clientjs方法;

有返回值: var  value=window.javascript对象.clientjs方法;

client调用H5的方法:

webview.loadUrl("javascript:方法名称(參数)");

webview.loadUrl("javascript:方法名称()");

到此WebView与javascript方法互相调用已经解说完成,希望对大家有帮助,有不足之处往大家指出.

源代码下载: server和client的源代码

WebView与JavaScript交互--Android的更多相关文章

  1. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

  2. Android总结之WebView与Javascript交互[转]

    Android总结之WebView与Javascript交互   前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.We ...

  3. Android Webview 和Javascript交互,实现Android和JavaScript相互调用

    在Android的开发过程中.遇到一个新需求.那就是让Java代码和Javascript代码进行交互.在IOS中实现起来很麻烦.而在Android中相对来说容易多了.Android对这种交互进行了很好 ...

  4. Android WebView与JavaScript交互操作(Demo)

    应用场景: 为了使Android移动项目能够在较短的时间内完成开发,同时降低技术人员开发的成本投入,往往会采用Hybrid APP的开发模式.相关Hybrid APP(混合型应用)参看:http:// ...

  5. WebView之javascript与android交互基础加强

    一.什么是js与android交互? 通俗一点就是使用js代码调用java代码,或者使用java代码调用js代码. 二.为什么要使用js与java代码交互? 1.可以做一些js网页做本身处理不了的事情 ...

  6. Android WebView与JavaScript交互实现Web App

    当我们去开发一个基于web的android app时,我们第一须要处理的就是与JavaScript的交互问题.Android须要做的事情就是开放某些特定的接口供web里的JavaScript调用,能够 ...

  7. Android WebView和JavaScript交互

    JavaScript在现在的网页设计中用得很多,Android 的WebView可以载入网页,WebView也设计了与JavaScript通信的桥梁.这篇主要介绍一下WebViewk控件如何和Java ...

  8. 重新想象 Windows 8.1 Store Apps (80) - 控件增强: WebView 之基本应用, POST 数据, 与 JavaScript 交互

    [源码下载] 重新想象 Windows 8.1 Store Apps (80) - 控件增强: WebView 之基本应用, POST 数据, 与 JavaScript 交互 作者:webabcd 介 ...

  9. Android WebView 总结 —— Java和JavaScript交互

    交互如何实现 实现Java和js交互十分便捷.通常只需要以下几步. WebView开启JavaScript脚本执行 WebView设置供JavaScript调用的交互接口. 客户端和网页端编写调用对方 ...

随机推荐

  1. 关于使用 autoFac 的注入方法

    1.使用 NUGET 安装 Autofac 2.需要引用Autofac ASP.NET MVC 5 Integration  这个扩展包. 但有时候在NuGet中找不到 该包 需要使用“程序要控制器控 ...

  2. APP上线被APPStore拒绝的各种原因

    1.程序有重大bug,程序不能启动,或者中途退出.2.绕过苹果的付费渠道,我们之前游戏里的用兑换码兑换金币.3.游戏里有实物奖励的话,一定要说清楚,奖励由本公司负责,和苹果没有关系.4.用到苹果的标志 ...

  3. Farseer.net轻量级开源框架 中级篇:执行SQL语句

    导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 中级篇: 事务的使用 下一篇:Farseer.net轻量级开源框架 中级篇: DbFacto ...

  4. angular 琐碎

    1.controller 只要在一个地方引用就可以了,路由的时候不用指定controller了,在HTML中指定就可以了,否则会初始化两次 2.angular 模块间的服务无层级关系,相互可见.本质是 ...

  5. 8月中旬之后的学习计划 --- react

    这段时间快活了,放纵了,玩hi了,接下来该好好的学习新知识了. 鉴于目前业界比较火的前端js框架有react.vue,决定先从react开始学习.之前有简单的接触过它的一些基本的语法知识,这次准备全面 ...

  6. ubuntu 16.04 添加网卡

    root@ubuntu:~# ls /sys/class/net/ enp0s3 enp0s8 lo root@ubuntu:~# vim /etc/network/interfaces # This ...

  7. ZOJ - 3981 - Balloon Robot (思维)

    参考自:https://blog.csdn.net/qq_36553623/article/details/78445558 题意: 第一行三个数字n, m, q表示有m个座位围成一个环,n个队伍,q ...

  8. 39页第3题 求x的n次幂

    /*计算x的n次幂*/ #include<stdio.h> main(void) { int i,n; double x,y; printf("Enter x:");/ ...

  9. AWK简单使用方法

    1. 命令格式 gawk [OPTIONS] 'program' FILES.... program:'PATTERN{ACTION}' 一条awk命令中,PATTERN和ACTION,至少存在一个才 ...

  10. buf.readIntBE()

    buf.readIntBE(offset, byteLength[, noAssert]) buf.readIntLE(offset, byteLength[, noAssert]) offset { ...