android---WebView实例

article/2025/11/4 16:09:35

        现在很多 App 里都内置了 Web 网页,比如电商平台淘宝、京东等。那么这种该如何实现呢?其实这是 Android 里一个叫 WebView 的组件实现的。下面将介绍 WebView 的实例。下面的实例是以组件化为基础搭建的。

新建项目 WebView,然后对整个项目做统一的版本管理。在 project 下的 build.gradle 里添加如下代码。

 修改 app 下的build.gradle 代码如下,即将统一管理的版本引进来,同时添加对 viewBinding 的使用。使用 viewBinding 就是为了避免繁琐的 findViewById() 操作

添加 WebView module模块,用来实现 WebView 相关功能。File --> new --> new module --> Android Library

 对 WebView 模块的 build.gradle 做与 app 模块相同的版本管理,并添加 viewBinding。

添加网络访问权限

这是前提!在WebView 模块里的 AndroidManifest.xml 里添加访问网络的权限。

<uses-permission android:name="android.permission.INTERNET"/>

在 WebView 模块里新建 WebViewActivity.java,然后对应的 xml 布局如下:

<?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"tools:context=".WebViewActivity"><WebViewandroid:id="@+id/web_view"android:layout_width="match_parent"android:layout_height="match_parent"/></LinearLayout>

WebViewActivity,java 主要实现网页的打开,这里以 https://www.baidu.com 练习。代码如下

public class WebViewActivity extends AppCompatActivity {private ActivityWebViewBinding mBinding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBinding = ActivityWebViewBinding.inflate(LayoutInflater.from(this));setContentView(mBinding.getRoot());//TODO 设置可以与 JS 交互,因为百度网页代码是有js代码的mBinding.webView.getSettings().setJavaScriptEnabled(true);// LoadUrl 打开对应网址的内容mBinding.webView.loadUrl("https://www.baidu.com");}
}

注意:这里的网址以https开头的,如果是http的话,需要在 WebView模块的 AndroidManifest.xml 里添加 android:usesCleartextTraffic="true"。

 app 模块下的 MainActivity.java 主要实现点击跳转到 WebViewActivity 的功能。

public class MainActivity extends AppCompatActivity {ActivityMainBinding mBinding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBinding = ActivityMainBinding.inflate(LayoutInflater.from(this));setContentView(mBinding.getRoot());mBinding.openWebView.setOnClickListener(v -> {startActivity(new Intent(this, WebViewActivity.class));});}
}

注意:MainActivity.java 与 WebViewActivity.java 是位于两个 module 下的 java 代码,是不能直接调用的。要在 app 模块里的 MainActivity 里调用 WebView 模块里的 WebViewActivity,需要在 app 模块的 build.gradle 里添加 api project(":WebView"),添加对 WebView 模块的引用。

 到此,通过上面的代码,我们就简单的实现了通过 WebView 打开网页的功能!

        我们要通过组件化实现上面的功能,上面 MainActivity 中的调用明显不是组件化,且也不能这么写代码。WebView模块是一个单独的组件,而组件之间是互不交互的,所以要通过组件间通信来完成。常见的组件间通信有 arouter、cc 以及 auto service,我们这里将使用 auto service 来完成。

 

使用 auto service 我们首先要加入一个依赖。

在 project 下的 build.gradle 里添加如下代码

googleAutoServiceDependency ='com.google.auto.service:auto-service:1.0.1'

 在 WebView 模块的 build.dradle 里添加如下代码,把 auto service 加上

annotationProcessor rootProject.googleAutoServiceDependency
implementation rootProject.googleAutoServiceDependency

 要满足组件化的需求,WebView 里打开网页的操作我们要给其它组件或者 app 模块使用,所以我们要在 common 层写一个接口,然后在 WebView 模块把这个接口实现,其它组件就能通过 common 层的接口在 WebView 模块中找到实现,这种方法称为接口下沉。

我们新建一个 moduel 为 common,并修改版本操作。

 然后创建一个 IWebViewInterface 的接口

public interface IWebViewInterface {void startWebViewActivity(Context context, String url, String title);}

在 WebView 模块中,创建一个 WebViewserviceImpl.java 来实现 IWebViewInterface 接口,实现到 WebViewActivity 的跳转。

在 WebView 模块中的build.gradle 里添加对 common 层的依赖。

api project(":common")

 WebViewserviceImpl.java 的代码如下。Constants 是一个存放静态常量的类。

//TODO 添加注解,说明 WebViewServiceImpl 实现了 IWebViewService 接口的
@AutoService(IWebViewInterface.class)
public class WebViewserviceImpl implements IWebViewInterface {@Overridepublic void startWebViewActivity(Context context, String url, String title) {Intent intent = new Intent(context, WebViewActivity.class);intent.putExtra(Constants.URL, url);intent.putExtra(Constants.TITLE, title);context.startActivity(intent);}
}

