• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

WebView 笔记

武飞扬头像
jiewin
帮助1

Android WebView的几个核心类(framework源码):

WebView 视图
WebViewClient WebView的回调类

WebViewProvider WebView的接口类

WebViewCore WebView核心类,持有 CallbackProxy 实例,通过mCallbackProxy回调到CallbackProxy
        WebCoreThread Web线程类
        EventHub

BrowserFrame -- Handler
CallbackProxy -- Handler

 
学新通

WebBackForwardList

web主框架加载栈(后退/前进列表),内部维护一个ArrayList<WebHistoryItem>

持有CallbackProxy,当列表增加、减少或当前索引改变时,进行回调

WebBackForwardList.setClearPending() 将后退/前进列表标记为具有挂起清除

WebView.loadUrl() 代码

  1.  
    public void loadUrl(String url) {
  2.  
    checkThread();
  3.  
    loadUrlImpl(url);
  4.  
    }
  5.  
     
  6.  
    private void loadUrlImpl(String url) {
  7.  
    if (url == null) {
  8.  
    return;
  9.  
    }
  10.  
    loadUrlImpl(url, null);
  11.  
    }
  12.  
     
  13.  
    public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
  14.  
    checkThread();
  15.  
    loadUrlImpl(url, additionalHttpHeaders);
  16.  
    }
  17.  
     
  18.  
    private void loadUrlImpl(String url, Map<String, String> extraHeaders) {
  19.  
    switchOutDrawHistory();
  20.  
    WebViewCore.GetUrlData arg = new WebViewCore.GetUrlData();
  21.  
    arg.mUrl = url;
  22.  
    arg.mExtraHeaders = extraHeaders;
  23.  
    mWebViewCore.sendMessage(EventHub.LOAD_URL, arg);
  24.  
    clearHelpers();
  25.  
    }
学新通

WebViewCore中Handler的handleMessage:

  1.  
    @Override
  2.  
    public void handleMessage(Message msg) {
  3.  
    ...
  4.  
    case LOAD_URL: {
  5.  
    CookieManager.getInstance().waitForCookieOperationsToComplete();
  6.  
    GetUrlData param = (GetUrlData) msg.obj;
  7.  
    loadUrl(param.mUrl, param.mExtraHeaders);
  8.  
    break;
  9.  
    }
  10.  
    ...
  11.  
    }
  12.  
     
  13.  
    private void loadUrl(String url, Map<String, String> extraHeaders) {
  14.  
    if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, " CORE loadUrl " url);
  15.  
    mBrowserFrame.loadUrl(url, extraHeaders);
  16.  
    }
  17.  
    }
学新通

BrowserFrame中的loadUrl

  1.  
    /**
  2.  
    * Load a url from the network or the filesystem into the main frame.
  3.  
    * Following the same behaviour as Safari, javascript: URLs are not passed
  4.  
    * to the main frame, instead they are evaluated immediately.
  5.  
    * @param url The url to load.
  6.  
    * @param extraHeaders The extra headers sent with this url. This should not
  7.  
    * include the common headers like "user-agent". If it does, it
  8.  
    * will be replaced by the intrinsic value of the WebView.
  9.  
    */
  10.  
    public void loadUrl(String url, Map<String, String> extraHeaders) {
  11.  
    mLoadInitFromJava = true;
  12.  
    if (URLUtil.isJavaScriptUrl(url)) {
  13.  
    // strip off the scheme and evaluate the string
  14.  
    stringByEvaluatingJavaScriptFromString(
  15.  
    url.substring("javascript:".length()));
  16.  
    } else {
  17.  
    nativeLoadUrl(url, extraHeaders);
  18.  
    }
  19.  
    mLoadInitFromJava = false;
  20.  
    }
学新通

loadUrl中直接调用native层代码,

        如果是js,走stringByEvaluatingJavaScriptFromString()

        否则走:nativeLoadUrl()

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbkfeg
系列文章
更多 icon
同类精品
更多 icon
继续加载