实现方案
1.写一个apk然后把系统的属性加上去,然后启动的时候默认就指定到这个apk的包名,他就启动。
优点:开发成本相对低,维护都是自己,所有代码可控。
缺点:必须熟练掌握事件分发机制:长按,拖拽,点击,双击,滑动
2.基于Androidlauncher3的源码去做一个定制化的修改
优点:比较稳定,基本功能都有。
缺点:熟悉Launcher3源码,成本比较高,定制化功能需要了解。
Launcher3官方代码下载:
https://android.googlesource.com/platform/packages/apps/Launcher3/
概述
市面上有很多桌面产品,比如91桌面,go桌面,小米桌面等等,虽说千差万别,但都完成了桌面的基本任务,比如说组织图标,拖动图标,滑动页面,显示小工具等等功能。桌面跟其他Android App很大的不同是,他只有一个Activity,但是这个Activity却十分复杂,用几个自定义View把Android的触摸事件的处理玩儿的眼花缭乱,没有长时间的折腾是很难熟悉的。
Launcher3中的常用类
- Launcher
继承Activity,主界面,用来显示图标,widget和文件夹等,它的布局就是桌面的基本结构,布局内部为DragLayer,再嵌套了Workspace和hotseat。
Launcher3其实最主要的是一个Activity,基本上所有的操作都集中在这个Activity上,在Launcher.java 当中,setContentView的参数是R.layout.launcher,我们暂时只研究下桌面竖屏的情况,相关源码在res/layout-port/launcher.xml。
- LauncherModel
主要作用是加载数据,处理数据,保存桌面状态,内部类LoaderTask用来初始化桌面。
public class LauncherModel extends LauncherApps.Callback implements InstallSessionTracker.Callback {
}
- LauncherProvider
继承ContentProvider,主要处理数据库的操作。
public class LauncherProvider extends ContentProvider {
}
compat
兼容包,带这个后缀的都是做兼容处理的类,比如(LauncherAppsCompat 【App列表的兼容类】AppweightManagerCompat【Appweight的兼容类】)。DragLayer
一个用来负责分发事件的viewGroup。
public class DragLayer extends BaseDragLayer<Launcher> implements LauncherOverlayCallbacks {
}
- DragController
DragLayer只是一个ViewGroup,具体的拖拽的处理都放到了DragController中。
public abstract class DragController<T extends ActivityContext>
implements DragDriver.EventListener, TouchController {
}
- DragView
拖拽图标时跟随手指移动的view。
public abstract class DragView<T extends Context & ActivityContext> extends FrameLayout {
}
DatabaseWidgetPreviewLoader
存储Widget信息的数据库,内部创建了数据库widgetpreviewsdb。IconCache
图标缓存类,应用程序icon和title的缓存,内部类创建了数据库app_icons.db。
public class IconCache extends BaseIconCache {
}
ItemInfo
桌面上每个Item的信息数据结构,包括在第几屏第几行,第几列,宽高等信息,该对象与数据库中记录一一对应,该类有多个子类如:FolderIcon的FolderInfo,BubbleTextView的shorcutInfo。LauncherAppWidgetHost
AppWidgetHost子类,是桌面插件宿主,为了方便拖拽等才继承处理。
class LauncherAppWidgetHost extends AppWidgetHost {
}
LauncherAppWidgetHostView
AppWidgetHostView子类,配合LauncherAppWidgetHost得到HostView。LauncherRootView
竖屏模式下根布局,继承了InsettavleFrameLayout,控制是否显示在状态栏下面。
public class LauncherRootView extends InsettableFrameLayout {
}
- BubbleTextView
图标都是基于他,继承自TextView
public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver,
IconLabelDotView, DraggableView, Reorderable {
}
Folder
打开文件夹展示的view。FolderIcon
文件夹图标。
public class FolderIcon extends FrameLayout implements FolderListener, IconLabelDotView,
DraggableView, Reorderable {
}
- DragSource、DrogTarget
拖拽接口,DragSource表示图标从哪里开始拖拽,DrogTarget表示图标被拖到了哪里。
public interface DragSource {
void onDropCompleted(View target, DragObject d, boolean success);
}
默认图标配置
default_workspace.xml
我们知道当我们在启动Launcher的时候桌面会有一些已经配置好的图标,其实在第一次运行Launcher的时候会读取一个配置xml文件来进行布局(launcher/res/xml/default_workspace.xml)这个文件可以配置App的快捷方式
这些事我们默认的布局文件3 * 3,4 * 4,5 * 5,5 * 6表示桌面图标的列数和行数,可以根据屏幕的大小来进行适配选择用那一个布局。
参考:
https://blog.csdn.net/chezabo6116/article/details/128223607
手把手教你打造一款个人专属Android桌面
https://github.com/fookwood/Launcher3?tab=readme-ov-file
//www.greatytc.com/p/4b6ca081ea41