最后,在 app 模块完成对IWebViewInterface 接口的调用,app 模块也要用到 auto service,所以也要添加依赖:

annotationProcessor rootProject.googleAutoServiceDependency
implementation rootProject.googleAutoServiceDependency

 MainActivity.java 的代码修改如下

public class MainActivity extends AppCompatActivity {ActivityMainBinding mBinding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);mBinding = ActivityMainBinding.inflate(LayoutInflater.from(this));setContentView(mBinding.getRoot());mBinding.openWebView.setOnClickListener(v -> {//startActivity(new Intent(this, WebViewActivity.class));// TODO 使用 auto service 完成跳转IWebViewInterface iWebViewInterface = ServiceLoader.load(IWebViewInterface.class).iterator().next();if (iWebViewInterface != null) {iWebViewInterface.startWebViewActivity(this, "https://www.baidu.com", "百度");}});}
}

上面代码里的 ServiceLoader.load(IWebViewInterface.class).iterator().next(); 这一句可以包装一下,应该放到 base 层,所以我们又要新建一个 base module,来完成对这句代码的封装。

同样对 base 模块下的 build.gradle 也进行统一的版本管理

在 base 层新建 AutoServiceLoader.java 实现对  ServiceLoader.load(IWebViewInterface.class).iterator().next() 的封装

public class AutoServiceLoader {// 其它类是不能 new 的private AutoServiceLoader(){}// 泛型方法 TODO 传进来的是 S 类 , 返回去的还是 S 类public static <S> S load(Class<S> service){try {return ServiceLoader.load(service).iterator().next();}catch (Exception e){return null;}}
}

 在 common 层的build.gradle 里添加对 base 层的依赖

api project(":base")

以 api 添加的模块之间的依赖是向下传递的,即 app 中依赖 WebView, WebView 中依赖 common, common 中依赖 base,那么 app 中就能依赖到 common 和 base。所以 app 模块中的 MainActivity 就能调用 base 层的 AutoServiceLoader 类。

修改 MainActivity.java 里的代码如下

 至此,我们通过组件化完成了 WebView 的使用了!

完成 Demo

链接:https://pan.baidu.com/s/1B09-JNuqlDyoh3FB4BXbRw 
提取码:gxpb


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

相关文章

【webview】取消自适应让webview和电脑浏览器一样的显示

改动需求 1920x1080分辨率的Android设备上&#xff0c;使用webview显示效果要和电脑浏览器一样。 Android设备上效果是这样的&#xff0c;和PC浏览器上显示效果完全不一样。 实现方法 移除自适应代码如下&#xff1a; WebView newWebView (WebView) findViewById(R.id.newWe…

WebView全面解析

WebView全面解析 简介 WebView是android中一个非常重要的控件&#xff0c;它的作用是用来展示一个web页面。它使用的内核是webkit引擎&#xff0c;4.4版本之后&#xff0c;直接使用Chrome作为内置网页浏览器。 作用 显示和渲染网页&#xff1b;可与页面JavaScript交互&…

Android【WebView】

WebView全面解析 简介 WebView是android中一个非常重要的控件&#xff0c;它的作用是用来展示一个web页面。它使用的内核是webkit引擎&#xff0c;4.4版本之后&#xff0c;直接使用Chrome作为内置网页浏览器。 作用 显示和渲染网页&#xff1b;可与页面JavaScript交互&…

初步理解 WebView

我们通常使用 Chrome, Firefox, Safari, Internet Explorer 和 Edge 等浏览器来浏览网页。你也许正在使用其中一种浏览器阅读本文&#xff01;虽然浏览器对于访问互联网内容的任务来说非常流行&#xff0c;它们还有一些我们从未过多关注过的竞争对手。这些竞争对手以 WebView 的…

AndroidStudio之WebView详解

WebView 简介: WebView是一个基于webkit引擎、展现web页面的控件。 Android的Webview在低版本和高版本采用了不同的webkit版本内核&#xff0c;4.4后直接使用了Chrome。 作用&#xff1a; 1、 显示和渲染Web页面 2、 直接使用html文件&#xff08;网络上或本地assets中&…

如何在uniapp中优雅地使用WebView

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 从webview页面传值到uniapp中 官方文档已经很详细了,这里给大家上我的实战代码&#xff0c;首先在webview页面中引入相关依赖&#xff1a; <!-- uniapp各平台依赖 --> <script type"tex…

Android:最全面的 Webview 详解

前言 现在很多App里都内置了Web网页&#xff08;Hyprid App&#xff09;&#xff0c;比如说很多电商平台&#xff0c;淘宝、京东、聚划算等等&#xff0c;如下图 那么这种该如何实现呢&#xff1f;其实这是Android里一个叫WebView的组件实现的。今天我将全面介绍WebView的常用…

Android 各个版本WebView

转载请注明出处 http://blog.csdn.net/typename/ powered by miechal zhao &#xff1a; miechalzhaogmail.com 前言&#xff1a; 根据Google公布的Android 各个系统版本市场占有率(Google Android dashboards), Android 4.0及其以上系统将近90%左右&#xff0c;发展趋势必…

app中的webview是什么?如何理解?

app中的webview是什么&#xff1f;如何理解&#xff1f; 当你上网阅读东西时&#xff0c;我们一般会选择一款浏览器&#xff0c;比如Chrome、火狐、safari、IE或者Edge。你可能不知道这些浏览器之间有一些竞争&#xff0c;而竞争的主要形式就是WebView。 WebView的定义 什么…

什么是webview ?

Andoid 平台&#xff0c;SDK 中有一个控件叫 WebView&#xff1b; IOS/MacOS 平台&#xff0c;SDK 中有一个控件叫 WebView/UIWebView/WKWebView(UIView/NSView)&#xff1b; 这些控件&#xff0c;用于移动端 APP 嵌入(Embed) Web 技术&#xff0c;加载 Web 内容&#xff1b;…

webview是什么,给小白的简单介绍

最近在学习uni-app&#xff0c;也会一直更新关于uni-app学习中自己遇到的问题和心得。 从uni-app的介绍看起&#xff0c;碰到了 ‘webview’ 一词&#xff0c;有必要搜罗一番。 webview是什么&#xff0c;给小白的简单介绍 百度知道 Webview含义&#xff1a;WebView也就是我…

VS下 dllimport与dllexport作用与区别

原文&#xff1a;http://www.cnblogs.com/foohack/p/4119207.html 我相信写WIN32程序的人&#xff0c;做过DLL&#xff0c;都会很清楚__declspec(dllexport)的作用&#xff0c;它就是为了省掉在DEF文件中手工定义导出哪些函数的一个方法。当然&#xff0c;如果你的DLL里全是C的…

VS BUG(5) error C2491: “****“: 不允许 dllimport 函数 的定义

VS BUG&#xff08;5&#xff09; error C2491: "****": 不允许 dllimport 函数 的定义 前言一. BUG提示二. 分析解决三. 小结 前言 程序员难免要与BUG打交道&#xff0c;本系列将记录自己在VS平台下代码调试过程中遇到的一些BUG&#xff0c;希望对大家遇到相关问题…

C#中DllImport使用法汇总

(转) 最近使用DllImport&#xff0c;从网上百度后发现&#xff0c;大部分内容都是相同&#xff0c;又从MSDN中搜集下&#xff0c;现将内容汇总&#xff0c;与大家分享。 大家在实际工作学习C#的时候&#xff0c;可能会问&#xff1a;为什么我们要为一些已经存在的功能&#xf…

dllexport和dllimport

在VS中&#xff0c;如果要跨项目使用类或变量&#xff0c;就必须用到dllexport和dllimport&#xff0c;下面分别举例全局变量&#xff0c;函数和类跨项目使用。 环境准备&#xff1a;使用VS分别新建一个windows应用程序和DLL项目&#xff0c;windows应用程序项目名称为ConsoleA…

简记C#DllImport异常

C#开发过程中&#xff0c;有些动态库引用不了&#xff0c;需要用DllImport加载该文件动态库&#xff1b; 然后在引用的过程中会碰到各种问题&#xff0c;当然网上各种回答&#xff0c;能解决大部分问题。 我在这里简单记录下问题的解决方案&#xff1a; ”尝试读取或写入受保…

关于c++动态库的dllexport和dllimport

先推荐一款比Microsoft Coplilot更好用的辅助编程工具——Cursor&#xff0c; 一款基于GPT4的新一代辅助编程神器——Cursor&#xff0c;官网介绍说是与OpenAI合作并且基于GPT4。自己体验了下&#xff0c;确实不错&#xff0c;值得尝试。 官网地址&#xff1a; Cursor | Build…

C# dllimport

一、DllImport是System.Runtime.InteropServices命名空间下的一个属性类&#xff0c;其功能是提供从非托管DLL导出的函数的必要调用信息 DllImport的定义如下&#xff1a; public class DllImportAttribute:System.Attribute { public DllImportAttribute(string dllName) {……

C#中DllImport用法和路径问题

DllImport 是System.Runtime.InteropServices命名空间下的一个属性类&#xff0c;其功能是提供从非托管DLL导出的函数的必要调用信息。 DllImport属性应应用于方法&#xff0c;要求最少要提供包含入口点的dll的名称。 文章目录 一 DllImport的定义如下&#xff1a;二 DllImpo…

1-5(中文版)听力积累

O 听力积累 KR 参照连接&#xff0c;建议看一看 听力学习步骤 选择材料&#xff1a;使用English Pod材料 Englishpod是一家公司叫做Praxis Language 推出的收费讲座。讲座高度还原生活场景&#xff0c;两位优秀的主持人以轻松聊天的方式讲解点评场景内容&#xff0c;在此过…