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

android原生和H5交互

最近在左一个Android原生的H5混合开发的APP,之前还没有好好的总结一下Android原生和H5之间交互的方法,这里来总结一下:1、hybrid通信,主要就是前端的js和我们Android

最近在左一个Android原生的H5混合开发的APP,之前还没有好好的总结一下Android原生 和 H5 之间交互的方法,这里来总结一下:

1、hybrid通信,主要就是前端的js和我们Android端的通信     这是最基本JS和Java 的通信方式:
       这里我们分四块来讲:  

      (1)、js调用android原生的代码(不传递参数)

      (2)、js调用android原生的代码(传递参数)

      (3)、android原生调用JS的代码(不传递参数)

      (4)、android原生调用JS的代码(传递参数)

    
     好的我们这里先来创建一个工程:

    在工程的main文件夹下创建一个文件夹assets ,然后把写好的H5页面放入该文件夹中,H5页面代码如下:

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1.   <pre name="code" class="html">>  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5.     <title>这里是一个H5页面title>  
  6. head>  
  7.   
  8. <body>  
  9. <p id="ptext">点击按键0 执行android中的 public void click0(){} 方法p>  
  10. <Button id="buttonId0" class="buttonClass" onclick="Javascript:button.click0()">按键0Button>  
  11. <p>点击按键1 执行android中的 public void click0(String data1,String data2){}方法p>  
  12. <Button id="buttonId1" class="buttonClass" onclick="Javascript:button.click0('参数1','参数2')">按键1Button>  
  13.   
  14. <script>  
  15.         function setRed(){  
  16.         //这个方法设置 id 为 ptext 的元素的背景色为红色  
  17.         var a = document.getElementById('ptext');  
  18.         a.style.backgroundColor="#F00";  
  19.     }  
  20.     function setColor(color,text){  
  21.         //这个方法设置 id 为 ptext 的元素的背景色为指定颜色  
  22.         //设置 id 为 ptext 的元素的内容为text  
  23.         var a = document.getElementById('ptext');  
  24.         a.style.backgroundColor=color;  
  25.         a.innerHTML = text;  
  26.     }  
  27.     script>  
  28. body>  


上边是一个简单的H5页面,其中包含连个按钮,点击按钮触发android 原生的方法;里边还有两个JS 方法,其中包括两个,主要用于给android原生去调用。


回到 activity_main.xml中,布局如下:

[html] view plain copy 在CODE上查看代码片派生到我的代码片
  1. xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context="manyizilin.com.androidh5.MainActivity">  
  7.   
  8.     <WebView android:id="@+id/webview"  
  9.         android:layout_height="match_parent"  
  10.         android:layout_width="match_parent"  
  11.         />  
  12.     <LinearLayout android:layout_width="match_parent"  
  13.         android:layout_height="wrap_content"  
  14.         android:layout_alignParentBottom="true"  
  15.         android:orientation="horizontal">  
  16.         <Button android:id="@+id/red"  
  17.             android:layout_height="wrap_content"  
  18.             android:layout_width="wrap_content"  
  19.             android:layout_weight="1"  
  20.             android:text="背景变成红色"/>  
  21.         <Button android:id="@+id/color"  
  22.             android:layout_height="wrap_content"  
  23.             android:layout_width="wrap_content"  
  24.             android:layout_weight="1"  
  25.             android:text="背景色可以自定义"/>  
  26.     LinearLayout>  
  27. RelativeLayout>  
主要包含一个WebView控件和两个按钮,点击按钮可以触发上边H5页面中的JS方法

最后看一下MainActivity的代码:

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. public class MainActivity extends AppCompatActivity implements View.OnClickListener{  
  2.   
  3.     private WebView webView;  
  4.     private Button redButton,colorButton;  
  5.     @Override  
  6.     protected void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.activity_main);  
  9.         webView = (WebView)findViewById(R.id.webview);  
  10.         redButton = (Button)findViewById(R.id.red);  
  11.         colorButton = (Button)findViewById(R.id.color);  
  12.         redButton.setOnClickListener(this);  
  13.         colorButton.setOnClickListener(this);  
  14.         initWebView();  
  15.         webView.loadUrl("file:///android_asset/android&h5Text0.html"); //加载assets文件中的H5页面  
  16.     }  
  17.   
  18.     /** 
  19.      *初始化WebView 
  20.      */  
  21.   @SuppressLint("JavascriptInterface")  //添加该字段  
  22.  private void initWebView(){  
  23.         WebSettings settings =  webView.getSettings();  
  24.         settings.setJavascriptEnabled(true);  //设置运行使用JS  
  25.         ButtonClick click = new ButtonClick();  
  26.         //这里添加JS的交互事件,这样H5就可以调用原生的代码  
  27.         webView.addJavascriptInterface(click,click.toString());  
  28.     }  
  29.   
  30.     @Override  
  31.     public void onClick(View v) {  
  32.         switch (v.getId()){  
  33.             case R.id.red:  //调用JS中的无参数方法  
  34.                 webView.loadUrl("Javascript:setRed()");  
  35.                 break;  
  36.             case R.id.color://调用JS中的有参数方法  
  37.                 webView.loadUrl("Javascript:setColor('#00f','这是android 原生调用JS代码的触发事件')");  
  38.                 break;  
  39.         }  
  40.     }  
  41.   
  42.     /** 
  43.      * H5页面按钮点击触发事件 
  44.      */  
  45.     class ButtonClick{  
  46.   
  47.         //这是 button.click0() 的触发事件  
  48.         //H5调用方法:Javascript:button.click0()  
  49.         @JavascriptInterface  
  50.         public void click0(){  
  51.            show("title","");  
  52.         }  
  53.   
  54.         //这是 button.click0() 的触发事件,可以传递待参数  
  55.         //H5调用方法:Javascript:button.click0('参数1','参数2')  
  56.         @JavascriptInterface  
  57.         public void click0(String data1,String data2){  
  58.             show(data1,data2);  
  59.         }  
  60.   
  61.   
  62.         @JavascriptInterface  //必须添加,这样才可以标志这个类的名称是 button  
  63.         public String toString(){  
  64.             return "button";  
  65.         }  
  66.   
  67.         private void show(String title,String data){  
  68.             new AlertDialog.Builder(getWindow().getContext())  
  69.                     .setTitle(title)  
  70.                     .setMessage(data)  
  71.                     .setPositiveButton("确定",null)  
  72.                     .create().show();  
  73.         }  
  74.     }  
  75. }  

