赞
踩
好像安卓和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来创建窗口,用消息方式来处理各种交互等
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。