Android笔记
我的博客
Android笔记
Android笔记
  • Android学习资料
  • Android知识点梳理
  • Android Studio
  • aop
  • UI
    • ViewPager2
    • View
      • View.post()分析
      • 自定义View
        • Canvas使用
        • Paint使用
        • Path使用
        • PathMeasure使用
        • Matrix使用
      • View事件分发
    • TextView
    • EditText
    • 引导页
    • 菜单
    • Toolbar
    • RecyclerView
    • ViewPager
    • BottomSheet
    • 通知
    • CalendarView
    • TimePicker
    • LayoutInfalter
    • shadowlayout
    • 状态栏适配
    • RecyclerView
    • 屏幕适配
  • 组件
    • Activity
    • Intent
    • 服务
      • 服务
      • 绑定服务
      • AIDL
    • Broadcasts
    • Fragment
    • ContentProvider
  • 权限
  • 数据存储
    • 数据和文件存储
    • 将文件保存到外部存储中
    • 将文件保存在内部存储中
    • Android 存储用例和最佳做法
    • 保存键值对数据
  • 编译时注解
    • Untitled
    • Java注解处理器](annotation/annotation-processing.md)
    • JavaPoet 文档翻译
  • 图形和图像
    • Drawable使用
  • 网络
    • WebView
    • OkHttp文档翻译
      • OkHttp使用
      • OkHttp拦截器
    • Retrofit使用
    • Retrofit源码分析
    • HttpURLConnection使用
    • Volley使用
    • Volley源码分析
    • Glide使用
    • Glide源码分析
    • RxJava
  • 插件化
    • 插件化框架
    • VirtualAPK分析
  • 依赖注入
  • 开源库
    • EventBus源码分析
    • Okio概览
    • Okio菜谱
    • Okio
    • OkHttp拦截器
    • OKHttp缓存
    • Okhttp源码分析
  • 集合
    • SparseArray
    • ArrayMap
  • 架构
  • Jetpack
    • databinding adapter
    • databinding坑
    • databinding源码分析
    • Android Data Binding: Let’s Flip This Thing
    • Untitled
    • Lifecycle源码分析
    • ViewModel源码分析
    • LiveData源码分析
  • 音频和视频
    • CameraX使用
    • ExoPlayer
    • GsyVideoPlayer
  • 性能优化
    • 崩溃优化
    • 内存优化
      • LeakCanary如何工作
    • 渲染优化
    • 电池优化
    • 启动优化
    • 网络优化
    • 安装包大小优化
  • NDK开发
  • 系统源码分析
    • Android源码下载
    • Android系统启动
      • init进程启动过程
      • Zygote进程启动过程
      • Zygote进程启动流程
      • SystemServer处理过程
    • 应用程序进程启动过程
      • 应用程序进程启动过程介绍
    • Window
    • WMS
    • WindowManagerService
    • 四大组件的工作过程
      • Activity启动流程分析
      • Activity启动流程
    • ActivityManagerService分析
    • Context详解
    • Binder原理
      • Binder驱动
      • 获取ServiceManager
      • 启动ServiceManager
      • Parcel源码分析
    • Android图形系统概述
    • Choreographer原理
    • Handler使用
    • Handler源码分析
  • 逆向
    • Android抓包
    • 网易云音乐逆向
由 GitBook 提供支持
在本页
  • WebView常用方法
  • WebChromeClient
  • WebView源码分析
  • 更多阅读
在GitHub上编辑
  1. 网络

WebView

WebView常用方法

  • public void loadUrl (String url)

    //打开本包内asset目录下的test.html文件
    loadUrl("file:///android_asset/test.html");
    //打开本地sd卡内的kris.html文件
    loadUrl("content://com.android.htmlfileprovider/sdcard/malinkang.html");
    //打开指定URL的html文件
    loadUrl("http://malinkang.com/");
    //使用loadUrl调用javascript方法
    loadUrl("javascript:test()");
    //调用javascript方法传入参数
    loadUrl("javascript:test(\"hello\")");

    有时候html可能需要从资源文件中加载图片

    <img src="file:///android_res/drawable/a.png">
  • loadData(String data, String mimeType, String encoding)

  • loadDataWithBaseURL(String baseUrl, String data, String mimeType, String encoding, String historyUrl)

