文档章节

Android Browser学习一 application的初始化

SuShine
 SuShine
发布于 2014/02/08 15:18
字数 828
阅读 1780
收藏 8
Android Browser 是一个非常好的学习资料, 使用了自己设计的MVC架构,来管理书签, 浏览器 等各个功能,有具有一定的稳定性,知道我们学习

Browser是从Application开始启动的,启动流程如下:



代码很简单:
01 public class Browser extends Application {
02  
03  
04     private final static String LOGTAG = "browser";
05      
06     // Set to true to enable verbose logging.
07     final static boolean LOGV_ENABLED = false;
08  
09  
10     // Set to true to enable extra debug logging.
11     final static boolean LOGD_ENABLED = true;
12  
13  
14     @Override
15     public void onCreate() {
16         super.onCreate();
17          if (LOGV_ENABLED)
18             Log.v(LOGTAG, "Browser.onCreate: this=" + this);
19  
20  
21         // create CookieSyncManager with current Context
22         //初始化cookie
23         CookieSyncManager.createInstance(this);
24         //在application 启动的时候实例化浏览器的配置BrowserSetting, 和 一下需要预先 载入的东西 Preloader等待以后调用
25         BrowserSettings.initialize(getApplicationContext());
26         Preloader.initialize(getApplicationContext());
27     }
28  
29  
30 }



主要功能是设置一些Debug的开关,初始化一下全局的模块,包括:CookieSyncManager, BrowserSettings ,PreLoader.

那么看一下他们分别是用来做什么的

CookieSyncManager: 初始化浏览器全局的cookie, 这是Android系统的类. 这个我们在做WebView开发的时候可能也用过.

Android通过使用这个类来实现Ram和硬盘中cookie的同步,提高了cookie的访问速度

具体使用参考 http://whao189.iteye.com/blog/1121865 

BrowserSettings :初始化浏览器的偏好设置, UA , WebView的设置 ,个人账户信息, 等

具体代码:


1 private BrowserSettings(Context context) {
2        mContext = context.getApplicationContext();
3        mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);//用来取xml的数据
4        mAutofillHandler = new AutofillHandler(mContext); //账户个人信息
5        mManagedSettings = new LinkedList<WeakReference<WebSettings>>();//WebView的设置
6        mCustomUserAgents = new WeakHashMap<WebSettings, String>(); //UA
7        mAutofillHandler.asyncLoadFromDb(); //异步载入个人信息
8        BackgroundHandler.execute(mSetup); //载入浏览器配置
9    }

有一个小点:根据dvm虚拟机的大小设置 内存缓存的网页数目 ,以及磁盘缓存

1 DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
2            mFontSizeMult = metrics.scaledDensity / metrics.density;
3            // the cost of one cached page is ~3M (measured using nytimes.com). For
4            // low end devices, we only cache one page. For high end devices, we try
5            // to cache more pages, currently choose 5.
6            //这是获取dvm的一个大体值 16m  24m 32m ...然后设置浏览器缓存多少网页
7            if (ActivityManager.staticGetMemoryClass() > 16) {
8                mPageCacheCapacity = 5;
9            }
1 //磁盘缓存空间
2             mWebStorageSizeManager = new WebStorageSizeManager(mContext,
3                     new WebStorageSizeManager.StatFsDiskInfo(getAppCachePath()),
4                     new WebStorageSizeManager.WebKitAppCacheInfo(getAppCachePath()));




将来BrowserSetting还会通过Controller和UI进行很多的交换,而且在Browser启动的时候是全局都要用到的,因此作出了全局唯一的单例


PreLoader: 如果Brower在后台,或者还在内存中,再次调用browser的时候就不会重新创建Webview等控件,提高启动的速度,主要是通过hold了一个含有webview的mSession,然后利用了application 部分内存不会轻易释放 来实现的. 具体后面会继续分析,

1 private Preloader(Context context) {
2       mContext = context.getApplicationContext();
3       mHandler = new Handler(Looper.getMainLooper());
4       mSession = null;
5       mFactory = new BrowserWebViewFactory(context);
6  
7   }

