Android Hybrid混合开发

article/2025/10/8 18:18:28

关于混合开发常问道的问题:

  1. Android如何嵌套h5页面?
  2. h5页面如何调用Android接口?
  3. Android如何调用网页(js)方法?
  4. h5页面 判断 移动端是ios、或者Android

问题1.android如何嵌套h5页面:

  1. 当我们用vue开发完项目,执行nmp run build打包生产dist目录,如何嵌套在Android框架中

  2. 创建网页存放文件夹,在Android工程res下面添加assets文件夹,把dist目录内容拷贝到assets下。(这里我把index.html改名为hybrid_test.html)

  3. 找到Android项目中.xml布局文件,添加webview组件及设置webview属性

    <WebViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:id="@+id/wv_test"/>
  1. 在相应的.java文件中通过id获取webview组件,将Android方法存入一个对象,通过addJavascriptInterface()方法,暴露给html页面。
  //获取webview组件wv_test = findViewById(R.id.wv_test);// 通过addJavascriptInterface方法 将Android里面提供的方法对象集合JSObject暴露给页面,同时也将页面的提供的js方法注册给Androidwv_test.addJavascriptInterface(new JSObject(this), JSOBJECT);// 加载网页,若非本地页面,则把下面的加载地址换在页面urlwv_test.loadUrl("file:///android_asset/hybrid_test.html");

问题2. h5页面如何调用Android接口或功能?

  1. 在java文件中创建一个供网页端调用的类,如JSObject,里面编写供网页调用的方法.
  2. 一般h5页面常要调用Android摄像头,相册,还有自定义方法。
  3. 在h5页面中,添加调用接口,在网页的javascript代码中使用上面安卓提供的MyJS.add()来调用(MyJS为Android端使用addJavascriptInterface方法时注入的调用本地方法类名称
    )。

问题3. Android如何调用网页(js)方法?

  1. Android端直接使用webview的loadUrl(“javascript:”+网页方法名)就可以直接调用的
  2. 但是方法一多这样就比较容易乱,因此我们可以创建一个专门管理的。
    创建生成网页方法的类NativeObject。

问题4. h5页面 判断 移动端是ios、或者Android

  1. 简称ua检测
$(function(){
var u = navigator.userAgent, app = navigator.appVersion; 
var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android终端或者uc浏览器 
var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 
alert('是否是Android:'+isAndroid); 
alert('是否是iOS:'+isiOS);
if(isAndroid){$ ("#choose").attr('capture','camera');}
});

本例demo下载地址:HybridDemo下载

简介:
混合开发(Hybrid)也有一段时间了,现在闲下来总结一下。
说到混合开发,重要功能有2种,一是网页端调用安卓原生接口或功能,二是安卓原生调用网页功能。

效果图:
在这里插入图片描述

Hybrid开发流程:
1、Android端编写方法api,暴露给h5页面调用
创建一个供网页端调用的类,如JSObject,里面编写供网页调用的方法,记得在方法上面添加@JavascriptInterface注释,否则在有些SDK版本上使用addJavascriptInterface方法(下面会用到)绑定JS对象时会报"they will not be visible in API 17"错误。

package mhwang.com.hybriddemo;import android.content.Context;
import android.webkit.JavascriptInterface;
import android.widget.Toast;public class JSObject {private Context mContext;public JSObject(Context context) {mContext = context;}@JavascriptInterfacepublic int add(int a, int b){return a + b;}@JavascriptInterfacepublic void showToast(String msg){Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();}
}

这里提供了2个方法给网页端调用,分别为add()方法和showToast()方法。

