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 代码弹出
alert
、confirm
和prompt
对话框的时候,需要给 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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
文末
逆水行舟不进则退,所以大家要有危机意识。
同样是干到35岁,普通人写业务代码划水,榜样们深度学习拓宽视野晋升管理。
这也是为什么大家都说35岁是程序员的门槛,很多人迈不过去,其实各行各业都是这样都会有个坎,公司永远都缺的高级人才,只用这样才能在大风大浪过后,依然闪耀不被公司淘汰不被社会淘汰。
为了帮助大家更好温习重点知识、更高效的准备面试,特别整理了《前端工程师核心知识笔记》电子稿文件。
内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。
269页《前端大厂面试宝典》
包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。
CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
前端面试题汇总文章来源:https://www.toymoban.com/news/detail-859250.html
加V获取:vip1024c (备注前端)**
[外链图片转存中…(img-EHbTvAiy-1712011153331)]
文末
逆水行舟不进则退,所以大家要有危机意识。
同样是干到35岁,普通人写业务代码划水,榜样们深度学习拓宽视野晋升管理。
这也是为什么大家都说35岁是程序员的门槛,很多人迈不过去,其实各行各业都是这样都会有个坎,公司永远都缺的高级人才,只用这样才能在大风大浪过后,依然闪耀不被公司淘汰不被社会淘汰。
为了帮助大家更好温习重点知识、更高效的准备面试,特别整理了《前端工程师核心知识笔记》电子稿文件。
内容包括html,css,JavaScript,ES6,计算机网络,浏览器,工程化,模块化,Node.js,框架,数据结构,性能优化,项目等等。
269页《前端大厂面试宝典》
包含了腾讯、字节跳动、小米、阿里、滴滴、美团、58、拼多多、360、新浪、搜狐等一线互联网公司面试被问到的题目,涵盖了初中级前端技术点。
CodeChina开源项目:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
前端面试题汇总
文章来源地址https://www.toymoban.com/news/detail-859250.html
到了这里,关于WebView交互架构项目实战(一):使用与原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!