hybrid.js_js交互是什么意思

hybrid.js_js交互是什么意思HybridApp(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“NativeApp良好交互体验的优势”和“WebApp跨平台开发的优势”。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Hybrid开发—WebView与js交互实现

一、 引言

Hybrid App(混合模式移动应用)是指介于web-app、native-app这两者之间的app,兼具“Native App良好交互体验的优势”和“Web App跨平台开发的优势”。

当前Hybrid技术也分了几个门派,其中主流的两派——

  • 一派是采用ReactNative或者weex之类的框架来实现,通俗点说就是程序员用js写代码,然后框架负责把js代码翻译成原生代码,最后呈现出原生页面;
  • 另外一派是采用WebView组件,程序员写的是纯粹的h5代码,最后也是通过原生端的WebView组件来加载渲染,和WebApp的区别就是,WebApp整个app是一个web容器,各种页面跳转包括效果实现都是在这个容器中通过H5技术实现。
    而Hybrid-WebView的实现方案中,每个页面都是一个独立的WebView容器,页面之间的跳转,一些特殊效果,特殊组件的实现,都是通过H5发消息来调取原生功能实现的。

二、WebView与js交互

一、WebView

WebView组件是Android提供用于显示网页信息,它内置了WebKit引擎,WebKit是一个开源的浏览器引擎,Chrome浏览器也是基于它,所以我们可以把WebView当做一个轻量级的浏览器使用。如果对WebView的使用以及方法不是很了解,可以看Android:这是一份全面 & 详细的Webview使用攻略这篇文章,这里面讲解了WebView 的基本使用。

二、交互小Demo

下面我们进入正题,WebView 是如何与JS 进行交互的。请看下面这个图片:
在这里插入图片描述
蓝色的部分是WebView控件,加载的是本地的一个HTML 网页。黄色的是app 本身的布局,在输入框中输入数据然后点击发送,就能把数据发送给Js进行处理,在网页中点击发送按钮,也同样的能把网页中输入框内的数据发送给app 本身并显示出来,这个小Demo 就简单的实现了WebView与js 整个的交互过程。下面看整个交互过程图:
在这里插入图片描述
OK ,下面我们来实现这个小Demo。

三、具体实现

1、首先是界面xml 布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.sxl.webviewdemo.MainActivity">

    <!--显示网页区域-->
    <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="300dp" />

    <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#F8DC26">

        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这里是Native" android:textSize="20sp" />

        <TextView android:id="@+id/tv_Data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="20dp" android:text="从HTML返回的数据" android:textSize="20sp" />

        <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="20dp" android:orientation="horizontal">

            <EditText android:id="@+id/edtTxt_Data" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="20dp" android:layout_weight="1" android:gravity="center" android:hint="输入的数据将在HTML中显示" />

            <Button android:id="@+id/btn_Send" android:layout_width="60dp" android:layout_height="wrap_content" android:layout_gravity="center_vertical" android:layout_marginRight="20dp" android:text="发送" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

2、初始化webView控件

				mWebview = (WebView) findViewById(R.id.webView);

        // 获取mWebSettings 对WebView进行配置和管理
        mWebSettings = mWebview.getSettings();

        // 允许webview 加载js代码
        mWebSettings.setJavaScriptEnabled(true);
        // 加载本地html 
        mWebview.loadUrl("file:///android_asset/WebViewDemo.html");

        //设置不用系统浏览器打开,直接显示在当前Webview
        mWebview.setWebViewClient(new WebViewClient() { 
   
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) { 
   
                view.loadUrl(url);
                return true;
            }
        });

        //设置WebChromeClient类
        mWebview.setWebChromeClient(new WebChromeClient() { 
   
            //获取网站标题
            @Override
            public void onReceivedTitle(WebView view, String title) { 
   
                getSupportActionBar().setTitle(title);
            }
        });

3、创建WebViewDemo.html文件