好了上边的代码就是这样,接下来我们来详细解释一下:

    
  首先我们拿到了一个WebView,初始化webView,在webView中想要运行JS脚本,必须要设置:

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. WebSettings settings =  webView.getSettings(;  
  2. settings.setJavascriptEnabled(true);  //设置运行使用JSeang  

加载 assets中的H5页面:

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. webView.loadUrl("file:///android_asset/android&h5Text0.html"); //加载assets文件中的H5页面  

接下来写一个类,专门用于JS调用;

     记得必须写  写toString() 方法,放回来的结果和 JS中调用的方法的类名一致:

  比如:在这个例子中JS调用原生是使用 Javascript:button.click0();   注意一下,这个的 button 和Java中响应的类的toSring() 方法的返回值是一样的。

        @JavascriptInterface 

         public String toString(){             return "button";         }

Javascript:button.click0();  其中的 click0 和java响应类的触发方法的方法名是一致的。方法的权限都是 public 。

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. **  
  2.      * H5页面按钮点击触发事件  
  3.      */  
  4.     class ButtonClick{  
  5.   
  6.         //这是 button.click0() 的触发事件  
  7.         //H5调用方法:Javascript:button.click0()  
  8.         @JavascriptInterface  
  9.         public void click0(){  
  10.            show("title","");  
  11.         }  
  12.   
  13.         //这是 button.click0() 的触发事件,可以传递待参数  
  14.         //H5调用方法:Javascript:button.click0('参数1','参数2')  
  15.         @JavascriptInterface  
  16.         public void click0(String data1,String data2){  
  17.             show(data1,data2);  
  18.         }  
  19.   
  20.   
  21.         @JavascriptInterface  //必须添加,这样才可以标志这个类的名称是 button //在android 4.2之前不需要添加,在4.2之后需要添加  
  22.         public String toString(){  
  23.             return "button";  
  24.         }  
  25.   
  26.         private void show(String title,String data){  
  27.             new AlertDialog.Builder(getWindow().getContext())  
  28.                     .setTitle(title)  
  29.                     .setMessage(data)  
  30.                     .setPositiveButton("确定",null)  
  31.                     .create().show();  
  32.         }  
  33.     }  

好了,准备得差不多了

  (1)、js调用android原生的代码(不传递参数)/   (2)、js调用android原生的代码(传递参数)

     然后通过WebView的addJavascriptInterface方法去注入一个我们自己写的interface。

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1.    ButtonClick click = new ButtonClick();   
  2.   //这里添加JS的交互事件,这样H5就可以调用原生的代码  
  3.   webView.addJavascriptInterface(click,click.toString());  
    
    这里来说明一下 addJavascriptInterface 这个方法,前一个参数是触发的对象,后一个参数是这对象的标志,需要在这个类的内部添加下面的代码,这样JS才可以识别这个类的内部方法:
[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. @JavascriptInterface  //@JavascriptInterface必须添加,这样才可以标志这个类的名称是 button //在android 4.2之前不需要添加,在4.2之后需要添加  
  2.   public String toString(){  
  3.       return "button";  
  4.   }  

   现在点击H5页面中的 按键0 就可以触发事件  ButtonClick 类中的 click0() 方法了,点击  按键1  就可以触发事 ButtonClick 类中的 click0(String data1,String data2) 方法了

    (3)、android原生调用JS的代码(不传递参数)

       在加载 H5页面结束后,调用   webView.loadUrl("Javascript:setRed()");  那么就可以调用 该页面中的 setRed() 这个JS方法了

   (4)、android原生调用JS的代码(传递参数)

   在加载 H5页面结束后,调用 

 webView.loadUrl("Javascript:setColor('#00f','这是android 原生调用JS代码的触发事件')");  

那么就可以调用 该页面中的 setColor(color,text)  这个JS方法了


推荐阅读
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Html5-Canvas实现简易的抽奖转盘效果
    本文介绍了如何使用Html5和Canvas标签来实现简易的抽奖转盘效果,同时使用了jQueryRotate.js旋转插件。文章中给出了主要的html和css代码,并展示了实现的基本效果。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
author-avatar
杰v杰123_246
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有