Android开发学习之路--Java和Js互相调用
随着前端的火热,以前开发的快速,越来越多的native app在其中融合了h5,就拿淘宝就是很多的h5组成的,一旦出现什么节日,他都可以不用通过更新app来实现界面的改变,而且android和ios可以基本上共用一套代码。这不微信也出了小应用,感觉前端有慢慢吞噬客户端的趋势,所以得学下前端的一些知识了,要不然就落后了。对于本文就是学习下js和android的交互了。
Java和Js的通用实现
其实android和js的交互,其实主要就是android的webview和js的交互。android的webview有一个方法:addJavascriptInterface就是和js代码交互的接口。还是分析代码来的实际点吧。
1、java端代码
新建个工程HelloJavaJs,首先便是实现个界面了。比较简单,就一个webview控件:
<?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:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.jared.hellojavajs.MainActivity">
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
接着编写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文件,这里简单的实现个:
<html>
<script type="text/javascript">
function helloJava() {
alert("I'm come from java");
}
function helloJavaWithParam(message) {
alert(message);
}
function helloToJava() {
window.control.helloJs("I'm come from js!")
}
</script>
JavaJs In Android
</html>
代码比较简单,主要就是实现了三个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的实现原理,后续在讲解,也可以下载代码先了解一下。
Android开发学习之路--Java和Js互相调用的更多相关文章
- Android开发学习之路--Android Studio cmake编译ffmpeg
最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...
- Android开发学习之路--网络编程之xml、json
一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
- Android开发学习之路--Android系统架构初探
环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...
- Android开发学习之路--MAC下Android Studio开发环境搭建
自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- Android开发学习必备的java知识
Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...
- Android开发学习之路--基于vitamio的视频播放器(二)
终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...
- Android开发学习之路--数据持久化之初体验
上班第一天,虽然工作上处于酱油模式,但是学习上依旧不能拉下,接着学习android开发吧,这里学习数据持久化的 知识. 其实数据持久化就是数据可以保存起来,一般我们保存数据都是以文件,或者数据库的形式 ...
随机推荐
- 1.2WEB API 跨域
详细请参考http://www.cnblogs.com/landeanfen/p/5177176.html 在项目上面使用Nuget安装 microsoft.aspnet.webapi.cors 在w ...
- innerHTML与innerText的区别
innerHTML获取元素的HTML内容,和设计元素的HTML内容(HTML标签会被解析)例如:ele.innerHTML="<strong>我会被解释加粗</strong ...
- html2canvas 实现dashed虚线边框
html2canvas是一个将html元素生成canvas的库,绘制的canvas大部分样式和CSS一致.比如截止1.0.0-alpha.12,虚线边框依然绘制为实线,border-collapse依 ...
- 1024MySQL事物提交机制
转自 http://www.cnblogs.com/exceptioneye/p/5451960.html MySQL作为一种关系型数据库,已被广泛应用到互联网中的诸多项目中.今天我们来讨论下事务的提 ...
- Java基础详解
从写Java系列的第一篇到现在已经三个月了,因为在网络上或书籍中没有见到一些很适合初学者的学习流程,所以下决心自己写一写,也当作回顾一下Java的知识.网上有许多Java教程之类的内容,都是从概念起步 ...
- Python模块 - re
Python 的 re 模块(Regular Expression 正则表达式)提供各种正则表达式的匹配操作,在文本解析.复杂字符串分析和信息提取时是一个非常有用的工具,下面我主要总结了re的常用方法 ...
- [HNOI 2018]排列
Description 题库链接 给定 \(n\) 个整数 \(a_1, a_2, \dots, a_n, 0 \le ai \le n\) ,以及 \(n\) 个整数 \(w_1, w_2, \do ...
- [SHOI 2011]双倍回文
Description 题库链接 记一个字符串为 \(X\) ,它的倒置为 \(X^R\) .现在给你一个长度为 \(n\) 的字符串 \(S\) ,询问其最长的形同 \(XX^RXX^R\) 的子串 ...
- 计蒜客NOIP模拟赛6 D1T1Diamond-square
Diamond-square 算法是一种能够用于生成噪声的算法,现在我们考虑这个算法的一个变种. 你有一个 2^n\times 2^n2n×2n 的网格,一共有 (2^n+1)^2(2n ...
- [ZJOI2006]超级麻将
题目描述 很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则: 普通麻将有砣.索.万三种类型的牌,每种牌有1~9个数字,其中相同的牌每个有四张,例如1砣~9砣,1索~9 ...