2、网页端添加Android端调用接口
创建html网页hybrid_test.html,并添加调用接口,在网页的javascript代码中使用上面安卓提供的MyJS.add()来调用。MyJS可以看成是JSObject类在网页中的别名,下面会使用webviewaddJavascriptInterface()方法将它们关联起来。

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8">          <!--添加编码格式,否则安卓端调用时传递中文参数会可能乱码--><title>Hybrid开发测试</title>
</head>
<body><h1>网页端</h1><br /><button id="btn_callNativeAdd" onclick="onAddClick(this)">调用本地加法运算并显示</button><br /><div id="div_showTextFromNative"></div><!--javascript代码--><script type="text/javascript">// 调用android端提供的参数// MyJS为Android端使用addJavascriptInterface方法时注入的调用本地方法类名称function onAddClick(e){var result = MyJS.add(3, 5);MyJS.showToast('3 + 5 = '+result);};// 提供android端调用的造句方法function makeSentence(word1, word2){var div_showTextFromNative = document.getElementById("div_showTextFromNative");div_showTextFromNative.innerHTML = '你'+word1 + ',他'+word2;};// 提供android端相加的方法function add(a, b){var div_showTextFromNative = document.getElementById("div_showTextFromNative");var result = a + b;div_showTextFromNative.innerHTML = 'a + b = ' + result;}</script>
</body>
</html>

3、Android端封装一个生成网页端方法url的类
正常来说Android端直接使用webview的loadUrl(“javascript:”+网页方法名)就可以直接调用的,但是方法一多这样就比较容易乱,因此创建一个专门管理的类好点。
创建生成网页方法的类NativeObject。

package mhwang.com.hybriddemo;/** 用于封装拼接调用js方法的语句
*/
public class NativeObject {/** 为了方便获取String 类型的字符串* @param s 加‘’号的参数* @return 加了‘’号的参数*/private static String getJsStringParam(String s){return "'"+s+"'";}public static String makeSentence(String world1, String world2){return "javascript:makeSentence("+getJsStringParam(world1)+","+getJsStringParam(world2)+")";   // 这里要注意的是,若是传递的参数是字符串,那么在拼接调用的url的时候需要对参数加上‘’号。}public static String add(int a, int b){// 不是字符串的话不用加‘’号return "javascript:add("+a+","+b+")";}
}

这里生成的2个方法是跟上面网页javascript代码提供的2个方法对应的。然后在需要调用的地方使用就可以,如:

wv_test.loadUrl(NativeObject.add(5, 10));

如果系统版本大于4.4,可以使用evalute.Javascript()方法,该方法的好处是可以回调javascript的返回结果。并且这个方法比 loadUrl 方法更加方便简洁,比 loadUrl 效率更高,因为 loadUrl 的执行会造成页面刷新一次,这个方法不会,下面是这个方法的使用示例:

final int version = Build.VERSION.SDK_INT;
if (version < 18) {wv_tests.loadUrl(jsStr);
} else {wv_test.evaluateJavascript(jsStr, new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {//此处为 js 返回的结果}
});
}

4、创建网页存放文件夹(不使用本地网页的可以跳过)
在Android工程res下面添加assets文件夹,用于存放本地网页文件hybrid_test.html。
在这里插入图片描述
5、添加webview组件及设置webview属性
.xml布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns: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=".MainActivity"><WebViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:id="@+id/wv_test"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="0dp"android:orientation="vertical"android:background="@color/colorPrimary"android:layout_weight="1"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Android端"android:textSize="30dp"/><Buttonandroid:layout_gravity="center"android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/btn_makeSentence"android:text="造句"/><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/btn_webAdd"android:layout_gravity="center"android:text="做加法"/></LinearLayout></LinearLayout>

相应的.java文件

public class MainActivity extends Activity {WebView wv_test;Button btn_makeSentence;Button btn_webAdd;private static final String JSOBJECT = "MyJS";@SuppressLint("SetJavaScriptEnabled")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);wv_test = findViewById(R.id.wv_test);btn_makeSentence = findViewById(R.id.btn_makeSentence);btn_webAdd = findViewById(R.id.btn_webAdd);btn_makeSentence.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {wv_test.loadUrl(NativeObject.makeSentence("潇洒", "放荡"));}});btn_webAdd.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {wv_test.loadUrl(NativeObject.add(5, 10));}});// 设置webview属性WebSettings settings = wv_test.getSettings();settings.setJavaScriptEnabled(true);                                                            // 设置是否能使用javascriptsettings.setJavaScriptCanOpenWindowsAutomatically(true);wv_test.setWebChromeClient(new WebChromeClient());                           // 设置默认浏览器,否则不能弹窗// 这里需要注意,JSObject里面提供的方法需要添加@JavascriptInterface注释,// 否则会报"they will not be visible in API 17"错误wv_test.addJavascriptInterface(new JSObject(this), JSOBJECT);// 加载网页,若非本地页面,则把下面的加载地址换在页面urlwv_test.loadUrl("file:///android_asset/hybrid_test.html");}
}

