Launcher3源码分析 — 启动过程

转自:Launcher3源码分析 — 启动过程

1.执行Application的onCreate方法
在Main Activity执行之前会先执行Application类的onCreate方法,通过LauncherAppState.getInstance()实例化LauncherAppState。

public class LauncherApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        LauncherAppState.setApplicationContext(this);
        LauncherAppState.getInstance();
    }
}

LauncherAppState用于存储全局变量,比如缓存(各种cache),维护内存数据的类(LauncherModel),下面是LauncherAppState的类结构

这里写图片描述

  • auncherModel:用于维护Launcher在内存中的数据,比如app信息列表和widget信息列表,同时提供了更新数据库的操作
  • IconCache:应用程序icon和title的缓存
  • mWidgetPreviewCacheDb:存储widget预览信息的数据库
  • LauncherProvider:app和widget的ContentProvider,用数据库存储信息

以上这些类都是与数据存储相关,创建这些类的消耗是巨大的,因为里面要维护大量数据,会占用很多内存,同时这些类在应用中只需要有一个实例,所以我们可以统一在一个地方(LauncherAppState)对这些类实例化,并在其他地方通过get方法获取相应的实例引用。LauncherAppState.getInstance()方法实例化了以上的数据,同时对Launcher中使用到的Receiver和Observer进行了注册。

        // set sIsScreenXLarge and mScreenDensity *before* creating icon cache
        mIsScreenLarge = isScreenLarge(sContext.getResources());
        mScreenDensity = sContext.getResources().getDisplayMetrics().density;

        mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(sContext);
        mIconCache = new IconCache(sContext);

        mAppFilter = AppFilter.loadByName(sContext.getString(R.string.app_filter_class));
        mModel = new LauncherModel(this, mIconCache, mAppFilter);

        // Register intent receivers
        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED);
        filter.addAction(Intent.ACTION_PACKAGE_REMOVED);
        filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
        filter.addDataScheme("package");
        sContext.registerReceiver(mModel, filter);
        ......
        // Register for changes to the favorites
        ContentResolver resolver = sContext.getContentResolver();
        resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,
                mFavoritesObserver);

2.执行Launcher的onCreate()

在执行完Application的onCreate方法后,接下来就开始执行Launcher(Main Activity)的onCreate()方法。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ......

        // 初始化UI控件,并对控件进行动态布局
        setupViews();
        grid.layout(this);

        ......

        // 数据加载
        if (!mRestoring) {
            if (sPausedFromUserAction) {
                // If the user leaves launcher, then we should just load items asynchronously when
                // they return.
                mModel.startLoader(true, -1);
            } else {
                // We only load the page synchronously if the user rotates (or triggers a
                // configuration change) while launcher is in the foreground
                mModel.startLoader(true, mWorkspace.getCurrentPage());
            }
        }

        ......
    }

在Launcher类的onCreate()中进行了ui控件的初始化和显示数据的加载,在加载完成后mModel(LauncherModel)会回调相应的方法,Launcher(Activity)实现了这个回调接口,这样Launcher的UI就可以把加载到的数据显示出来了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值