zoukankan      html  css  js  c++  java
  • launcher 启动过程

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

    一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();

  • 相关阅读:
    利用相关的Aware接口
    java 值传递和引用传递。
    权限控制框架Spring Security 和Shiro 的总结
    优秀代码养成
    Servlet 基础知识
    leetcode 501. Find Mode in Binary Search Tree
    leetcode 530. Minimum Absolute Difference in BST
    leetcode 543. Diameter of Binary Tree
    leetcode 551. Student Attendance Record I
    leetcode 563. Binary Tree Tilt
  • 原文地址:https://www.cnblogs.com/greywolf/p/2831258.html
Copyright © 2011-2022 走看看