下面是一些webview常用设置项及说明(摘抄):

WebSettings webSettings = webView.getSettings();
//设置了这个属性后我们才能在 WebView 里与我们的 Js 代码进行交互,对于 WebApp 是非常重要的,默认是 false,
//因此我们需要设置为 true,这个本身会有漏洞,具体的下面我会讲到
webSettings.setJavaScriptEnabled(true);
//设置 JS 是否可以打开 WebView 新窗口
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
//WebView 是否支持多窗口,如果设置为 true,需要重写
//WebChromeClient#onCreateWindow(WebView, boolean, boolean, Message) 函数,默认为 false
webSettings.setSupportMultipleWindows(true);
//这个属性用来设置 WebView 是否能够加载图片资源,需要注意的是,这个方法会控制所有图片,包括那些使用 data URI 协议嵌入
//的图片。使用 setBlockNetworkImage(boolean) 方法来控制仅仅加载使用网络 URI 协议的图片。需要提到的一点是如果这
//个设置从 false 变为 true 之后,所有被内容引用的正在显示的 WebView 图片资源都会自动加载,该标识默认值为 true。
webSettings.setLoadsImagesAutomatically(false);
//标识是否加载网络上的图片(使用 http 或者 https 域名的资源),需要注意的是如果 getLoadsImagesAutomatically()
//不返回 true,这个标识将没有作用。这个标识和上面的标识会互相影响。
webSettings.setBlockNetworkImage(true);
//显示WebView提供的缩放控件
webSettings.setDisplayZoomControls(true);
webSettings.setBuiltInZoomControls(true);
//设置是否启动 WebView API,默认值为 false
webSettings.setDatabaseEnabled(true);
//打开 WebView 的 storage 功能,这样 JS 的 localStorage,sessionStorage 对象才可以使用
webSettings.setDomStorageEnabled(true);
//打开 WebView 的 LBS 功能,这样 JS 的 geolocation 对象才可以使用
webSettings.setGeolocationEnabled(true);
webSettings.setGeolocationDatabasePath("");
//设置是否打开 WebView 表单数据的保存功能
webSettings.setSaveFormData(true);
//设置 WebView 的默认 userAgent 字符串
webSettings.setUserAgentString("");
//设置是否 WebView 支持 “viewport” 的 HTML meta tag,这个标识是用来屏幕自适应的,当这个标识设置为 false 时,
//页面布局的宽度被一直设置为 CSS 中控制的 WebView 的宽度;如果设置为 true 并且页面含有 viewport meta tag,那么
//被这个 tag 声明的宽度将会被使用,如果页面没有这个 tag 或者没有提供一个宽度,那么一个宽型 viewport 将会被使用。
webSettings.setUseWideViewPort(false);
//设置 WebView 的字体,可以通过这个函数,改变 WebView 的字体,默认字体为 "sans-serif"
webSettings.setStandardFontFamily("");
//设置 WebView 字体的大小,默认大小为 16
webSettings.setDefaultFontSize(20);
//设置 WebView 支持的最小字体大小,默认为 8
webSettings.setMinimumFontSize(12);
//设置页面是否支持缩放
webSettings.setSupportZoom(true);