//加载字符串 4.0+没有问题,2.3下乱码
loadData(htmlStr, "text/html;charset=utf-8",null);
//4.0+和2.3都没有问题
loadDataWithBaseURL(null, htmlStr,"text/html", "utf-8", null);
  • public String getTitle():获取当前页面的title

WebChromeClient

WebChromeClient是辅助WebView处理Javascript的对话框,网站图标,网站title等。常用方法如下:

  • public void onProgressChanged(WebView view, int newProgress) {}:告诉应用网页加载进度

WebView源码分析

//WebView的所有操作都是通过调用Provider相应的方法
private WebViewProvider mProvider;
//创建WebViewProvider
private void ensureProviderCreated() {
    checkThread();
    if (mProvider == null) {
        // As this can get called during the base class constructor chain, pass the minimum
        // number of dependencies here; the rest are deferred to init().
        mProvider = getFactory().createWebView(this, new PrivateAccess());
    }
}
//获取WebViewFactoryProvider
@UnsupportedAppUsage
private static WebViewFactoryProvider getFactory() {
    //内部通过反射获取WebViewFactoryProvider,不同的版本可能
   //创建不同的WebViewFactoryProvider,
    return WebViewFactory.getProvider();
}

WebViewFactory

//类的路径
private static final String CHROMIUM_WEBVIEW_FACTORY =
           "com.android.webview.chromium.WebViewChromiumFactoryProviderForQ";

5.0版本的WebView创建的WebViewFactoryProvider对象为WebViewChromiumFactoryProvider。

@Override
public WebViewProvider createWebView(WebView webView, WebView.PrivateAccess privateAccess) {
    //创建WebView内核
    WebViewChromium wvc = new WebViewChromium(this, webView, privateAccess);
    synchronized (mLock) {
        if (mWebViewsToStart != null) {
            mWebViewsToStart.add(new WeakReference<WebViewChromium>(wvc));
        }
    }
    return wvc;
}
@Override
public void addJavascriptInterface(final Object obj, final String interfaceName) {
    if (checkNeedsPost()) {
        //WebViewChromiumRunQueue
        mRunQueue.addTask(new Runnable() {
            @Override
            public void run() {
                addJavascriptInterface(obj, interfaceName);
            }
        });
        return;
    }
    Class<? extends Annotation> requiredAnnotation = null;
    if (mAppTargetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
       requiredAnnotation = JavascriptInterface.class;
    }
   //AwContents
    mAwContents.addPossiblyUnsafeJavascriptInterface(obj, interfaceName, requiredAnnotation);
}
    /**
     * @see ContentViewCore#addPossiblyUnsafeJavascriptInterface(Object, String, Class)
     */
    public void addPossiblyUnsafeJavascriptInterface(Object object, String name,
            Class<? extends Annotation> requiredAnnotation) {
        mContentViewCore.addPossiblyUnsafeJavascriptInterface(object, name, requiredAnnotation);
    }
   */
public void addJavascriptInterface(Object object, String name) {
    addPossiblyUnsafeJavascriptInterface(object, name, JavascriptInterface.class);
}
public void addPossiblyUnsafeJavascriptInterface(Object object, String name,
        Class<? extends Annotation> requiredAnnotation) {
    if (mNativeContentViewCore != 0 && object != null) {
        mJavaScriptInterfaces.put(name, new Pair<Object, Class>(object, requiredAnnotation));
        //本地方法
        nativeAddJavascriptInterface(mNativeContentViewCore, object, name, requiredAnnotation);
    }
}

更多阅读

上一页网络下一页OkHttp文档翻译

最后更新于3年前

WebViewChromiumFactoryProvider
https://github.com/pwnall/chromeview/blob/master/src/org/chromium/android_webview/AwContents.java
https://chromium.googlesource.com/chromium/src/+/9d343ad2ea6ec395c377a4efa266057155bfa9c1/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java
美团WebView性能、体验分析与优化
今日头条品质优化 - 图文详情页秒开实践
百度APP-Android H5首屏优化实践
WebView Api
Building Web Apps in WebView
WebView乱码解决
android webview js交互, 响应webview中的图片点击事件