Android Launcher源码分析(一)

最近开始看Android Launcher源码,对一些关键类进行整理,想和大家分享一下。
关于Launcher布局、自定义布局属性等,以下博文已经进行详细的介绍,我就不再展开了,在此分享链接,感谢“stevenhu_223"的分享。
Launcher源码浅析-----Launcher布局
Launcher源码浅析-----Launcher自定义布局属性
Launcher源码浅析-----Launcher启动时的资源加载
Launcher源码浅析-----涉及Workspace界面资源加载重要类和资源文件简介

LauncherApplication类
在Launcher启动时,会先去加载LauncherApplication类,主要是对CacheDB(Widget预览缓存DB)、IconCache(Icon缓存类)、launcherModel(资源加载工作类)、LauncherProvider(数据共享类)的初始化,以及对Package添加、删除、改变等注册监听,代码如下:
public void onCreate() {
        super.onCreate();
        ......
        mWidgetPreviewCacheDb = new WidgetPreviewLoader.CacheDb(this );
        mIconCache = new IconCache(this);
        mModel = new LauncherModel(this, mIconCache);
         // 注册接收器
        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_ADDED );
        filter.addAction(Intent. ACTION_PACKAGE_REMOVED);
        filter.addAction(Intent. ACTION_PACKAGE_CHANGED);
        filter.addDataScheme( "package");
        registerReceiver( mModel, filter);
        ......
         // Register for changes to the favorites
        ContentResolver resolver = getContentResolver();
        resolver.registerContentObserver(LauncherSettings.Favorites.CONTENT_URI, true,
                mFavoritesObserver);
    }

    //当数据改变时,会重新加载workspace
private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler()) {
        @Override
        public void onChange(boolean selfChange) {
            mModel.resetLoadedState( false, true );
            mModel.startLoaderFromBackground();
        }
    };

Launcher类
Launcher是Activity类型,我们可以重点看下oncreate()函数的执行流程:
protected void onCreate(Bundle savedInstanceState) {
        ......
        super.onCreate(savedInstanceState);
        LauncherApplication app = ((LauncherApplication)getApplication());
        mModel = app.setLauncher( this);//设置资源加载工作类
        mIconCache = app.getIconCache();//获取Icon缓存类
        mDragController = new DragController(this); //初始化拖拽控制类
         mAppWidgetManager = AppWidgetManager.getInstance(this); //初始化App小工具管理类
        mAppWidgetHost = new LauncherAppWidgetHost(this, APPWIDGET_HOST_ID);
        mAppWidgetHost.startListening();//开始监听 App Widget的改变,当你的activity开始显示的时候,被调用
        ......
        checkForLocaleChange(); //检测本地语言是否改变
        setContentView(R.layout. launcher);//加载视图
        setupViews(); //初始化视图
        showFirstRunWorkspaceCling(); //显示第一次运行workspace的指引
        registerContentObservers(); //注册收藏夹监听器
        lockAllApps();
        restoreState( mSavedState);//如果存在,还原之前的状态,包括屏幕状态,屏幕页数
        //在还原之前的状态之后,更新自定义抽屉
        if (mAppsCustomizeContent != null) {
            mAppsCustomizeContent.onPackagesUpdated(
                LauncherModel.getSortedWidgetsAndShortcuts( this));
        }
         if (!mRestoring ) {
            if (sPausedFromUserAction ) {
               //如果用户离开Launcher,当他们返回时,我们将只异步加载items
                mModel.startLoader( true, -1);
            } else {
               //如果用户翻转(或者触发设置改变),当launcher在前台,我们仅仅异步加载这个页面
                mModel.startLoader( true, mWorkspace.getCurrentPage());
            }
        }
        //如果所有的App没有被加载完成,显示进度条
        if (!mModel .isAllAppsLoaded()) {
            ViewGroup appsCustomizeContentParent = (ViewGroup) mAppsCustomizeContent .getParent();
            mInflater.inflate(R.layout.apps_customize_progressbar, appsCustomizeContentParent);
        }
        IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS );
        //注册关闭系统Dialog接收器
        registerReceiver( mCloseSystemDialogsReceiver, filter);
        //更新全局icon
        updateGlobalIcons();
         //在界面中,我们希望基于目前的方向屏幕自动选择
        unlockScreenOrientation( true);
    }


你可能感兴趣的:(Android Launcher源码分析(一))