好么,2.0的源码没看几天,2.1的出了。
学习记录一下, 主要是Launcher启动时从数据库读取各种桌面物件信息到最后显示到屏幕桌面上的流程。
之前看2.0的时候,大概能分出来下面四个层次,2。1里面基本一样:
DB--mListInModel--mListInLauncher--ViewChildInCellLayout
I II III IV
扫了下代码,Launcher里面对这些东西有改动的重要是下面几个函数
FunA: bindAppWidget(LauncherAppWidgetInfo item)
1. workspace add view. -->IV,add
workspace.requestLayout.
2. mDesktopItems add item. -->III,add
FunB: bindFolders(HashMap folders)
1. clear . mFolder. -->III,clear
2. mfolder. add -->III,add all
FunC: bindItems(ArrayList shortcuts,int start,itn end)
1. mDesktopItems. add . -->III,add
2. case APP|Short|Folder|LiveFoder|Search
add in workspace.screen -->IV,add
workspace.requestLayout.
FunD: completeAddApplication(Context context,Intent,CellLayout.CellInfo)
1. find place ,
2. workspace.dropExternal -->I, fix or add.
FunE: completeAddAppWidget(Intent,CellInfo)
1. create a AppWidgetProviderInfo .from appWidgetId. -->III, add
2. if didnt find slot : delete it -->III,del
else add to db. --->I, add
3. mDesktopItems add -->III,add
4. workspace add -->IV,add
FunF: completeAddLivefodler(Intent,CellInfo)
1.add to DB -->I
2.workspace add view -->IV
FunG: completeAddShortcut(Intent,CellInfo)
1.add to DB -->I
2.workspace add view -->IV
FunH: finishBindingItems()
1. every folder . add to workspace screen . -->IV,add
2. requestLayout.
3. requesetFocus for that opend
FunL: startBinding()
1. workspace.everyCellLayout.removeAllViewsInLayout -->IV.clear
涉及到content的流程:
1 onCreate ,开机 或者重启
setupView初始化成员变量,然后由startLoader(isLaunching==true) 函数进行装载。
startLoader这个函数,多数情况下这个boolean参数都是true,也就是说完全重新装载。只有在changeFolderName,也就是改变用户更改folder名字的时候,调用参数是false的状况。
你一定觉得false的时候,系统会很聪明的去做最小的修改吧?嘿嘿,尼采错了。
这个布尔参数只是用来调节后文会提到的那个Thread的权限的,用途是用户开机的时候及早显示免得用户对着黑屏无聊- -b
两种情况做的事情还是一样的:完全的重读重绘,从I->II->III->IV完全走一遍。
他做的事情对应上面层次结构里的I->II->III->IV,
先把内容从ContentProvider读出到自己的成远变量, 然后传递给Launcher,最后传给workspace的CellLayout的每个CellInfo的View,也就是画到屏幕上。
具体来说,分以下几步:
1)创建一个LoaderThread,然后mLoaderThread.start来启动run函数
2)run函数第一步:loadWorkspace . 把数据库中Launcher上的所有app,shortcut,search,folder,livefolder,appwidget.分类读出来,前面2个放在一个arraylist<ItemInfo>,两个folder放入 HashMap<Long, FolderInfo>, appwidget放入第二个arraylist这样分成三类。这里searchWidget是个怪东西,长着widget的个儿,跑app那里去混。
3)run函数第二步:bindWorkspace
这个函数可以通过Callback这个神气的东西找到launcher,然后向他的workspace发射刚才读出来的两个数组。即包含了所有的数据库中记录的Launcher上的物件。
主要的,他通过callback调用三个launcher的函数:
Launcher.startBinding (即前面的FunL,把workspace的当前所有的view清空),
Launcher.bindItems(Func,绑定或者说装载App,search,显示到屏幕),
Launcher.bindFolders(FunB,邦好folder相关)
Launcher.bindAppWidget(FunA,绑定widget,显示到屏幕)
最后,调用Launcher.finishBindingItems() ,上面提到的FunH, 把所有的folder装载上,该显示的folder用4*4个cell显示起来。
细心的看官可能发现,三个bind函数,唯独bindFolders是只在III层操作,不和IV层相关,即不修改workspace的view的,原来是藏在finishBindingItems这个函数来作了。
4) run函数第三步 。 调用loadAllApps和bindAllApps
两个函数一看就不是不山寨我们loadWorkspace和bindWorkspace的嘛。反正就是读出来调用Launcher.bindAllApplications邦起来。
我这么说是为了方便理解,事实上app那块儿mAllAppsList我。。觉得他写的特棒,各种缓存各种区别各种花哨。直接看不懂。
到这里launcher的onCreate就差不多了,机器界面上该显示的也都显示上了。
2 添加
Launcher 上面有两种方式可以添加app快捷方式或者widget,分别是主界面空白处长按或者按下Menu选ADD。
其实点来点去,最后都是到了addItems()这个函数,他弹出一个窗口,让你选想要添加的物件。
这些东西基本会调用一个startActivityForResult
而这些返回的Result回到Launcher的时候,会得到相应的处理
具体的处理在onActivityResult函数里面。
3 删除
删除 没啥好说的
分清楚I,II,III,IV有点用。 想在哪个层次上作修改,对照着来还蛮快。
分享到:
相关推荐
pymol_launcher-2.1-cp37-cp37m-win_amd64
瑞芯微方案平板_android2.1之Launcher修改一
Android原生Launcher3源码的Android Studio版本,可以用AndroidStudio直接打开并开发。Android平台版本:Android8.1,AndroidStudio版本:3.3.2,注意:编译用到的com.google.protobuf编译信息不能更改,否则编译不过
通过阅读和理解 Android 2.1 Launcher 的源码,开发者可以学习如何创建自己的 Launcher 应用,自定义布局、交互方式和功能,比如添加新的主屏幕页类型、改变图标样式或实现独特的滑动手势。 10. **性能优化** ...
下载于eoeandroid,向原作者致敬 保存仅供学习 由于只能上传20M,故只能分卷了。 源码在eclipse中无错,已配置好 资源列表: 1.android_launcher2源码 2.adw_launcher 源码 3.class.jar
下载于eoeandroid,向原作者致敬 保存仅供学习 由于只能上传20M,故只能分卷了。 源码在eclipse中无错,已配置好 资源列表: 1.android_launcher2源码 2.adw_launcher 源码 3.class.jar
下载于eoeandroid,向原作者致敬 保存仅供学习 由于只能上传20M,故只能分卷了。 源码在eclipse中无错,已配置好 资源列表: 1.android_launcher2源码 2.adw_launcher 源码 3.class.jar
下载于eoeandroid,向原作者致敬 保存仅供学习 由于只能上传20M,故只能分卷了。 源码在eclipse中无错,已配置好 资源列表: 1.android_launcher2源码 2.adw_launcher 源码 3.class.jar
2. 接下来,解压 "pymol_launcher-2.6-cp311-cp311-win32.whl.zip" 压缩包,这将得到 "pymol_launcher-2.6-cp311-cp311-win32.whl" 文件。 3. 打开命令行终端(如Windows的PowerShell或CMD),并导航到解压后文件...
标题中的“pymol_launcher-2.6-cp311-cp311-win_amd64.whl.zip”是一个包含Python扩展模块的压缩文件,特别提到了“pymol_launcher”,这很可能是用于启动PyMOL的工具。PyMOL是一款广泛使用的分子可视化软件,用于...
VAIO_Launcher是一款专为Sony笔记本用户设计的桌面启动器,它以其独特的美观性和高效性赢得了用户的喜爱。这款工具栏不仅提供了便捷的程序启动功能,还为桌面环境增添了时尚和华丽的元素,使得工作与娱乐更加...
android studio期末作业AnderWeb-android_packages_apps_Launcher-4458ee4AnderWeb-android_packages_apps_Launcher-4458ee4AnderWeb-android_packages_apps_Launcher-4458ee4AnderWeb-android_packages_apps_...
2. **快捷启动**:与苹果Dock一样,rk_launcher允许用户将常用应用程序的快捷方式添加到Dock栏,实现一键启动。只需将.exe文件拖放到Dock上,即可创建快捷方式。 3. **任务管理**:rk_launcher可以显示正在运行的...
pymol_launcher-2.1-cp27-cp27m-win_amd64
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 Studio提供了一个便捷的工具来替换项目的图标,这个过程涉及多个步骤,下面我们将详细介绍如何在Android Studio中进行图标更换,特别是针对`ic_launcher`图标的操作。 1. **启动Image Asset Studio** 首先...
网络浏览器
Eclair是Android的一个版本代号,对应的是Android 2.0到2.1,这意味着这个启动器是为早期Android设备设计的。 通过分析这个项目的源代码,开发者可以学习以下关键知识点: 1. **Activity和Intent**: 启动器主要由...
需要先安装完破解补丁,将Launcher.cmd放到游戏根目录和launcher.exe一起。通过管理员权限打开Launcher.cmd来启动游戏。
Android_launcher 的源码分析是基于 2.1 版本的 Launcher2,虽然后续版本有所变化,但大致原理仍然保留。下面是该源码的主要组件和类的详细分析: 1. Launcher.java:Launcher 中的主要活动,负责处理用户交互和...