http://chatgpt.dhexx.cn/article/KyHIIHZm.shtml

相关文章

混合开发(Hybrid App)有哪些优劣点?

从当前移动开发的实际情况来看&#xff0c;移动端的开发方式三分天下&#xff1a;纯原生&#xff08;Native App&#xff09;、混合开发&#xff08;Hybird App&#xff09;、网页应用&#xff08;Web App&#xff09;。 那么&#xff0c;混合式开发与其他的两种开发模式相比&…

原生开发、H5开发和混合开发的区别

目前市场上主流的APP分为三种&#xff1a;原生APP、Web APP&#xff08;即HTML5&#xff09;和混合APP三种&#xff0c;相对应的定 制开发就是原生开发、H5开发和混合开发。那么这三种开发模式究竟有何不同呢&#xff1f;下面我们就分别从这三者各自的优劣势来区分比较吧&#…

混合开发

一、原生语言&#xff1a; 苹果手机&#xff1a;ios系统&#xff0c;由swift和c/object-c语言编写&#xff0c;后缀名为 ipa&#xff08;ios开发的安装包的后缀名&#xff09; swift语言是一种开源的语言 安卓手机&#xff1a;android系统&#xff0c;由java&#xff08;andr…

Android : 混合开发整理指南

混合开发&#xff1a; 是一种开发模式Hybrid App. 混合开发 Native Web. 另一篇博文&#xff1a;Kotlin与H5通信 场景应用&#xff1a; 例如: 微信公众号通过JSSDK连接Native端和Web端 微信小程序通过内置框架连接Native端和Web端 混合开发的核心技术&#xff1a; JS…

Hybrid APP混合开发的一些经验和总结

Hybrid APP混合开发的一些经验和总结 写在前面&#xff1a; 由于业务需要&#xff0c;接触到一个Hybrid APP混合开发的项目。当时是第一次接触混合开发&#xff0c;有一些经验和总结&#xff0c;欢迎各位一起交流学习~ 1、混合开发概述 Hybrid App主要以JSNative两者相互调用为…

【Python编程入门】引言

What is Python? Python 是由 Guido van Rossum 工程师于1991年所开发&#xff0c;是一种高级的、解释性的、交互式的通用型编程语言。它被设计成具有高度可读性&#xff0c;是一门动态编程语言&#xff0c;并且具备自动垃圾回收机制。Python支持多种编程范式&#xff0c;其中…

python编程入门到实践pdf,python编程入门课 视频

初学者学Python编程如何快速入门? 谷歌人工智能写作项目&#xff1a;小发猫 初学python入门都需要具备那些条件&#xff1f; Python相对比较简单&#xff0c;零基础也能学typescript在npm安装后检测不到。系统学习的话&#xff0c;一般4-6个月左右能学好。python是一门语法优…

Python编程:从入门到实践(基础知识)

第一章 起步 计算机执行源程序的两种方式&#xff1a; 编译&#xff1a;一次性执行源代码&#xff0c;生成目标代码解释&#xff1a;随时需要执行源代码 源代码&#xff1a;采用某种编程语言编写的计算机程序 目标代码&#xff1a;计算机可执行&#xff0c;101010 编程语言…

Python从入门到实践电子书,python编程入门到实践pdf

《Python编程从入门到实践》txt下载在线阅读&#xff0c;求百度网盘云资源 《Python编程》&#xff08;[美]埃里克马瑟斯&#xff08;Eric Matthes&#xff09;&#xff09;电子书网盘下载免费在线阅读资源链接&#xff1a;链接&#xff1a; 提取码&#xff1a;6vcz 书名&a…

《我的世界》Python编程入门(1)Minecraft(我的世界)Python编程环境搭建

