手机程序员常说的webview到底是个啥东西

好像安卓和IOS程序员最常说的关于他们专业的名词就是webview,但是这个webview到底是个啥玩意?

先从安卓程序员用的webview入手,就几个webview的函数

WebView.loadUrl("http://www.ltplayer.com");// 加载url,也可以执行js函数
  WebView.setWebViewClient(new SafeWebViewClient());// 设置 WebViewClient 
  WebView.setWebChromeClient(new SafeWebChromeClient());// 设置 WebChromeClient
  WebView.onResume();
  WebView.resumeTimers();
  WebView.onPause();
  WebView.pauseTimers();
  WebView.stopLoading();// 停止当前加载
  WebView.clearMatches();
  WebView.canGoBack();
  WebView.clearSslPreferences();
  WebView.clearCache(true);方也会使用到。该方法接受一个参数,从命名即可看出作用。若设为false,则只清空内存里的资源缓存,而不清空磁盘里的。
  WebView.loadUrl("about:blank");
  WebView.removeAllViews();//
  WebView.destroy();// 生命周期销毁

java程序员不陌生,这个就是安卓上的一些webview的操作。

不过,webview作为webkit的一种调用,它一定是使用了webkit,但它具体在webkit中是如何调用的呢?

其实要弄明白这事情,就需要看webkit源码了。

打开webkit源代码D:\WebKit\Source\WebKit\文件夹,你会看到里面有很多,不同平台的名字,win、wince、qt、gtk、blackberry…很多,随便打开个看看,从文件结构上去看,基本上差不了多少,从名字也上也能分析出来,这个是不同平台下使用的东西,选择一个文件夹进入,win代表windows,平常多用windows,所以看这个,比较好理解。

进入win以后,你会看到有很多的文件,非常多,但仔细看,你就会发现一个叫WebView.cpp,WebView.h,这个就是传统意义上的webview,打开文件看看,会发现有一些方法在C++的定义中是存在的,比如stopLoading

RESULT STDMETHODCALLTYPE WebView::stopLoading( 
        /* [in] */ IUnknown* /*sender*/)
{
    if (!m_mainFrame)
        return E_FAIL;

    return m_mainFrame->stopLoading();
}

比如和destroy对应的close

HRESULT STDMETHODCALLTYPE WebView::close()
{
    if (m_didClose)
        return S_OK;

    m_didClose = true;

#if USE(ACCELERATED_COMPOSITING)
    setAcceleratedCompositing(false);
#endif

    WebNotificationCenter::defaultCenterInternal()->postNotificationName(_bstr_t(WebViewWillCloseNotification).GetBSTR(), static_cast<IWebView*>(this), 0);

    if (m_uiDelegatePrivate)
        m_uiDelegatePrivate->webViewClosing(this);

    removeFromAllWebViewsSet();

    if (m_page) {
        if (Frame* frame = m_page->mainFrame())
            frame->loader()->detachFromParent();
    }

    if (m_mouseOutTracker) {
        m_mouseOutTracker->dwFlags = TME_CANCEL;
        ::TrackMouseEvent(m_mouseOutTracker.get());
        m_mouseOutTracker.clear();
    }

不过你会发现,即使叫webview但实际上在webview.cpp中也有很多方法是找不到的,比如setWebChromeClient,在webview中没有关于他的C++函数存在,这个时候就有两种可能,一,名字不同java二次封装时改变了原有名称。二,它并不再webview里定义。

所以,在继续找找。。。

你会发现在WebCoreSupport文件夹下有个叫WebChromeClient.cpp的文件

WebChromeClient::WebChromeClient(WebView* webView)
   76      : m_webView(webView)
   77  #if ENABLE(NOTIFICATIONS)
   ..
   81  }

对,这个就是setWebChromeClient,只不过是在win平台上的在安卓平台上,有一个和他差不多的文件存在。在继续找找其他的方法定义

stopLoading定义在WebFrame.cpp中

HRESULT STDMETHODCALLTYPE WebFrame::stopLoading( void)
{
    if (Frame* coreFrame = core(this))
        coreFrame->loader()->stopAllLoaders();
    return S_OK;
}

还有关于历史记录的操作定义在WebHistory中,关于缓存的操作定义在WebCache里。继续找下去,所有的webview调用的方法都能在不同平台的响应文件中找到。

总上所述,其实webview并不是安卓或者IOS独有的东西,webview就是个对不同平台开放的webkit有API,也包括对Ios和安卓,他定义了在不同平台下的操作方式,以及不同平台下,不同的特性,比如在win平台下利用createwindow来创建窗口,用消息方式来处理各种交互等