工作需要总结,这样就能保证地基牢固,就能爬得更高;
前段时间研究了Launcher的AllApps的加载流程,对这个进行了一点修改,呵呵,其实也不算太难,只要把Launcher的代码都能看个80%, 基本就是想怎么改就怎么改!AllApps是什么,就是在Android的IDEL界面(主界面)点击MainMenu键进入后的界面,也就是所有应用程 序界面;
先来看看它是怎么被手机加载上来的?
Step1:手机第一次开机,首先加载LauncherApplication,注册一些监听,共享数据,比如:LauncherModel对象,通过((LauncherApplication)getApplication());可以获取到LauncherApplication的对象;然后再加载Launcher.java这个类,先走onCreate()方法;里面调用如下方法:
Step2:在Step1中这个方法调到了LauncheModel.java的类里面了,在这个方法里面主要的工作就是启动一个线程,下面我们来看看在线程的run()方法做了哪些操作;
其实主要的操作就是加载workspace和AllApps;loadAndBindAllApps()这个方法就是加载AllApps的;
Step3:在这个loadAndBindAllApps()里面,会调用loadAllAppsByBatch(),批量加载AllApps;
先根据:
创建一个带有CATEGORY_LAUNCHER这种类型的mainIntent,然后再通过
List<ResolveInfo> apps=packageManager.queryIntentActivities(mainIntent, 0);
过滤出所有的apps,通过sort对apps进行排序:
排序完成后,然后把这些apps逐个添加到ArrayList中去:代码如下:
调到AllAppsList.java中的add方法:
这个added的定义就是:
然后通过开启线程callback回调到Launcher.java的bindAllApplications()方法中:
Step4:在Launcher.java中bindAllApplications()方法中做的事:如果有对话框存在,就remove对话框,主要是
Step5:在AppsCustomizePagedView.java中的setApps()中主要做的事就是,赋值给mApps,再次对apps进行排序,计算apps的页数和widget占用的页数;代码如下:
updatePageCounts()就是计算apps的页数和widget的页数;
Step6:而进入这个allapps的时候,就是进入到AppsCustomizePagedView.java这个类的时候会调用
onMeasure()这个方法;在这个里面首先会对allapps和widgets进行校验,
通过testDataReady()这个方法来校验是否他们为空!如果为空就不加载他们;代码如下:
/** * This differs from isDataReady as this is the test done if isDataReady is not set. */ private boolean testDataReady() { // We only do this test once, and we default to the Applications page, so we only really // have to wait for there to be apps. // TODO: What if one of them is validly empty return !mApps.isEmpty() && !mWidgets.isEmpty(); }
当allapps和widgets的数据都准备好了的时候,给这个view设置宽和高setMeasuredDimension(width, height);
然后调用onDataReady(width, height);在这个方法中会计算占用的页数,内容的宽度,细胞的数量,强制措施,以更新重新计算差距,存储页面,刷新数据显示上来通过invalidatePageData(Math.max(0, page), hostIsTransitioning);
这个调用到了PageView.java这个类(Launcher的主要精华类,写得相当有水准,看了好几遍,每次看都有收获)在这个方法里面主要做的是
(1)先加载apps和widgets的view,通过方法:
(2)再刷新数据到每页的view界面中,通过方法:
在 PageView.java中的loadAssociatedPages()方法中里面调用的主要的方法syncPageItems(i, (i == page) && immediateAndOnly);这个通过接口调到了AppsCustomizePagedView.java中的syncPageItems()方 法中去了:
里面就是刷新apps或者是widget的每一页;
再来看看syncAppsPageItems()这个方法:
当你看到这个addViewToCellLayout()方法的时候,我相信你就会有“山穷水复疑无路,柳暗花明又一村”的感觉了!这就是加载每个icon到view的那个位置;
syncWidgetPageItems()这个也是同理,代码我相信大家自己都能看明白了吧!
Step7:而这个widgets的数据是怎么加载上来的呢???这个是在Launcher.java中的onCreate()方法中一步一步加载的:
(1)在Launcher.java中的onCreate()方法中:
(2)调用到AppsCustomizePagedView.java中的onPackagesUpdated()的方法,这个里面主要做的是启动一个延迟的线程来加载widgets
(3)通过updatePackages()这个方法来实现的加载widgets的下面来看看代码:
相信大家看到这里,根据上面的分析,就应该明白了mWidgets数据的加载过程了吧!
Step8:置于里面的click事件就查看onClick()方法;
长按是调用到父类的PagedViewWithDraggableItems.java的onLongClick()事件:
然后回调子类的AppsCustomizePagedView.java的beginDragging()方法的:
以后的流程大家可以自己跟跟,就明白拖拽事件的传递了,其实和Folder的拖拽是类似的原理;
今天就总结到这里吧!
本文转载自:http://blog.csdn.net/wdaming1986/article/details/8478533
相关推荐
android studio期末作业AnderWeb-android_packages_apps_Launcher-4458ee4AnderWeb-android_packages_apps_Launcher-4458ee4AnderWeb-android_packages_apps_Launcher-4458ee4AnderWeb-android_packages_apps_...
AnderWeb-android_packages_apps_Launcher-4458ee4.zip AnderWeb-android_packages_apps_Launcher-4458ee4.zip AnderWeb-android_packages_apps_Launcher-4458ee4.zip AnderWeb-android_packages_apps_Launcher-4458...
android-launcher-plus
赠送jar包:junit-platform-launcher-1.8.0-M1.jar; 赠送原API文档:junit-platform-launcher-1.8.0-M1-javadoc.jar; 赠送源代码:junit-platform-launcher-1.8.0-M1-sources.jar; 赠送Maven依赖信息文件:junit-...
junit-platform-launcher-1.7.0.jarjunit-platform-launcher-1.7.0.jar
lang-2.4-src.zip<br>commons-launcher-1.1-src.zip<br>commons-launcher-1.1.zip<br>commons-logging-1.1.1-bin.zip<br>commons-logging-1.1.1-src.zip<br>commons-math-1.2-src.zip<br>commons-math-1.2.zip<br>...
开发工具 ant-launcher-1.9.6开发工具 ant-launcher-1.9.6开发工具 ant-launcher-1.9.6开发工具 ant-launcher-1.9.6开发工具 ant-launcher-1.9.6开发工具 ant-launcher-1.9.6开发工具 ant-launcher-1.9.6开发工具 ...
赠送jar包:junit-platform-launcher-1.8.0-M1.jar; 赠送原API文档:junit-platform-launcher-1.8.0-M1-javadoc.jar; 赠送源代码:junit-platform-launcher-1.8.0-M1-sources.jar; 赠送Maven依赖信息文件:junit-...
junit-platform-launcher-1.6.2.jarjunit-platform-launcher-1.6.2.jarjunit-platform-launcher-1.6.2.jar
这个项目是对android-tv-launcher开源项目用gradle编译的升级改造
Launcher3分析之拖动图标的流程——按下 Launcher3分析之拖动图标的流程——移动 Launcher3分析之拖动图标的流程——放下 PagedView的原理 – 滑动 如何给Launcher3添加左屏 IconCache原理 找个Launcher开发 ...
赠送jar包:junit-platform-launcher-1.6.1.jar; 赠送原API文档:junit-platform-launcher-1.6.1-javadoc.jar; 赠送源代码:junit-platform-launcher-1.6.1-sources.jar; 赠送Maven依赖信息文件:junit-platform-...
从android4.0源码中考出来的 launcher2的源码,谁需要谁下吧
Android Rocket Launcher Gradle plugin that adds tasks to your android modules for installing and launching all variants. How to use Paste this code into your module's build.gradle apply plugin: '...
android 定制 launcher 源码
android4.0 launcher源码 可直接在Eclipse中运行 与其他launcher不冲突
Android-launcher源码全面分析 一 Launcher默认界面配置(default workspace) 2 1 界面默认配置文件 2 2 LauncherProvider java的loadFavorites分析 3 二 Icon修改 界面布局调整 壁纸设置 5 1 图标大小和标题大小 5...
标签:ant-launcher-1.8.3.jar,ant,launcher,1.8.3,jar包下载,依赖包
junit-platform-launcher-1.3.1.jar
安卓Android源码——Android Launcher 源码修改可编译.zip