WebView交互架构项目实战(一):使用与原理

这篇具有很好参考价值的文章主要介绍了WebView交互架构项目实战(一):使用与原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

view.loadUrl(url);

return true;

}

// 给应用接管处理某些 url 请求的机会,返回 true 则拦截该请求,返回 false 不拦截,是上面方法的替代方法

// WebResourceRequest 中含有请求的 url,请求方法和请求头等信息

@TargetApi(21)

@Override

public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {

view.loadUrl(request.getUrl().toString());

return true;

}

// 页面开始加载时回调

@Override

public void onPageStarted(WebView view, String url, Bitmap favicon) {

super.onPageStarted(view, url, favicon);

}

// 页面结束加载时回调

@Override

public void onPageFinished(WebView view, String url) {

super.onPageFinished(view, url);

}

// 在加载 url 对应的资源时会回调此方法

@Override

public void onLoadResource(WebView view, String url) {

super.onLoadResource(view, url);

}

// 在加载 url 对应资源时会回调此方法,不同的是,可以通过返回值控制加载的数据。此方法已被废弃

// 若返回 null,WebView 会正常加载该资源

// 若返回 WebResourceResponse 类型的对象,则 WebView 会使用该对象

// 需要注意的是,此方法不在 UI 线程中被调用

@Override

public WebResourceResponse shouldInterceptRequest(WebView view, String url) {

return super.shouldInterceptRequest(view, url);

}

// 是上面方法的替代方法,使用方法和上面方法一致

@Override

public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {

return super.shouldInterceptRequest(view, request);

}

// 加载资源出错时会被回调的方法

@Override

public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {

super.onReceivedError(view, request, error);

}

// 加载资源时 HTTP 请求出错会回调此方法

@Override

public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {

super.onReceivedHttpError(view, request, errorResponse);

}

// 请求 HTTPS 资源出错时会回调此方法

@Override

public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {

super.onReceivedSslError(view, handler, error);

}

// 拦截浏览器中的按键事件

// 若返回 true,则拦截按键事件

// 若返回 false,则由 WebView 处理该事件

@Override

public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {

return super.shouldOverrideKeyEvent(view, event);

}

// 当页面的缩放比例发生变化时会回调此方法

@Override

public void onScaleChanged(WebView view, float oldScale, float newScale) {

super.onScaleChanged(view, oldScale, newScale);

}

});

3. WebChromeClient


同 WebViewClient 一样,通过为 WebView 设置 WebChromeClient 对象,并重写其中的一些方法可以对 WebView 的一些行为进行控制。

webView.setWebChromeClient(new WebChromeClient() {

// 网页的加载进度

@Override

public void onProgressChanged(WebView view, int newProgress) {

L.i("onProgressChanged " + newProgress);

super.onProgressChanged(view, newProgress);

}

// 接收到网页的 title

@Override

public void onReceivedTitle(WebView view, String title) {

L.i("onReceivedTitle " + title);

super.onReceivedTitle(view, title);

}

// 接收到网页的 icon

@Override

public void onReceivedIcon(WebView view, Bitmap icon) {

super.onReceivedIcon(view, icon);

}

@Override

public void onReceivedTouchIconUrl(WebView view, String url, boolean precomposed) {

super.onReceivedTouchIconUrl(view, url, precomposed);

}

// 当 H5 页面中点击播放的 flash video 的全屏按钮时,会调用这个方法

@Override

public void onShowCustomView(View view, CustomViewCallback callback) {

super.onShowCustomView(view, callback);

}

// 与 onShowCustomView() 对应的取消全屏时会调用的方法

@Override

public void onHideCustomView() {

super.onHideCustomView();

}

@Override

public void onShowCustomView(View view, int requestedOrientation, CustomViewCallback callback) {

super.onShowCustomView(view, requestedOrientation, callback);

}

// http://www.cnblogs.com/ufreedom/p/4229590.html

// 当创建新的 Window 时会调用此方法

@Override

public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {

return super.onCreateWindow(view, isDialog, isUserGesture, resultMsg);

}

// 和 onCreateWindow() 方法对应的,关闭 Window

@Override

public void onCloseWindow(WebView window) {

super.onCloseWindow(window);

}

// 当 WebView 获取焦点时会调用此方法

@Override

public void onRequestFocus(WebView view) {

super.onRequestFocus(view);

}

// 在 Js 代码中弹出 Alert 窗口时会调用此方法

@Override

public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

return super.onJsAlert(view, url, message, result);

}

// 在 Js 代码中弹出 Confirm 窗口时会调用此方法

@Override

public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {

return super.onJsConfirm(view, url, message, result);

}

// 在 Js 代码中弹出 Prompt 窗口时会调用此方法

@Override

public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {

return super.onJsPrompt(view, url, message, defaultValue, result);

}

// 在 Js 加载之前会调用此方法

@Override

public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) {

return super.onJsBeforeUnload(view, url, message, result);

}

