当前位置:   article > 正文

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

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();// 生命周期销毁
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

比如和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();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

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

所以,在继续找找。。。

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

WebChromeClient::WebChromeClient(WebView* webView)
   76      : m_webView(webView)
   77  #if ENABLE(NOTIFICATIONS)
   ..
   81  }
  • 1
  • 2
  • 3
  • 4
  • 5

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

stopLoading定义在WebFrame.cpp中

HRESULT STDMETHODCALLTYPE WebFrame::stopLoading( void)
{
    if (Frame* coreFrame = core(this))
        coreFrame->loader()->stopAllLoaders();
    return S_OK;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

本文同步发布于http://www.ltplayer.com/blog/2019/01/02/2019.01.02

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/97542
推荐阅读
相关标签
  

闽ICP备14008679号