只是简单看下Launcher
Posted Jason_Lee155
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了只是简单看下Launcher相关的知识,希望对你有一定的参考价值。
基础认知
Launcher是android手机启动后给用户展示的第一个应用,其实也就是几个Activity的组合。
public class Launcher extends ThemeActivity
implements OnClickListener, OnLongClickListener, LauncherModel.Callbacks,
View.OnTouchListener, PageSwitchListener, LauncherProviderChangeListener,
MTKUnreadLoader.UnreadCallbacks, LauncherAppsCompat.OnAppsChangedCallbackCompat
//....省略庞大源码............
首先,launcher只是一个称呼,实际上Android4.4以后默认都是使用launcher3了,顾名思义还有launcher2/launcher1,不过都没有心思去研究了。如果想自己开发操作系统,还是可以去研究。
launcher结构
Launcher3是分两层显示的,第一层就是开机启动和用户按Home键后显示的页面(桌面),第二层是用来展示系统中所有需要显示到Launcher上的应用(我们常说的抽屉)。当然,并非所有的Launcher都有两层结构,比如小米Launcher就只有一层结构,可根据实际需求进行设计。
直接看看别人的图吧,所有这些拖拽、卸载、图标都是launcher提供的。Launcher其实是一个Activity中包含多个自定义View,在不同的状态下显示对应的View的一个应用。
源码类介绍
为什么Google程序员不TM多写点注释???为什么代码不规范?让我们这些普通人看起来好累,不用了的类能不能不放进来?谢特!------吐槽一下
Launcher:主界面Activity,launcher工程最核心的Activity。
LauncherAppState:单例对象,构造方法中初始化对象、注册应用安装、卸载、更新,配置变化等广播。这些广播用来实时更新桌面图标等,其receiver的实现在LauncherModel类中,LauncherModel也在这里初始化。
LauncherModel:数据处理类,保存桌面状态,提供读写数据库的API,内部类LoaderTask用来初始化桌面。
InvariantDeviceProfile:一些不变的设备相关参数管理类,其内部包涵了横竖屏模式的DeviceProfile。
WidgetPreviewLoader:存储Widget信息的数据库,内部创建了数据库widgetpreviews.db。
LauncherAppsCompat:获取已安装App列表信息的兼容抽象基类,子类依据不同版本API进行兼容性处理。
AppWidgetManagerCompat:获取AppWidget列表的兼容抽象基类,子类依据不同版本API进行兼容性处理。
LauncherStateTransitionAnimation:各类动画总管处理执行类,负责各种情况下的各种动画效果处理。
IconCache:图标缓存类,应用程序icon和title的缓存,内部类创建了数据库app_icons.db。
LauncherProvider:核心数据库类,负责launcher.db的创建与维护。
LauncherAppWidgetHost:AppWidgetHost子类,是桌面插件宿主,为了方便托拽等才继承处理的。
LauncherAppWidgetHostView:AppWidgetHostView子类,配合LauncherAppWidgetHost得到HostView。
LauncherRootView:竖屏模式下根布局,继承了InsettableFrameLayout,控制是否显示在状态栏等下面。
DragLayer:一个用来负责分发事件的ViewGroup。
DragController:DragLayer只是一个ViewGroup,具体的拖拽的处理都放到了DragController中。
BubblTextView:图标都基于他,继承自TextView。
DragView:拖动图标时跟随手指移动的View。
Folder:打开文件夹展示的View。
FolderIcon:文件夹图标。
DragSource/DropTarget:拖拽接口,DragSource表示图标从哪开始拖,DropTarget表示图标被拖到哪去。
ItemInfo:桌面上每个Item的信息数据结构,包括在第几屏、第几行、第几列、宽高等信息;该对象与数据库中记录一一对应;该类有多个子类,譬如FolderIcon的FolderInfo、BubbleTextView的ShortcutInfo等。
主要注意的是,launcher是没有继承我们常用应用的Application类做各种初始化的,而是继承了contentProvider,初始化比Application都要早,具体可以去看源码:
com.android.launcher3.LauncherProvider
以上是关于只是简单看下Launcher的主要内容,如果未能解决你的问题,请参考以下文章
[五]类加载机制双亲委派机制 底层代码实现原理 源码分析 java类加载双亲委派机制是如何实现的