当我们在Launcher中点击浏览器的图标时,浏览器的窗口会打开并显示主页(HomePage)。这里我们对这一场景进行分析,研究浏览器如何启动,取得缺省主页并将它布局和显示的。
乌拉特中ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!根据前边对WebView 类的学习,大概可以预期我们在主Activity的onCreate方法里从设置里面取得缺省主页的配置,创建一个WebView类,并使用setContentView将它添加到主窗口中。下面我们从浏览器的代码看看它是如何实现的。
首先,研究AndroidManifest文件,从
另外,该Apk的主Activity为BrowserActivity:
。。。
Apk的启动,首先是ApplicationBrowser类的onCreate方法,主要工作:
// create CookieSyncManager with current Context
CookieSyncManager.createInstance(this);
BrowserSettings.initialize(getApplicationContext());
Preloader.initialize(getApplicationContext());
这里涉及到三个工作:Cookie同步管理,浏览器设置和预加载。
然后是Activity的onCreate方法,与我们的研究相关的代码:
@Override public void onCreate(Bundle icicle) { if (LOGV_ENABLED) { Log.v(LOGTAG, this + " onStart, has state: " + (icicle == null ? "false" : "true")); } super.onCreate(icicle); mController = createController(); Intent intent = (icicle == null) ? getIntent() : null; mController.start(intent); }createController方法:
private Controller createController() { Controller controller = new Controller(this); boolean xlarge = isTablet(this); UI ui = null; if (xlarge) { ui = new XLargeUi(this, controller); } else { ui = new PhoneUi(this, controller); } controller.setUi(ui); return controller; }
主要的工作是Controller的创建,PhoneUi的创建和Controller的start。
Controller的构造方法主要涉及到以下几个相关类:
BrowserSettings
TabControl
CrashRecoveryHandler
UrlHandler
BrowserWebViewFactory
IntentHandler
PageDialogHandler
BookMarks的ContentObserver
NetworkStateHandler
SystemAllowGeolocationOrigins
IconDataBase
PhoneUi的构造:
BaseUi的构造:
FrameLayout frameLayout = (FrameLayout) mActivity.getWindow() .getDecorView().findViewById(android.R.id.content); LayoutInflater.from(mActivity) .inflate(R.layout.custom_screen, frameLayout); mFixedTitlebarContainer = (FrameLayout) frameLayout.findViewById( R.id.fixed_titlebar_container); mContentView = (FrameLayout) frameLayout.findViewById( R.id.main_content); mCustomViewContainer = (FrameLayout) frameLayout.findViewById( R.id.fullscreen_custom_content); mErrorConsoleContainer = (LinearLayout) frameLayout .findViewById(R.id.error_console);
Custom_screen的layout文件:
可以看出这个是浏览器主界面的布局,浏览器的布局已经准备好,后面我们创建的WebView应该是添加到main_content里面。
Controller 的start 方法执行了CrashRecoveryHandler的startRecovery().
CrashRecoveryHandler相关操作:
首先是initialize(),创建了CrashRecoveryHandler实例,CrashRecoveryHandler实例构造了foregroundHandler和backgroundHandler。
CrashRecoveryHandler的preloadCrashState方法,在backgroundHandler的处理中执行loadCrashState(),该方法将CrashState从STATE_FILE读入到mRecoveryState中。
CrashRecoveryHandler的startRecovery方法,调用Controller的doStart()。
Controller的doStart方法调用onPreloginFinished().
currentTabId is -1, thenopenTabToHomePage().
openTabToHomePage
createNewTabthen loadUrl.
createNewTab的实现:
TabControl::createNewTab
createNewWebView:
new BrowserWebView;该类主要用来管理WebView滚动条事件。
initWebViewSettings;
setActiveTab
TabControl::setCurrentTab
PhoneUi::setActiveTab
attachTabToContentView
至此,我们看完Apk启动并加载HomePage的过程,简单总结如下:
1.浏览器实现了自己的Application类(Browser),在其onCreate方法中进行了一些初始化工作(Cookie同步管理,浏览器设置和预加载);
2.浏览器的主Activity是BrowserActivity,在其onCreate方法中构建了Controller和PhoneUi,并调用Controller::start方法启动Controller;
a)Controller在其构造方法中实例化和初始化一些协助对象,其中一个重要的类是CrashRecoveryHandler;
b)PhoneUi的构造方法加载custom_screen布局文件,并将它作为Activity窗口的ContentView.
c)Controller::start方法执行了CrashRecoveryHandler的startRecovery(),该方法又调用Controller的doStart()方法
i.Controller的doStart方法调用onPreloginFinished(),该方法执行openTabToHomePage,打开浏览器主页。具体将WebView加到ContentView的方法是BaseUi的attachTabToContentView方法。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。