- public void onCreate(Bundle icicle) {
- super.onCreate(icicle);
- if (IntentHandler.handleWebSearchIntent(this, null, getIntent())) {
- finish();
- return;
- }
- mController = new Controller(this, icicle == null);
- boolean xlarge = isTablet(this);
- if (xlarge) {
- mUi = new XLargeUi(this, mController);
- } else {
- mUi = new PhoneUi(this, mController);
- }
- mController.setUi(mUi);
- Bundle state = getIntent().getBundleExtra(EXTRA_STATE);
- if (state != null && icicle == null) {
- icicle = state;
- }
- mController.start(icicle, getIntent());
2、根据当前设备是 phone还是pad 初始化了 I,
3. 把mUI传给 mController,让Controller 持有UI的引用以便后面可以操作 UI。
再稍微往下看两步,看看 controller和UI 里面有什么。Controller的构造函数 :
- public Controller(Activity browser, boolean preloadCrashState) {
- mActivity = browser;
- mSettings = BrowserSettings.getInstance();
- mTabControl = new TabControl(this);
- mSettings.setController(this);
- ……….省略了无关代码
- mFactory = new BrowserWebViewFactory(browser);
- ……..省略了无关代码
- }
- void start(final Bundle icicle, final Intent intent) {
- boolean noCrashRecovery = intent.getBooleanExtra(NO_CRASH_RECOVERY, false);
- if (icicle != null || noCrashRecovery) {
- doStart(icicle, intent, false);
- } else {
- mCrashRecoveryHandler.startRecovery(intent);
- }
- }
- GoogleAccountLogin.startLoginIfNeeded(mActivity,
- new Runnable() {
- @Override public void run() {
- onPreloginFinished(icicle, intent, currentTabId, restoreIncognitoTabs,
- fromCrash); } });
- private void onPreloginFinished(Bundle icicle, Intent intent, long currentTabId,
- boolean restoreIncognitoTabs, boolean fromCrash) {
- //省略了暂时无关的代码
- if (currentTabId == -1) {
- Tab t = null;
- if (urlData.isEmpty()) {
- t = openTabToHomePage();// 没有url就打开主页
- } else {
- t = openTab(urlData);// 打开传过来的 url
- }
- } else {
- }
- }
- public void loadUrl(String url, Map<String, String> headers) {
- if (mMainView != null) {
- mPageLoadProgress = INITIAL_PROGRESS;
- mInPageLoad = true;
- mCurrentState = new PageState(mContext, false, url, null);
- mWebViewController.onPageStarted(this, mMainView, null);
- mMainView.loadUrl(url, headers);
- }
- }
- public void loadUrl(String url, Map<String, String> additionalHttpHeaders) {
- checkThread();
- loadUrlImpl(url, additionalHttpHeaders);
- }
- private void loadUrlImpl(String url, Map<String, String> extraHeaders) {
- switchOutDrawHistory();
- WebViewCore.GetUrlData arg = new WebViewCore.GetUrlData();
- arg.mUrl = url;
- arg.mExtraHeaders = extraHeaders;
- mWebViewCore.sendMessage(EventHub.LOAD_URL, arg);// 要注意这个 TAG。
- clearHelpers();
- }
- case LOAD_URL: {
- CookieManager.getInstance().waitForCookieOperationsToComplete();
- GetUrlData param = (GetUrlData) msg.obj;
- loadUrl(param.mUrl, param.mExtraHeaders);
- break;
- }
- private void loadUrl(String url, Map<String, String> extraHeaders) {
- if (DebugFlags.WEB_VIEW_CORE) Log.v(LOGTAG, " CORE loadUrl " + url);
- mBrowserFrame.loadUrl(url, extraHeaders);
- }
- public void loadUrl(String url, Map<String, String> extraHeaders) {
- mLoadInitFromJava = true;
- if (URLUtil.isJavaScriptUrl(url)) {
- stringByEvaluatingJavaScriptFromString(
- url.substring("javascript:".length()));
- } else {
- nativeLoadUrl(url, extraHeaders);
- }
- mLoadInitFromJava = false;
- }
- { "nativeLoadUrl", "(Ljava/lang/String;Ljava/util/Map;)V", (void*) LoadUrl },
那么到这里小结一下,对 framework层的browser ,我们要重点关注 webview.java、CallBackproxy.java 、BrowserFrame.java、 WebCoreFrameBridge这几个类,其它类暂时还没注意到,肯定还有漏网之鱼,不过先把这几个主线类抓住再说,细节的东西慢慢来。
本文的故事也到此结束,要说明的上面的只是对android原生浏览器 java部分代码调用流程的简单分析,事实上应用层代码功能更偏向对网页( webview)的管理和显示,与webkit本身没有太多的联系,如果只是对 webkit感兴趣,只看下webkit部分是完全可以的,当然它的代码规模还比较大,要花些时间去理解。