这样Application的启动就ok了

可以看到, 作者把一些App全局需要用到的东西放到了Application中初始化, 并且这些东西都是单例的,这一在app周期中他们将一直存在, 后面的组件只要调用getInstance就可以使用了.不过这里有个问题, 这些单例会占用app的内存直到app退出,所以全局初始化的东西应该尽量少一些.

© 著作权归作者所有

共有 人打赏支持
SuShine
粉丝 126
博文 571
码字总数 157486
作品 0
朝阳
后端工程师
私信 提问
加载中

评论(4)

Tic
Tic
感谢博主的文章
H
HarrySapper

引用来自“SuShine”的评论

4.1的源码 从android 源码中拿下来的
谢谢,我找到了~我还想看看chrome android 的源码,貌似现在还没开源?网上只有chromium的,不知道博主有没有研究过
SuShine
SuShine
4.1的源码 从android 源码中拿下来的
H
HarrySapper
博主,看到你的这个专栏我激动的要哭了。。。最近被浏览器搞得头大,真是柳暗花明了!
顺便弱弱的问一句,您这个browser项目源码git上有没有?谢谢~~~
Android Browser学习二 BrowserActivity 的初始化 --其他重要模块

BrowserActivity 是浏览器的核心Activity了, 是浏览器的入口, 但是他里面并没有出来很多复杂的逻辑, 只是实现一些android 系统对activity的回调. 这些逻辑交给了Controller来处理, 就让我们一...

SuShine
2014/02/08
0
0
AndroidManifest.xml配置文件选项详解

AndroidManifest.xml下的一些属性定义和用法: ---------------------------------------------------------------------------------------------------------------------------------- a......

xiahuawuyu
2012/05/22
0
0
android Manifest.xml选项

Manifest.xml下的一些属性定义和用法: ---------------------------------------------------------------------------------------------------------------------------------- android:a......

王州
2011/09/21
0
0
WP7和Android对比 - 执行模型和生命周期

对于开发过Android应用的WP7开发者来说,有了Android的基础理解Windows Phone应用程序的执行模型和生命周期就变得很轻松了,下面就应用的生命周期做简单的对比: 在Android应用中入口点是App...

鉴客
2012/02/24
356
0
Dev-Guide_Android Basics_What is Android?

我将从这里开始记录一些技术备份,笔记。先从android的docs资料开始。目前主要是翻译,为了怕误人子弟,附带英文原文。如果若有不幸浏览到的童鞋,欢迎你提出意见。 What is Android? Andro...

丁天又
2011/10/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

3.系统和内存架构

在设计程序或并发系统时,需要考虑不同的系统和内存架构风格。 支持并发的计算机系统体系结构 1972年,迈克尔弗林(Michael Flynn)给出了用于分类不同风格计算机系统体系结构的分类法。 该分类...

Eappo_Geng
25分钟前
4
0
今天的学习

1,getimagesize:获得目标图像的大小 2,image_type_to_extension:获得目标文件的后缀信息 3,imagealphablending:设定目标图像混色的模式 4,imagechar:水平的画出一个字符 5,imagecharup...

墨冥
28分钟前
1
0
Java线程中yield与join方法的区别

长期以来,多线程问题颇为受到面试官的青睐。虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用。...

飓风2000
52分钟前
4
0
Python的 is 和 == 弄懂了吗?

在Python中一切都是对象。 Python中对象包含的三个基本要素,分别是: id(身份标识) type(数据类型) value(值) 对象之间比较是否相等可以用 == ,也可以用 is 。 is 和 == 都是对对象进行比较...

上海小胖
52分钟前
2
0
angularJS 路由加载js controller 未定义 解决方案

说明 本文主要说明,在angularJS框架使用中,angularJS 路由加载js controller 未定义 解决方案。 路由 $routeProvider 异步加载js 路由的基本用法,请查看官方文档,下面实例只说明,懒加载...

DrChenXX
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部