zoukankan      html  css  js  c++  java
  • android Launcher——启动过程详解

    一LauncherApplication->onCreate
            --1.//设置最小堆内存4M
            --2.//建立应用图标缓存器
            --3.//建立LauncherModel
            --4.//注册Intent.ACTION_PACKAGE_ADDED,Intent.ACTION_PACKAGE_REMOVED,Intent.ACTION_PACKAGE_CHANGED事件监听器
                            LauncherModel作为广播接收器对上面3中事件进行监听
            --5.//添加对桌面favorites content provider 数据变化监听器
    二Launcher->onCreate
            --1.获取LauncherApplication LauncherModel mIconCache等LauncherApplication初始化的对象
            --2.新建拖放控制器new DragController(this)
            --4.//获取桌面组件管理器,启动桌面组件host
                    --待深入研究
            --5.//从array.hotseats中加载所有的hotseats(热键 如挂机按钮,google浏览器)
                    --待深入研究
            --6.从launcher.preferences加载本地设置
            --7.//设置壁纸尺寸宽度=display.getWidth()* WALLPAPER_SCREENS_SPAN,高度=display.getHeight()
            --8.//加载布局文件
            --9.//初始化所有控件
            --10.//从Bundle savedInstanceState获取桌面持久化数据 设置mRestoring = true;
            --11.如果mRestoring == false,调用LauncherModel加载桌面项 mModel.startLoader(this, true,isLanguageChange);
                    --a.LauncherModel.Loader.startLoader() 代码同步处理
                    --b.新建LauncherModel.Loader.LoaderThread线程并启动线程(桌面项加载,详细见第三步)
            --12.注册Intent.ACTION_CLOSE_SYSTEM_DIALOGS广播监听
    三 桌面项加载 LauncherModel.Loader.LoaderThread.run:新线程执行
            --1.等待主线程运行结束才开始加载
            --2.判断是否先加载桌面;loadWorkspaceFirst = cbk != null ? (!cbk.isAllAppsVisible()) : true;
            --3.loadWorkspaceFirst==true
                    --a.loadAndBindWorkspace()
                            --loadWorkspace():从数据库launcher.db中查询中所有桌面项构造对应类型的ItemInfo对象存入
                            mItems,mAppWidgets,mFolders列表。
                            --bindWorkspace():
                                    --1.laucher.startBinding(),异步调用,在主线程中handle
                                            //do no things
                                    --2.laucher.bindItems(),异步调用,在主线程中handle
                                            --1.根据ItemInfo对象创建桌面图标view对象
                                            --2.获取item.screen, item.cellX, item.cellY, spanX, spanY,
                                                            调用workspace.addInScreen添加到对应桌面的cell
                                                    --1.重新设置桌面图标view 的layoutparam(类型为cellLayout.layoutparam)
                                                    --2.根据item.screen获取桌面的celllayout对象,也就是workspace下5个用户桌面中的一个
                                                    --3.调用celllayout.addview方法把桌面图标view对象添加为celllayout的child,也就是为用户桌面添加一个桌面图标
                                                    --4.桌面图标view对象添加OnLongClickListener=laucher,由laucher负责监听桌面图标view的longclick事件
                                                    --5.如果桌面图标是DropTarget对象,拖放控制器mDragController添加该view到拖放目的地列表
                                    --3.laucher.bindFolders(),异步调用,在主线程中handle
                                            //launcher.mFolders.putAll(mFolders);
                                    --4.laucher.bindAppWidget(),异步调用,在主线程中handle
                                            --1.获取LauncherAppWidgetInfo的appWidgetId
                                            --2.获取AppWidgetProviderInfo appWidgetInfo mAppWidgetManager.getAppWidgetInfo(appWidgetId)
                                            --3.根据appWidgetInfo创建桌面组件的view AppWidgetHostView对象
                                            --4.调用workspace.addInScreen添加到对应桌面的cell                                       
                                    --5.laucher.finishBindingItems(),异步调用,在主线程中handle
                                            --mWorkspaceLoading=false     
                    --b.loadAndBindAllApps();
                            如果没有加载apps或者改变了语言设置
                            loadAllAppsByBatch();
                                    --1.//设置package 查询条件Intent.ACTION_MAIN Intent.CATEGORY_LAUNCHER
                                    --2.//清空mAllAppsList mAllAppsList.clear();
                                    --3.//packageManager 查询所有应用pakages
                                    --4.分批次mAllAppsList.add 应用pakages
                                    --5.laucher.bindAllApplications()//异步调用
                                            --mAllAppsGrid.setApps(apps)
                                    --6.若分多个批次加载 laucher.bindAppsAdded()//异步调用
                                            --mAllAppsGrid.addApps(apps);
                            否则
                            onlyBindAllApps();
                                    --1.mAllAppsList.data.clone();
                                    --2.laucher.bindAllApplications()//异步调用
                                            --mAllAppsGrid.setApps(apps)
            --4.loadWorkspaceFirst==false
                    --a.loadAndBindAllApps();                       
                    --b.loadAndBindWorkspace();

    原文:http://blog.csdn.net/stonecao/article/details/6536083

  • 相关阅读:
    生产者-消费者模式
    Java中数字操作
    Java中的装箱拆箱
    Java中的匿名类
    JAVA中抽象类的一些总结
    JAVA继承时this和super关键字
    elasticsearch查询
    elasticsearch的映射
    kibana——es的批量操作
    kibana简单使用——elaticsearch的文档,索引的CRUD操作
  • 原文地址:https://www.cnblogs.com/xiaoxiaoboke/p/2342906.html
Copyright © 2011-2022 走看看