创建WebViewDemo.html文件,并将这个HTML文件放入到main 文件夹下的assets 文件夹内,如果没人assets 这个文件吗,则创建。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>WebView小Demo</title>
    <style type="text/css"> body{ 
     background: #61aaff; } </style>
</head>
<body>
<h2>这里是HTML网页</h2>
<div><span>要输入的数据:</span><input type="text" id="input"></div><br>
<button id="button">发送给Android</button>
</body>
</html>

4、Android通过WebView的 loadUrl方法调用 JS 代码

首先在WebViewDemo.html 创建 js 方法

<script type="text/javascript">
    var data=document.getElementById("input");
    // 定义js 方法,会被 Android 调用
    var send=function(str) { 
   
        data.value=str;
    }
</script>

在Android中调用js 方法

				btnSend.setOnClickListener(new View.OnClickListener() { 
   
            @Override
            public void onClick(View v) { 
   
                String str = edtTxtData.getText().toString();
              	// 调用js 中的send 方法并传参
                mWebview.loadUrl("javascript:if(window.send){window.send('" + str + "')}");
            }
        });

5、JS通过WebView 的addJavascriptInterface 方法调用 Android 代码(4.2及以上的系统才能使用)

首先定义一个 JSInterface.java 接口文件,定义 setVaule 方法。

public interface JSInterface { 
   

    void setVaule(String vaule);
}

然后 JStoAndroid 类中实现这个方法。

public class JStoAndroid { 
   

    private JSInterface jsInterface;

    public JStoAndroid(JSInterface jsInterface){ 
   
        this.jsInterface=jsInterface;
    }

    /** * 定义JS需要调用的方法 * 被JS调用的方法必须加入@JavascriptInterface注解 * 这种方式只能在Android 4.2及以上的系统才能使用 */
    @JavascriptInterface
    public void setValue(String vaule) { 
   
        jsInterface.setVaule(vaule);
    }
}

下面在主界面中 加载 js 接口:

				// 给webView 加载js 接口
        mWebview.addJavascriptInterface(new JStoAndroid(new JSInterface() { 
   
            @Override
            public void setVaule(final String vaule) { 
   
                // 将在js 接口中获取到的数据 通过handler 传到主线程更新界面
                handler.post(new Runnable() { 
   
                    @Override
                    public void run() { 
   
                        tvData.setText(vaule);
                    }
                });
            }
        }), "sendData");   // "sendData" 对应 js中 调用的方法名

最后添加 html 中按钮点击的 js 方法。

<script type="text/javascript">
    var btn=document.getElementById("button");
    var data=document.getElementById("input");
    // 调用Android 中的方法
    btn.addEventListener("click",function () { 
   
        var str=data.value;
        // 判断 Android 加载js 接口的时候有没有定义的sendData 方法
        if( window.sendData ){ 
   
            sendData.setValue(str);
        }else{ 
   
            alert("Android 中没有对应的方法");
        }
    });
</script>

总结:

对于Android调用JS代码的方法有2种:

  1. 通过WebView的loadUrl()
  2. 通过WebView的evaluateJavascript()

对于JS调用Android代码的方法有3种:

  1. 通过WebView的addJavascriptInterface()进行对象映射
  2. 通过 WebViewClient 的shouldOverrideUrlLoading ()方法回调拦截 url
  3. 通过 WebChromeClient 的onJsAlert()、onJsConfirm()、onJsPrompt()方法回调拦截JS对话框alert()、confirm()、prompt() 消息

以上就是对Android与js 直接交互实现的小Demo 的讲解,具体代码已经上传到github,点击 WebViewDemo 即可查看。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190596.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 字典树(前缀树)_字典树java实现

    字典树(前缀树)_字典树java实现什么是字典树?叫前缀树更容易理解字典树的样子Trie又被称为前缀树、字典树,所以当然是一棵树。上面这棵Trie树包含的字符串集合是{in,inn,int,tea,ten,to}。每个节点的编号是我们为了描述方便加上去的。树中的每一条边上都标识有一个字符。这些字符可以是任意一个字符集中的字符。比如对于都是小写字母的字符串,字符集就是’a’-‘z’;对于都是数字的字符串,字…

    2022年9月7日
  • pytest指定用例_pytest如何循环执行用例

    pytest指定用例_pytest如何循环执行用例前言测试用例在设计的时候,我们一般要求不要有先后顺序,用例是可以打乱了执行的,这样才能达到测试的效果.有些同学在写用例的时候,用例写了先后顺序,有先后顺序后,后面还会有新的问题(如:上个用例返回

    2022年7月30日
  • redis集群搭建(非常详细,适合新手)_redis哨兵模式两主多从

    redis集群搭建(非常详细,适合新手)_redis哨兵模式两主多从前言由于项目需要,搭建了一个Redis服务器集群,实现了主从配置和容灾部署,使得主机出现故障时,可自动进行容灾切换,下面就详细讲解一下如何利用Redis来实现。文章重点1、Redis入门简介2、Redis安装部署3、Redis集群整体架构4、Redis主从配置及数据同步5、Redis哨兵模式搭建一、Redis入门简介Redis(RemoteDictiona…

    2022年9月1日
  • SQL中的聚合函数介绍

    SQL中的聚合函数介绍  什么是聚合函数(aggregatefunction)?聚合函数对一组值执行计算并返回单一的值。 聚合函数有什么特点?除了COUNT以外,聚合函数忽略空值。 聚合函数经常与SELECT语句的GROUPBY子句一同使用。 所有聚合函数都具有确定性。任何时候用一组给定的输入值调用它们时,都返回相同的值。 标量函数:只能对单个的数字或值进行计算。主…

    2022年6月21日
  • PHP7数组的底层实现

    PHP7数组的底层实现

    2022年2月11日
  • 《关于VirtualBox在桥接模式下无法联网 解决方案》

    《关于VirtualBox在桥接模式下无法联网 解决方案》博主遇到了这个问题,百度了大半天还是没有解决到,可能是由于下面链接的文章的标题关键词比较偏,很难精确的定位到此文章,于是博主就决定总结归纳了一下,希望对大家有所帮助。。经过无数次的百度,早已厌倦粘贴党,问牛答马党,错误党,大大的浪费了大家的时间,于是博主开了这篇文章..我们在VBOX上面安装了Linux之后,VBOX默认网络设置是使用NAT模式的,这种方式宿

    2022年5月8日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号