// 打印 Js 中的日志 console 信息,被废弃

@Override

public void onConsoleMessage(String message, int lineNumber, String sourceID) {

super.onConsoleMessage(message, lineNumber, sourceID);

}

// 打印 Js 中的日志 console 信息,被废弃

@Override

public boolean onConsoleMessage(ConsoleMessage consoleMessage) {

return super.onConsoleMessage(consoleMessage);

}

});

4. WebViewClient 和 WebChromeClient 的区别


WebViewClient 主要帮助 WebView 处理一些网络请求方面的行为和操作,比如:各种资源的请求、请求资源出现错误、HTTPS请求出现错误的通知等。

WebChromeClient 主要帮助 WebView 处理一些 Javascript 相关的一些细节,比如:各种对话框的弹出、Js 中日志信息的打印、Window 的创建和关闭、以及 title 和 icon 的接收等。

5. Js 和 Java 代码的交互


Java 代码和 Js 代码额相互调用已经老生常谈了,现在也有一些很优秀的开源框架,使用起来非常的方便,但是其原理都是一样的,下面就介绍一下 Js 代码和 Java 代码是如何进行交互的。

5.1 Js 代码调用 Java 代码

private class InnerClass {

private Context mContext = null;

public InnerClass(Context context) {

mContext = context;

}

@JavascriptInterface

public void toastMessage(String msg) {

Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();

}

}

public class JSBridgeActivity extends AppCompatActivity {

private WebView webView = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_jsbridge);

initWebView();

}

private void initWebView() {

webView = (WebView) findViewById(R.id.webView);

webView.getSettings().setJavaScriptEnabled(true);

webView.addJavascriptInterface(new InnerClass(JSBridgeActivity.this), “innerClass”);

webView.loadUrl(“file:///android_asset/demo.html”);

webView.setWebChromeClient(new WebChromeClient());

}

}

  • 有名为 InnerClass 的类,其中的方法 toastMessage(String msg)@JavascriptInterface 注解所修饰

  • 设置 WebView 对象支持 JavaScript,并且调用 addJavascriptInterface(Object object, String name) 方法,将 InnerClass 的对象传入 WebView 对象中

  • 在 WebView 加载页面的 Js 代码中,即可通过 name 调用 InnerClass 对象的 toastMessage(String msg) 方法,如下所示:

function testPrompt(){

window.innerClass.toastMessage(“jsbridge”);

}

5.2 Java 代码调用 Js 代码

假如有如下的 Js 方法,如下所示:

function testConfirm(){

var temp = “temp”;

confirm(temp);

}

在 Java 中可以通过如下方法调用该 Js 方法:

webView.loadUrl(“javascript:testConfirm()”);

注意

  • 在 Java 代码中调用 Js 代码弹出 alertconfirmprompt 对话框的时候,需要给 WebView 设置 WebChromeClient 对象才可以正常的弹出对话框,否则不会有效果。

  • Java 调用 Js 的代码需要在主线程中调用才会生效

  • 在 Activity 的 onCreate() 方法中直接调用 WebView.loadUrl() 方法是不会生效的,需要在WebView 加载完成之后再调用 Js 的代码,才会生效。

