Android学习历程--Launcher整体加载流程总结

来源:互联网 发布:湖南云计算先电杯 编辑:程序博客网 时间:2024/06/06 00:20

本文为自己学习思路的总结若有需要或整理详细代码及细节


一、进入  LauncherApplication -> LauncherAppState -> 进行初始化环境(通过传递sContext)、进行事件监听&&初始化一些环境例如:横竖屏、当局语言、像素密度、小部件和快捷图标数据库操作对象、应用图标缓存对象、初始化LauncherMode等。



二、在初始化过后,从Launcher的Oncreate方法入手。

    1.LauncherCallbacks -> LauncherExtention() Launcher扩展功能 :此时不需要

             设置了LauncherProviderChangeListener监听,用来监听LauncherProvider中数据变化,该监听接口在Launcher中实现。
             LauncherProvider:继承自ContentProvider(),主要是建立一个数据库来存放HomeScreen中的数据信息,并通过内容提供者来实现其他应用对             launcher中数据的访问和操作。重写了ContentProvider()中的方法:
             注:在我所看到的MTK的代码中该方法为空(表示很懵逼)

    2.checkForLocaleChange(); 检查Locale当局的变化 

    3.setContentView(R.layout.launcher) 加载布局(分为横屏land和竖屏port)

    4.setupViews();// 获取控件并初始化

    5.registerContentObservers();// 注册内容观察者,AppWidgetResetObserver,监听AppWidget是否重置,以便做出响应的处理

    6.mModel.startLoader()//异步加载桌面的应用快捷图标、小部件和所有应用图标

        startLoader在LauncherModel中实现
           执行LoaderTask线程的run()方法(在LauncherModel中)分为两步

               第一步加载和绑定workspace--loadAndBindWorkspace    

                   1.loadWorkspace

                       1)初始化后面要用到的对象实例
                       2)LauncherAppState.getLauncherProvider().loadDefaultFavoritesIfNecessary();  加载默认配置 
                       3)读取数据库,获取需要加载的应用快捷方式和AppWidget 
                         整个读取的过程是在一个同步代码块中,在此之前我们先看几个重要的全局变量,
                        sBgWorkspaceItems--保存ItemInfo
                        sBgAppWidgets--保存AppWidget
                        sBgFolders--存放文件夹
                        sBgItemsIdMap--保存ItemInfo和其Id
                        sBgDbIconCache--应用图标
                        sBgWorkspaceScreens--保存Workspace
                         a)遍历cursor,读取每一个app信息,根据itemType不同类型,分类保存到刚才的几个变量中。分这几种类型:ITEM_TYPE_APPLICATION、ITEM_TYPE_SHORTCUT、ITEM_TYPE_SHORTCUT、                                      ITEM_TYPE_APPWIDGET
                         b)读取完数据库之后,将需要移除和更新的item进行移除和更新;
                         c)读取workspace screen数据库信息,如果有未使用过的则将其从数据库中移除。

                   2.bindWorkspace

                       1)不直接使用上面提到的几个全局变量,重新定义局部变量来处理
                       2)根据item中的screenID将items分成当前screen和其他screen,并进行排序
                       3)runnable执行块,告诉workspace要开始绑定items了,startBinding方法在Launcher中实现,做一些清除工作   startBinding()
                       4)绑定workspace screen    bindWorkspaceScreens(oldCallbacks, orderedScreenIds);
                       5)Workspace绑定完成之后,就是将items、widgets和folders放到上面去    bindWorkspaceItems()
                           a)批量加载itmes
                                回调到Launcher的bindItems方法
                                根据item的类型,分别加载,首先获取item信息,创建快捷图标,然后将快捷图标放置到指定位置  addInScreenFromBind()
                                先获取快捷图标的父视图,分Hotseat和Desktop;设置布局参数,确定快捷图标放置的位置;父视图将快捷图标添加到指定位置,  addViewToCellLayout()
                                最后设置触摸反馈和长安监听以及拖拽对象的添加。
                           b)加载folder
                                回调Launcher的bindFolders方法   bindFolders()
                           c)加载widget
                                回调到Launcher的bindAppWidget方法  bindAppWidget()    
                                最后通知items的绑定完成    finishBindingItems()

               第二步:loadAndBindAllApps

                   1.获取需要显示到Launcher中的app列表,创建app图标     loadAllApps()

                   2.绑定app--       bindAllApplications()将已安装的app加载到AllAppContainerView上显示,当点击HotSet中AllApp图标时就显示出来了。

                          1)syncPages  是一个抽象方法,在AppsCustomizePagedView中实现

                                  a)生成AppsCustomizeCellLayout对象
                                  b)setupPage,设置page
                                  c)addView,将CellLayout添加到page中

                          2)重新测量,设置当前页等     measure()

                          3)loadAssociatedPages

                                  先清除不需要加载的pages,然后加载page及items--syncPageItems,也是一个抽象方法在AppsCustomizePagedView中实现,先计算需要放置的位置,然后创建BubbleTextView实例,最后                                  将其添加到page中。整个setApps的过程还是非常长的,最终目的就是将app显示到所有app列表中。接着会执行onPackagesUpdated,package的更新操作,就不再展开了。Widget也是类似                                  的
                   加载allapp的过程就结束了

三、showFirstRunClings()  展示第一次引导View

四、Launcher.java其他生命周期方法。

1 0
原创粉丝点击