一、Minecraft环境搭建&#xff08;手动模式&#xff09; 环境搭建分为三个部分&#xff1a; 1.1、Java环境 Minecraft原始版本是用Java开发的&#xff0c;因此&#xff0c;想运行Minecraft需要安装jdk。安装Java jdk8相对来说兼容性比较好。 &#xff08;1&#xff09;安装…

Python编程

1.华氏温度到摄氏温度的转换 从键盘读取华氏温度&#xff0c;转换成摄氏温度并输出&#xff0c;保留1位小数。 转换公式为&#xff1a;c5/9*(f-32), 其中&#xff0c;f为华为温度&#xff0c;c为摄氏温度。 输入格式: 华氏温度 输出格式: 摄低温度 输入样例: 100 结尾无…

Python编程自学入门学习指南

对于初学者来说&#xff0c;入门很重要&#xff0c;这关系到初学者是从入门到精通还是从入门到放弃。 以下是结合Python的学习经验整理出来的学习路径&#xff0c;主要有四个阶段。 NO.1新手入门阶段&#xff0c;学习基础知识。 一般来说&#xff0c;找一本可靠的书&#x…

python编程入门(适合初学者)

python编程入门 特别说明&#xff1a;这是早期的学习笔记&#xff0c;最近试用Python 3.8.1&#xff08; Dec. 18, 2019&#xff09;&#xff0c;发现安装过程及基本功能差不多。或许对新手还有点用处&#xff0c;就未作大修改发布于此。 IDLE是开发python程序的基本IDE&#x…

python编程入门自学

作为一个什么都不懂的小白&#xff0c;学习编程的第一步当然是掌握一门编程语言。本节就来介绍常见的编程语言的学习路线。 首先&#xff0c;先明确一个观点&#xff0c;作为一个程序员&#xff0c;只会一种编程语言是远远不够的。最好精通1~2门语言&#xff0c;基本掌握其它所…

Python编程 介绍(入门)

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 一.pytnon安装地址 二.python介绍 1.Python来源 2.Python LOGO&#xff08;蟒…

编程语言python入门-Python基础教程,Python入门教程(非常详细)

Python 英文本意为"蟒蛇”&#xff0c;直到 1989 年荷兰人 Guido van Rossum &#xff08;简称 Guido&#xff09;发明了一种面向对象的解释型编程语言&#xff08;后续会介绍&#xff09;&#xff0c;并将其命名为 Python&#xff0c;才赋予了它表示一门编程语言的含义。…

Python编程入门教程

http://www.tzcoder.cn/acmhome/news.do?methodnewsDetail&id2c903bb4796f8da101798391db600b2e 本博客原文地址&#xff1a;Python编程入门教程(以在线评测平台为载体) - 暴力都不会的蒟蒻 - 博客园&#xff0c;原文体验更佳 如果你是一名浙江2020级及以后的高中生要学…

python零基础入门教程(非常详细),从零基础入门到精通,看完这一篇就够了

前言 本文罗列了了python零基础入门到精通的详细教程&#xff0c;内容均以知识目录的形式展开。 第一章&#xff1a;python基础之markdown Typora软件下载 Typora基本使用 Typora补充说明 编程与编程语言 计算机的本质 计算机五大组成部分 计算机三大核心硬件 操作系统 第二…

python入门基础(完整)

安装及配置 使用的编程地址&#xff1a;编程地址python基础相关文件安装&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1ZAhPIJ4_KAgWRHzX1lD3dQ 提取码&#xff1a;nxis pycharm配置环境 将原本pycharm中不可见的显示出&#xff0c;需要勾选以下三个&#xff1a;…

Python编程基础(快速入门必看)

Python编程基础 一、Python语言基本语法 Python是一个结合了解释性、编译性、互动性和面向对象的高级程序设计语言&#xff0c;结构简单&#xff0c;语法定义清晰。Python最具特色的就是使用缩进来表示代码块&#xff0c;不需要使用大括号{}。缩进的空格数是可变的&#xff0…