6. WebView 的缓存


6.1 CacheMode 缓存模式

通过 WebView 的 WebSettings 对象可以设置 WebView 的 CacheMode 缓存策略,共有如下几个值可供设置:

  • LOAD_DEFAULT:默认设置,如果有本地缓存,且缓存有效未过期,则直接使用本地缓存,否则加载网络数据

  • LOAD_NORMAL:已被废弃,同 LOAD_DEFAULT 效果一样

  • LOAD_CACHE_ELSE_NETWORK:如果存在缓存时,不论缓存是否过期,都使用缓存;若缓存不存在,则从网络获取数据

  • LOAD_NO_CACHE:不使用缓存,只从网络获取数据

  • LOAD_CACHE_ONLY:不从网络获取数据,只使用缓存数据

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
WebView交互架构项目实战(一):使用与原理,2024年程序员学习,交互,架构
WebView交互架构项目实战(一):使用与原理,2024年程序员学习,交互,架构
WebView交互架构项目实战(一):使用与原理,2024年程序员学习,交互,架构
WebView交互架构项目实战(一):使用与原理,2024年程序员学习,交互,架构
WebView交互架构项目实战(一):使用与原理,2024年程序员学习,交互,架构
WebView交互架构项目实战(一):使用与原理,2024年程序员学习,交互,架构

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
WebView交互架构项目实战(一):使用与原理,2024年程序员学习,交互,架构

文末

逆水行舟不进则退,所以大家要有危机意识。

同样是干到35岁,普通人写业务代码划水,榜样们深度学习拓宽视野晋升管理。

这也是为什么大家都说35岁是程序员的门槛,很多人迈不过去,其实各行各业都是这样都会有个坎,公司永远都缺的高级人才,只用这样才能在大风大浪过后,依然闪耀不被公司淘汰不被社会淘汰。

为了帮助大家更好温习重点知识、更高效的准备面试,特别整理了《前端工程师核心知识笔记》电子稿文件。

内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。

269页《前端大厂面试宝典》

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

WebView交互架构项目实战(一):使用与原理,2024年程序员学习,交互,架构

前端面试题汇总

加V获取:vip1024c (备注前端)**
[外链图片转存中…(img-EHbTvAiy-1712011153331)]

文末

逆水行舟不进则退,所以大家要有危机意识。

同样是干到35岁,普通人写业务代码划水,榜样们深度学习拓宽视野晋升管理。

这也是为什么大家都说35岁是程序员的门槛,很多人迈不过去,其实各行各业都是这样都会有个坎,公司永远都缺的高级人才,只用这样才能在大风大浪过后,依然闪耀不被公司淘汰不被社会淘汰。

为了帮助大家更好温习重点知识、更高效的准备面试,特别整理了《前端工程师核心知识笔记》电子稿文件。

内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。

269页《前端大厂面试宝典》

包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。

CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

WebView交互架构项目实战(一):使用与原理,2024年程序员学习,交互,架构

前端面试题汇总

WebView交互架构项目实战(一):使用与原理,2024年程序员学习,交互,架构文章来源地址https://www.toymoban.com/news/detail-859250.html

