Android Browser源码分析(一)Application初始化

来源:互联网 发布:绝地求生什么时候优化 编辑:程序博客网 时间:2024/06/03 22:46

Android自带的Browser应用是从Application开始启动的,Application的主要作用是初始化一些全局使用对象,在这里Application采用了单例模式,这些单例会从程序启动一直存在到程序结束,比较消耗内存。因此在采用全局初始化单例模式时因尽量少一些。

Browser.java:

public class Browser extends Application {     private final static String LOGTAG = "browser";    // Set to true to enable verbose logging.    final static boolean LOGV_ENABLED = false;    // Set to true to enable extra debug logging.    final static boolean LOGD_ENABLED = true;    @Override    public void onCreate() {        super.onCreate();        if (LOGV_ENABLED)            Log.v(LOGTAG, "Browser.onCreate: this=" + this);        // 创建当前上下文的CookieSyncManager        CookieSyncManager.createInstance(this);//实例化CookieManager,让浏览器使用CookieManager时使用同一个CookieManager。        BrowserSettings.initialize(getApplicationContext());//实例化浏览器偏好设置。        Preloader.initialize(getApplicationContext());//预加载,浏览器首次启动后激活,当浏览器后台运行再次被调用时提高加载速度。    }}

Application的代码比较简单,主要对三个对象进行了初始化,下面分别来看这三个类的作用:
CookieSyncManager:初始化浏览器全局的cookie,这是Android自带的一个Cookie类,主要对浏览器进行缓存处理。具体用法可参考官方文档;
BrowserSettings:初始化浏览器的偏好设置、帐号信息、UA标识等;
BrowserSettings.java(片段):

public class BrowserSettings implements OnSharedPreferenceChangeListener,        PreferenceKeys {    private BrowserSettings(Context context) {        mContext = context.getApplicationContext();        mPrefs = PreferenceManager.getDefaultSharedPreferences(mContext);//获取默认的偏好设置        mManagedSettings = new LinkedList<WeakReference<WebSettings>>();//WebView设置        mCustomUserAgents = new WeakHashMap<WebSettings, String>();//UA标识        BackgroundHandler.execute(mSetup);//载入浏览器配置    };    private Runnable mSetup = new Runnable() {        @Override        //根据虚拟机大小,设置网页缓存数目以及磁盘缓存。        public void run() {            DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();            mFontSizeMult = metrics.scaledDensity / metrics.density;            // the cost of one cached page is ~3M (measured using nytimes.com). For            // low end devices, we only cache one page. For high end devices, we try            // to cache more pages, currently choose 5.            if (ActivityManager.staticGetMemoryClass() > 16) {                mPageCacheCapacity = 5;            }            mWebStorageSizeManager = new WebStorageSizeManager(mContext,                    new WebStorageSizeManager.StatFsDiskInfo(getAppCachePath()),                    new WebStorageSizeManager.WebKitAppCacheInfo(getAppCachePath()));            // Workaround b/5254577            mPrefs.registerOnSharedPreferenceChangeListener(BrowserSettings.this);            if (Build.VERSION.CODENAME.equals("REL")) {                // This is a release build, always startup with debug disabled                setDebugEnabled(false);            }            if (mPrefs.contains(PREF_TEXT_SIZE)) {                /*                 * Update from TextSize enum to zoom percent                 * SMALLEST is 50%                 * SMALLER is 75%                 * NORMAL is 100%                 * LARGER is 150%                 * LARGEST is 200%                 */                switch (getTextSize()) {                case SMALLEST:                    setTextZoom(50);                    break;                case SMALLER:                    setTextZoom(75);                    break;                case LARGER:                    setTextZoom(150);                    break;                case LARGEST:                    setTextZoom(200);                    break;                }                mPrefs.edit().remove(PREF_TEXT_SIZE).apply();            }            sFactoryResetUrl = mContext.getResources().getString(R.string.homepage_base);            if (sFactoryResetUrl.indexOf("{CID}") != -1) {                sFactoryResetUrl = sFactoryResetUrl.replace("{CID}",                    BrowserProvider.getClientId(mContext.getContentResolver()));            }            synchronized (BrowserSettings.class) {                sInitialized = true;                BrowserSettings.class.notifyAll();            }        }    };}

PreLoader: 实现预加载,提高加载速度;
PreLoader.java(片段):

public class Preloader {private Preloader(Context context) {        mContext = context.getApplicationContext();        mHandler = new Handler(Looper.getMainLooper());        mSession = null;        mFactory = new BrowserWebViewFactory(context);    }}

代码中提到一个BrowserWebViewFactory类,在后面会具体分析这个类的作用;

以上就是Application启动后需要做的工作,代码比较简短,内容也比较简单;

0 0
原创粉丝点击