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

免责声明:文章转载自《android Launcher——启动过程详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇plsql的技巧之显示最近打开的文件ABAP 上传图片下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

多线程编程5种方法实现线程同步

1:用Interlocked系列函数实现线程同步; 2:用CRITICAL_SECTION及其系列函数实现线程同步; 3:用RTL_SRWLOCK及其系列函数实现线程同步; 4:用事件内核对象实现线程同步; 5:用信号量内核对象实现线程同步;   1:用Interlocked系列函数实现线程同步实例如下: //旋转锁 #include <iostre...

log4cplus使用(三)-日志重定向

本文讲述的是log4cplus日志输出到qt widget,封装了serverSocket。     log4cplus支持用户自定义输出设备,只需要继承自Appender,或者Appender子类,并实现append成员方法,然后在 log4cplus初始化成功之后,把自定义输出设备添加到logger中,当用户向logger中输出信息时,logger会遍...

浅谈java中线程和操作系统线程

  在聊线程之前,我们先了解一下操作系统线程的发展历程,在最初的时候,操作系统没有进程线程一说,执行程序都是串行方式执行,就像一个队列一样,先执行完排在前面的,再去执行后面的程序,这样的话很多程序的响应就很慢,而且有些程序是io型操作居多,很多时间都在等待中浪费了,这时候进程应运而生,现在面试的都知道进程是资源管理的最小单位,线程是cpu调度的最小单位(其...

ios基础笔试题-集锦二

前言 下文转载自:http://www.henishuo.com/objc-interview-two/ 1、即时聊天App不会采用的网络传输方式 A. UDP B. TCP  C. HTTP  D. FTP FTP:是文件传输协议,是File Transfer Protocol的简称,它的作用是用于控制互联网上文件的双向传输,因此一定不会是即时聊天使用的...

Android SurfaceView

一、SurfaceView简介SurfaceView可以在主线程之外的线程中向屏幕绘图上。这样可以避免画图任务繁重的时候造成主线程阻塞,从而提高了程序的反应速度。在游戏开发中多用到SurfaceView,游戏中的背景、人物、动画等等尽量在画布canvas中画出。什么是Surface在这里要先说说什么是Surface。简单的说Surface对应了一块屏幕缓冲...

虚拟化技术实现 — KVM 的 CPU 虚拟化

目录 文章目录 目录 前文列表 x86 体系结构的虚拟化 硬件辅助的 CPU 虚拟化 由 VMX 切换支撑的 CPU 虚拟化技术 KVM 的 CPU 虚拟化实现 vCPU 的调度方式 客户机 CPU 拓扑和模型 虚拟机 vCPU 数量分配原则 总结 参考文档 前文列表 《虚拟化技术实现 — 虚拟化技术发展编年史》《虚拟化技术实现 — QEMU-...