到了这里,关于WebView交互架构项目实战(一):使用与原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android中使用WebView与JS交互全解析

    首先,需要提出一个概念,那就是hybrid,主要意思就是native原生Android和h5混合开发。为什么要这样做呢?大家可以想象一下针对于同一个活动,如果使用纯native的开发方式,Android和iOS两边都要维护同一套界面甚至是逻辑,这样开发和维护的成本会很大,而使用hybrid的开发方式

    2024年04月09日
    浏览(75)
  • uniapp 在app和小程序端使用webview进行数据交互

    结论:app端支持比较好可以做到实时传递,微信小程序支持比较差,小程序向url传参只能通过url,url向app传参需要特定时机(后退、组件销毁、分享、复制链接)触发才能收到消息。 以下是代码 app端(需要使用nvue) 微信小程序端(正常vue格式) 3、html端

    2024年02月16日
    浏览(42)
  • Android使用WebView与Native交互的三种方式 ( 附源码 )

    javascript.html: jsToAndroid.html jsToAndroid2.html 1.JS与Native的交互 一.Android调用JS的方法 目前学习了俩种方法:1. 调用webview的loadUrl 2.调用webview的evaluateJavascript 方法说明: 1. webView.loadUrl(“javascript:callJS()”); 参数是一个字符串,说明调用了javascript中的 callJS方法 webview.evaluateJavascript(

    2024年02月11日
    浏览(57)
  • 在 Flutter 中使用 webview_flutter 4.0 | js 交互

    大家好,我是 17。 已经有很多关于 Flutter WebView 的文章了,为什么还要写一篇。两个原因: Flutter WebView 是 Flutter 开发的必备技能 现有的文章都是关于老版本的,新版本 4.x 有了重要变化,基于 3.x 的代码很多要重写。 WebView 的文章分两篇 在 Flutter 中使用 webview_flutter 4.0 | js

    2024年01月18日
    浏览(33)
  • 从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战书籍

    相信大家都对未来的职业发展有着憧憬和规划,要做架构师、要做技术总监、要做CTO。对于如何实现自己的职业规划也都信心满满,努力工作、好好学习、不断提升自己。 相信成为一名优秀的架构师是很多程序员的目标,架构师的工作包罗万象,从开发基础框架到设计软件架

    2024年02月05日
    浏览(39)
  • 【黑马程序员】C++核心功能项目实战

    20240221 本教程主要利用C++来实现一个基于多态的职工管理系统 构成 普通员工 经理 老板 员工显示 需要显示职工编号、职工姓名、职工岗位以及职责 不同员工职责 责普通员工职责:完成经理交给的任务 经理职责:完成老板交给的任务,并下发任务给员工 老板职责:管理公司所有

    2024年02月22日
    浏览(43)
  • 【送书福利-第四期】从程序员到架构师:大数据量、缓存、高并发、微服务、多团队协同等核心场景实战书籍

    大家好,我是洲洲,欢迎关注,一个爱听周杰伦的程序员。关注公众号【程序员洲洲】即可获得10G学习资料、面试笔记、大厂独家学习体系路线等…还可以加入技术交流群欢迎大家在CSDN后台私信我! 今天给大家介绍一本好书:从程序员到架构师 大数据量 缓存 高并发 微服务

    2024年02月06日
    浏览(66)
  • ChatGPT引领AI时代:程序员、项目经理、产品经理、架构师、Python量化交易师的翅膀

    💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】 🤟 基于Web端打造的:👉轻量化工具创作平台 💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 在当今AI时代,ChatGPT作为一项卓越的语言模型技术,不仅仅在自然语言处理领域有着显著的影响,更在程

    2024年02月04日
    浏览(90)
  • 《黑马程序员2023新版黑马程序员大数据入门到实战教程,大数据开发必会的Hadoop、Hive,云平台实战项目》学习笔记总目录

    本文是对《黑马程序员新版大数据入门到实战教程》所有知识点的笔记进行总结分类。 学习视频:黑马程序员新版大数据 学习时总结的学习笔记以及思维导图会在后续更新,请敬请期待。 前言:配置三台虚拟机,为集群做准备(该篇章请到原视频进行观看,不在文章内详细

    2024年02月03日
    浏览(52)
  • [人工智能] 程序员超级进化ai必修课+AIGC全栈项目实战课

    课程内容: ├10_02【Java项目】基于ChatGPT的瑞吉外卖系统开发-01.ChatGPT在Java中的应用 .mp4 ├11_02【Java项目】基于ChatGPT的瑞吉外卖系统开发-02.多轮对话和编写文档 .mp4 ├12_02【Java项目】基于ChatGPT的瑞吉外卖系统开发-03.项目介绍和环境搭建 .mp4 ├13_02【Java项目】基于ChatGPT的瑞吉

    2024年02月03日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包