Android : 混合开发整理指南

article/2025/10/8 19:39:51

混合开发:

是一种开发模式Hybrid App.

混合开发 = Native + Web.

另一篇博文:Kotlin与H5通信

场景应用:

例如:

微信公众号通过JSSDK连接Native端和Web端

微信小程序通过内置框架连接Native端和Web端


混合开发的核心技术:

JSBridge桥接器

  • 实现Native端和Web端双向通信的一种机制。
  • 以JS引擎或WebView容器作为媒介。
  • 通过约定协议进行通信

混合开发主流技术框架:

  • Web渲染: Cordova (前身是PhoneGap)
  • 原生渲染: RN、Weex、Flutter
  • 混合渲染:微信小程序

JSBridge实现原理:

  • 将Native端原生接口封装为JS接口
  • 将Web端JS接口封装成原生接口
  • Web、Native端的双向通信 

案例准备:[全部源码见文末]

1.Native端UI:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"android:background="#eaeaea"><WebViewandroid:id="@+id/webView"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"></WebView><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"><EditTextandroid:id="@+id/editText"android:layout_width="match_parent"android:layout_height="wrap_content"android:hint="输入内容"android:textSize="45sp"/><Buttonandroid:id="@+id/showBtn"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="显示WebView界面"android:textSize="45sp"/></LinearLayout></LinearLayout>

2. Web端:这里为了方便就不用公网了,node起有个服务器模拟公网

 


JSBridge的2种实现方式:[web端调用原生端有2种,原生调用web端只有1种]

1.拦截WebView请求的URL Schema

  • URL Schema是类URL的一种请求格式
  • <protocol>://<domain>/<path>?<query>
  • 自定义JSBridge通信的URL Schema
  • jsbridge://<method>?<params>

1.1 native 调用web端:调起了web端的弹窗

package com.yinlei.hybridapp;import androidx.appcompat.app.AppCompatActivity;import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.Button;
import android.widget.EditText;import java.util.Date;public class MainActivity extends AppCompatActivity {private WebView webView;private Button showBtn;private Button refreshBtn;private EditText editText;private MainActivity self;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);self = this;webView = findViewById(R.id.webView);refreshBtn = findViewById(R.id.refreshBtn);showBtn = findViewById(R.id.showBtn);editText = findViewById(R.id.editText);webView.loadUrl("http://192.168.56.1:5000/web?timestamp"+new Date().getTime());//记得加网络权限,注意网络明文适配,加时间是为了防止页面缓存webView.getSettings().setJavaScriptEnabled(true);webView.setWebChromeClient(new WebChromeClient());showBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String inputValue = editText.getText().toString();self.showWebDialog(inputValue);}});refreshBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 重新加载webView.loadUrl("http://192.168.56.1:5000/web?timestamp"+new Date().getTime());//记得加网络权限,注意网络明文适配,加时间是为了防止页面缓存}});}private void showWebDialog(String text){//原生端调用web端String jsCOde = String.format("window.showWebDialog('%s')",text);webView.evaluateJavascript(jsCOde,null);}
}

1.2 web调用native端:调起了native端的弹窗

 

 

2.向WebView注入JS API

2. native 端和web端双向绑定

这样就把bridge对象暴露到webview中的一个名叫

NativeBridge对象上,

web端可以拿到这个对象直接去调用.

 


支持回调的JSBridge:

 上述的2种方式其实无法将执行的结果返回对方。

经常需要对端操作后需要将结果返回。

  • 在对端执行操作并返回结果
  • 有输入、输出才是完整的调用。

场景:Web端获取Native端输入框的值,还需要native端把获取的值再传回给web端。

 

1. web端调用native端 

 改正一下上方的alert(),上面拼写错了位置

 

 

2. native端调用web端并返回结果给native端

原生端新加一个按钮:

然后是一个回调:


JSBridge开源实现:

  • JSBridge: 拦截URL Schema
  • DSBridge: 注入JS API

Github上可搜索DSBridge-Android项目

本文Demo源代码见:

https://gitee.com/yinleilei/AndroidNative_Web

 

 

 


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

相关文章

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…

IPv4地址分类(A类 B类 C类 D类 E类)

5类地址&#xff08;A类 B类 C类 D类 E类&#xff09; IPv4地址由四段组成&#xff0c;每个字段是一个字节&#xff0c;8位&#xff0c;最大值是255&#xff0c;, IPv4地址由两部分组成&#xff0c;即网络地址和主机地址。网络地址表示其属于互联网的哪一个网络&#xff0c;主…

计算机网络中的A类、B类、C类地址的划分

原创不易,麻烦点个关注,点个赞,谢谢各位。 A类地址的第一组数字为1~126。注意,数字0和 127不作为A类地址,数字127保留给内部回送函数,而数字0则表示该地址是本地宿主机,不能传送。 范围:1.0.0.1到126.255.255.254 B类地址的第一组数字为128~191。 范围:128.0.0.1…

【计算机网络】B类IP地址

做笔试的时候遇到这个B类IP地址&#xff0c;做个笔记&#xff1a; B类IP地址是指:从 128.0.0.0 到 191.255.255.255 的单址广播 IP 地址 B类主机地址范围:128.0.0.1到191.255.255.254。 前两个八位二进制指明网络&#xff0c;后两个八位二进制指明网络上的主机。 172.16.0.0到…

IP地址常见分类:A类、B类、C类、D类、E类

文章目录 前言IPv4地址表示方法IPv6地址表示方法IPv4地址常见分类 前言 虽然IPv6渐渐出现在了人们的视线之中&#xff0c;但是目前来看IPv4仍然占据着主导地位&#xff0c;在日常的编码过程中两者都会接触到&#xff0c;但实际上两者在使用范围、消息头结构等细节上有诸多不同…