随着前端的火热,以前开发的快速,越来越多的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的实现原理,后续在讲解,也可以下载代码先了解一下。

  

源码参考github

Android开发学习之路--Java和Js互相调用的更多相关文章

  1. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  2. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  3. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  4. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

  5. Android开发学习之路--MAC下Android Studio开发环境搭建

    自从毕业开始到现在还没有系统地学习android应用的开发,之前一直都是做些底层的驱动,以及linux上的c开发.虽然写过几个简单的app,也对android4.0.3的源代码做过部分的分析,也算入门 ...

  6. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  7. Android开发学习必备的java知识

    Android开发学习必备的java知识本讲内容:对象.标识符.关键字.变量.常量.字面值.基本数据类型.整数.浮点数.布尔型.字符型.赋值.注释 Java作为一门语言,必然有他的语法规则.学习编程语 ...

  8. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  9. Android开发学习之路--数据持久化之初体验

    上班第一天,虽然工作上处于酱油模式,但是学习上依旧不能拉下,接着学习android开发吧,这里学习数据持久化的 知识. 其实数据持久化就是数据可以保存起来,一般我们保存数据都是以文件,或者数据库的形式 ...

随机推荐

  1. 单例模式详解及java常用类

    [单例模式]      确保某一个类,只能产生一个实例. 设计思路: ====将构造函数私有化,确保类外部,不能使用new关键字自行创建对象. ====在类内部实例化一个对象,并通过静态方法返回. ( ...

  2. 手把手教你实现boost::bind

    前言 boost::bind操作想必大家都使用过,它特别神奇,能够绑定函数与参数,绑定后能够改变参数数量,并且还可以使用占位符.它可以绑定普通函数也可以绑定类成员函数.好多小伙伴试图看过boost:: ...

  3. jdk 动态代理源码分析

    闲来无事,撸撸源码 使用方法 直接看代码吧.. package com.test.demo.proxy; import java.lang.reflect.InvocationHandler; imp ...

  4. SpringIOC学习三

    基于注解的注入:就是用注解标签的方式替换掉我们xml配置文件里面bean的注册和依赖关系的描述    a:首先回顾IOC(控制反转),进行依赖注入需要做到两件事情:        1:注册类  2:描 ...

  5. 视觉slam学习之路(一)看高翔十四讲所遇到的问题

      目前实验室做机器人,主要分三个方向,定位导航,建图,图像识别,之前做的也是做了下Qt上位机,后面又弄红外识别,因为这学期上课也没怎么花时间在项目,然后导师让我们确定一个方向来,便于以后发论文什么. ...

  6. [SDOI2009]虔诚的墓主人

    题目描述 小W是一片新造公墓的管理人.公墓可以看成一块N×M的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. 当地的居民都是非常虔诚的基督徒,他们愿意提前为自己找一块合适墓地. ...

  7. TopCoder SRM 561 Div 1 - Problem 1000 Orienteering

    传送门:https://284914869.github.io/AEoj/561.html 题目简述: 题外话: 刚开始看题没看到|C|<=300.以为|C|^2能做,码了好久,但始终解决不了一 ...

  8. bzoj 2783: [JLOI2012]树

    Description 在这个问题中,给定一个值S和一棵树.在树的每个节点有一个正整数,问有多少条路径的节点总和达到S.路径中节点的深度必须是升序的.假设节点1是根节点,根的深度是0,它的儿子节点的深 ...

  9. 用Qemu运行/调试arm linux【转】

    转自:https://blog.csdn.net/absurd/article/details/78984244 用Qemu运行/调试arm linux,这事情干过好几次了,久了就忘记了,每次都要重新 ...

  10. C++变量和基本类型——2.3.1引用

    引用:为对象起了另外一个名字,通常将申明符写成&d的形式来定义引用类型,其中d是申明的变量名: int ival =1024; int &refVal=ival 一般在初始化变量时,初 ...