热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android开发学习之路Java和Js互相调用

  随着前端的火热,以前开发的快速,越来越多的nativeapp在其中融合了h5,就拿淘宝就是很多的h5组成的,一旦出现什么节日,他都可以不用通过更新app来实现界面的改变,而且a

java

  随着前端的火热,以前开发的快速,越来越多的native app在其中融合了h5,就拿淘宝就是很多的h5组成的,一旦出现什么节日,他都可以不用通过更新app来实现界面的改变,而且android和ios可以基本上共用一套代码。这不微信也出了小应用,感觉前端有慢慢吞噬客户端的趋势,所以得学下前端的一些知识了,要不然就落后了。对于本文就是学习下js和android的交互了。

Java和Js的通用实现

  其实android和js的交互,其实主要就是android的webview和js的交互。android的webview有一个方法:addJavascriptInterface就是和js代码交互的接口。还是分析代码来的实际点吧。

1、java端代码

  新建个工程HelloJavaJs,首先便是实现个界面了。比较简单,就一个webview控件:

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_main"

android:layout_

android:layout_

tools:cOntext="com.jared.hellojavajs.MainActivity">

android:id="@+id/webview"

android:layout_

android:layout_/>

  接着编写MainActivity代码:

private void initWebView() {

WebSettings webSettings = webView.getSettings();

webSettings.setJavascriptEnabled(true);

webView.addJavascriptInterface(new JsInterface(), "control");

webView.setWebChromeClient(new WebChromeClient());

webView.setWebViewClient(new WebViewClient() {

@Override

public void onPageFinished(WebView view, String url) {

super.onPageFinished(view, url);

testControl();

}

});

webView.loadUrl("file:///android_asset/test.html");

}

private void testControl() {

String cOntrol= "Javascript:helloJava()";

cOntrol= "Javascript:helloJavaWithParam(\""+"param1"+"\")";

cOntrol= "Javascript:helloToJava()";

webView.loadUrl(control);

}

public class JsInterface {

@JavascriptInterface

public void helloJs(String message) {

Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show();

//Log.d("MainActivity", "hellojs");

}

}

  这里讲一下几个方法:
  1、setJavascriptEnabled,设置为true,就其名就知道是为了使能js的功能了。
  2、addJavascriptInterface,设置一个js调用webview的一个接口。这里实现的接口是JsInterface类,然后名字是control。其中JsInterface类里面有一个helloJs方法,并且标注了@JavascriptInterface。这样js端代码调用过来就会被知道了。
  3、setWebChromeClient:主要处理解析,渲染网页等浏览器做的事情,这里就用了系统默认的WebChromeClient,WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等,当然这个可以自定义,由于addJavascriptInterface方法是有漏洞的,很多开发者实现了jsbridge,就是自定义了WebChromeClient,然后封装了自己的一套协议,这个之后再分析分析。
  4、setWebViewClient:就是帮助WebView处理各种通知、请求事件的,这里主要就实现了一个onPageFinished方法,主要是当页面加载完了之后再调用到js的代码。

2、js端代码

  既然java端代码分析好了,那么就分析下js的代码了,这新建一个test.html文件,放在assets目录下,以为上面java代码load的路径就是这个html文件,这里简单的实现个:

JavaJs In Android

  代码比较简单,主要就是实现了三个function,helloJava没有传入参数,就弹出一个对话框,helloJavaWithParam从java端传过来message,并弹出对话框。helloToJava会调用java端的helloJs方法,并把I’m come from js!传过去。其中的control我们在addJavascriptInterface的时候已经注册了。

3、效果展示

  基本的代码也已经讲完了,那么就来测试下,看下效果了,这里只实现helloToJava方法,来看下会不会调用java代码弹出土司了,看下效果:

  
  很明显,得到了我们需要的结果,如果一个h5的页面需要实现一个按钮,然后调用java代码,启动另一个activity就可以实现native和h5的混编了,这个就之后才做学习了。
  也许会有疑问,为什么在load完页面后,调用一段代码”Javascript:helloToJava()”,就可以了呢?其实这些都是浏览器的工作,调用完了页面是确保执行了test.html的代码的方法,要不然直接先调用”Javascript:helloToJava()”的话会报错的。

  学习了通用的实现,也就是调用android的原生的代码,那么接着我们来学习下通过自定义WebChromeClient来实现,也就是jsbridge的简单实现,这里可以参考文章:Android JSBridge的原理与实现。关于Jsbridge的实现原理,后续在讲解,也可以下载代码先了解一下。

  
源码参考github


推荐阅读
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • Amoeba 通过优化 MySQL 的读写分离功能显著提升了数据库性能。作为一款基于 MySQL 协议的代理工具,Amoeba 能够高效地处理应用程序的请求,并根据预设的规则将 SQL 请求智能地分配到不同的数据库实例,从而实现负载均衡和高可用性。该方案不仅提高了系统的并发处理能力,还有效减少了主数据库的负担,确保了数据的一致性和可靠性。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 分布式开源任务调度框架 TBSchedule 深度解析与应用实践
    本文深入解析了分布式开源任务调度框架 TBSchedule 的核心原理与应用场景,并通过实际案例详细介绍了其部署与使用方法。首先,从源码下载开始,详细阐述了 TBSchedule 的安装步骤和配置要点。接着,探讨了该框架在大规模分布式环境中的性能优化策略,以及如何通过灵活的任务调度机制提升系统效率。最后,结合具体实例,展示了 TBSchedule 在实际项目中的应用效果,为开发者提供了宝贵的实践经验。 ... [详细]
  • 零拷贝技术是提高I/O性能的重要手段,常用于Java NIO、Netty、Kafka等框架中。本文将详细解析零拷贝技术的原理及其应用。 ... [详细]
  • 检查在所有可能的“?”替换中,给定的二进制字符串中是否出现子字符串“10”带 1 或 0 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • Maven Web项目创建时JSP文件常见错误及解决方案
    Maven Web项目创建时JSP文件常见错误及解决方案 ... [详细]
  • 在序章二中,我们了解到Bingo是一位重度强迫症患者,对细节有着极致的追求。他不仅能在深夜专注编程,还能在假期留校进行项目布局,甚至会在凌晨骑行上山观赏日出,与朋友一同畅游钱塘江。他的性格豪爽大方,乐于与他人分享自己的经验和心得,撰写了一本名为《从零开始》的著作。 ... [详细]
  • 在将旧版库中的 JUnit 包升级到 4.12 版本后,进行测试时发现原本应顺利通过的测试用例却失败了。通过检查报告中的详细信息,我们发现了一些初始化错误。本文将深入分析这些错误的原因,并提供有效的解决方案,以确保测试的稳定性和可靠性。 ... [详细]
author-avatar
xinzhugedonny
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有