Android原生模块Launcher分析.docx
- 文档编号:12100983
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:27
- 大小:377.04KB
Android原生模块Launcher分析.docx
《Android原生模块Launcher分析.docx》由会员分享,可在线阅读,更多相关《Android原生模块Launcher分析.docx(27页珍藏版)》请在冰豆网上搜索。
Android原生模块Launcher分析
Launcher2详细分析
Launcher2功能介绍
Launcher2是在Android系统原生的启动界面,也就是我们所说的HomeScreen,可以把他理解为Windows中的Explorer.exe,它是主要功能有:
1、设置墙壁纸
2、显示系统安装应用程序图标
3、提供应用程序入口
4、提供手机设置入口
5、桌面切换
6、添加widget
7、添加快捷方程式
8、添加Folder
9、拖动图标的位置
10、删除图标
11、显示桌面
Launcher2结构图
整个homescreen是一个包含三个childview的FrameLayout(com.android.launcher.DragLayer)。
第一个child就是桌面com.android.launcher.Workspace。
这个桌面又包含三个child。
每个child就对应一个桌面。
这就是你在Android上看到的三个桌面。
每个桌面上可以放置下列对象:
应用快捷方式,appwidget和folder。
第二个child是一个SlidingDrawer控件,这个控件由两个子控件组成。
一个是com.android.launcher.HandleView,就是Android桌面下方的把手,当点击这个把手时,另一个子控件,com.android.launcher.AllAppsGridView就会弹出,这个子控件列出系统中当前安装的所有类型为category.launcher的Activity。
第三个child是com.android.launcher.DeleteZone。
当用户在桌面上长按一个widget时,把手位置就会出现一个垃圾桶形状的控件,就是这个控件。
在虚拟桌面上可以摆放四种类型的对象:
1.ITEM_SHORTCUT,应用快捷方式
2.ITEM_APPWIDGET,appwidget
3.ITEM_LIVE_FOLDER,文件夹
4.ITEM_WALLPAPER,墙纸。
AndroidManifest.xml分析
需要权限:
android.permission.CALL_PHONE允许一个程序初始化一个电话拨号不需通过拨号用户界面需要用户确认
android.permission.EXPAND_STATUS_BAR允许一个程序扩展收缩在状态栏,Android开发网提示应该是一个类似WindowsMobile中的托盘程序
android.permission.GET_TASKS允许一个程序获取信息有关当前或最近运行的任务,一个缩略的任务状态,是否活动等等
android.permission.READ_CONTACTS允许程序读取用户联系人数据
android.permission.SET_WALLPAPER允许程序设置壁纸
android.permission.SET_WALLPAPER_HINTS允许程序设置壁纸hints
android.permission.VIBRATE允许访问振动设备
android.permission.WRITE_SETTINGS允许程序读取或写入系统设置
android.permission.BIND_APPWIDGET允许程序通过AppWidget服务访问AppWidget的数据
注册的Activity:
launcher中注册了两个Activity,一个是launcher,一个是WallPaperChooser
LauncherActivity:
android: name="com.jimmy.launcher2.Launcher" android: launchMode="singleTask"启动模式为singleTask,如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前。 android: clearTaskOnLaunch="true"这个参数意思是无论何时这个activity都会从homescreen重新启动,也就是只要你按了桌面的图标,这个活动就是第一个发起的。 但是唯一要注意的是如果你按下的是home建那么意味着这个活动没有结束,所以你在按有时候就不会第一次发起了。 只有当你按下back或者结束当前执行的任务之类代表能使activity结束的行为这个活动都会第一次发起。 android: stateNotNeeded="true" android: theme="@style/Theme"设置一个样式 android: screenOrientation="nosensor"不适用传感器确定屏幕方向 android: windowSoftInputMode="stateUnspecified|adjustPan">软键盘的状态(是否它是隐藏或可见)没有被指定。 系统将选择一个合适的状态或依赖于主题的设置。 这个是为了软件盘行为默认的设置。 |该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。 相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。 这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。 name="android.intent.action.MAIN"/> name="android.intent.category.HOME"/> name="android.intent.category.DEFAULT"/> name="android.intent.category.MONKEY"/>
WallpaperChooserActivity:
android: name="com.jimmy.launcher2.WallpaperChooser" android: label="@string/pick_wallpaper" android: icon="@drawable/ic_launcher_wallpaper" android: screenOrientation="nosensor" android: finishOnCloseSystemDialogs="true"> name="android.intent.action.SET_WALLPAPER"/> name="android.intent.category.DEFAULT"/>
注册的接收器:
快捷方式安装删除接收器
name="com.jimmy.launcher2.InstallShortcutReceiver" android: permission="com.jimmy.launcher2.permission.INSTALL_SHORTCUT"> name="com.jimmy.launcher2.action.INSTALL_SHORTCUT"/> name="com.jimmy.launcher2.UninstallShortcutReceiver" android: permission="com.jimmy.launcher2.permission.UNINSTALL_SHORTCUT"> name="com.jimmy.launcher2.action.UNINSTALL_SHORTCUT"/> 注册的Provider: Launcher的settings android: name="com.jimmy.launcher2.LauncherProvider" android: authorities="com.jimmy.launcher2.settings" android: writePermission="com.jimmy.launcher2.permission.WRITE_SETTINGS" android: readPermission="com.jimmy.launcher2.permission.READ_SETTINGS"/> android: name="com.jimmy.launcher2.permission.INSTALL_SHORTCUT" android: permissionGroup="android.permission-group.SYSTEM_TOOLS" android: protectionLevel="normal" android: label="@string/permlab_install_shortcut" android: description="@string/permdesc_install_shortcut"/> android: name="com.jimmy.launcher2.permission.UNINSTALL_SHORTCUT" android: permissionGroup="android.permission-group.SYSTEM_TOOLS" android: protectionLevel="normal" android: label="@string/permlab_uninstall_shortcut" android: description="@string/permdesc_uninstall_shortcut"/> android: name="com.jimmy.launcher2.permission.READ_SETTINGS" android: permissionGroup="android.permission-group.SYSTEM_TOOLS" android: protectionLevel="normal" android: label="@string/permlab_read_settings" android: description="@string/permdesc_read_settings"/> android: name="com.jimmy.launcher2.permission.WRITE_SETTINGS" android: permissionGroup="android.permission-group.SYSTEM_TOOLS" android: protectionLevel="normal" android: label="@string/permlab_write_settings" android: description="@string/permdesc_write_settings"/> name="com.jimmy.launcher2.permission.READ_SETTINGS"/> name="com.jimmy.launcher2.permission.WRITE_SETTINGS"/> 类文件功能简明分析 AddAdapter.java长按显示添加到桌面元素适配器,Shortcuts\Widgets\Folders\Wallpapers AllApps2D.java2D方式显示程序列表,实现GridView,HomeButton AllApps3D.java3D方式显示程序列表 AllAppsList.java存储所有关于程序列表的信息 AllAppsView.java定义了一个显示程序列表的接口 ApplicationInfo.java继承至ItemInfo.java,在AllAppsView中显示Item BubbleTextView.java桌面程序快捷方式,继承至TextView,在文本后面显示一个圆角气泡 CellLayout.java屏幕网格化 ClippedImageView.java DeferredHandler.java DeleteZone.java长按item出现的删除区域,继承自ImageView DragController.java拖动控制接口 DragLayer.java整个窗口的父对象,继承FrameLayout,实现接口DrayController,属于MVC中的V DragScroller.java当拖拽快捷方式的时候处理屏幕卷动的接口 DragSource.java拖动源接口,定义了voidonDropCompleted(Viewtarget,booleansuccess) DragView.java负责屏幕上拖拽View的位置计算和重新定位 DropTarget.java这个接口定义了一个能接收拖拽的对象,有很多拖动过程需要的方法 FastBitmapDrawable.java工具 Folder.java一组由用户选择或系统生成的Icons集合 FolderIcon.java出现在workspace中代表了一个folder的icon FolderInfo.javaItemInfo的子类,表示一个文件夹包含的快捷方式或应用程序 HandleView.java抽屉的开关,2.2以后已经没用抽屉了 IconCache.java应用程序图标的缓存 InstallShortcutReceiver.java创建快捷方式接收器 ItemInfo.java在Launcher中显示一个item的信息 Launcher.java整个launcher程序的入口,MVC中的C LauncherApplication.java在虚拟机种设置参数 LauncherAppWidgetHost.java桌面Widget LauncherAppWidgetHostView.java桌面Widget LauncherAppWidgetInfo.java桌面Widget LauncherModel.java里面有许多封装的对数据库的操作,属于MVC中的M LauncherProvider.java一个ContentProvider数据库,里面存储了桌面的item的信息 LauncherSettings.java设置相关的工具 LiveFolder.java桌面文件夹 LiveFolderAdapter.java桌面文件夹 LiveFolderIcon.java桌面文件夹 LiveFolderInfo.java桌面文件夹 ShortcutInfo.java表示一个在workspaces和folders中可启动的图标 ShortcutsAdapter.java显示应用程序和快捷方式列表的GridViewAdapter SymmetricalLinearTween.java提供了一个在0.0f和1.0f之间指定持续时间的动画 TweenCallback.java补间动画的回调接口 UninstallShortcutReceiver.java移除快捷方式接收器 UserFolder.java用户创建的文件夹 UserFolderInfo.java用户创建的文件夹的信息 Utilities.java工具类 WallpaperChooser.java选择壁纸 Workspace.java整个界面layout,5个窗口是他下面的子节点 类文件功能详细分析 AddAdapter.java 主页的上下文菜单,通过在主页的空白处长单击,可以显示可以被添加到桌面上的项目,Shortcuts\Widgets\Folders\Wallpapers 主要方法: getView(intposition,ViewconvertView,ViewGroupparent) getCount()//获得类表的数量 getItem(intposition)//通过位置获取项目对象 getItemId(intposition)//通过位置获取项目位置 内部类: publicclassListItem{}//列表中项目的详细信息 AllApps2D.java 2D方式显示程序列表,实现GridView,HomeButton 菜单view,在launcher.xml中引用的是: all_apps.xml定义如下: android=" --includelayout="@layout/all_apps_3d"/-->如果有需要可以定义自己的apps_3d布局 AllApps2D包括两个view --1.GridViewandroid: id="@+id/all_apps_2d_grid"应用菜单gridview它是一个gridview用来放应用图标,GridView对应的Adapter实现类是AppsAdapter,对应的Adapter布局文件是: application_boxed.xml --2.viewandroid: id="@+id/all_apps_2d_home"应用菜单view中的home按钮,点击隐藏AllApps2D AllApps3D.java AllAppsList.java AllAppsView.java 显示所有应用程序表格显示的接口。 需要实现的方法有: publicinterfaceWatcher{ publicvoidzoomed(floatzoom); } setLauncher(Launcherlauncher); setDragController(DragControllerdragger); zoom(floatzoom,booleananimate); isVisible(); isOpaque(); setApps(ArrayList addApps(ArrayList removeApps(ArrayList updateApps(ArrayList dumpState(); surrender(); ApplicationInfo.java 继承至ItemInfo.java,在AllAppsView中显示Item。 其中的属性包含应用程序名、bubble的标题、启动程序的intent、程序的图标 其中的方法包含setActivity()根据组件名和启动模式创建intent、dumpApplicationInfoList()显示应用程序信息的Log BubbleTextView.java 显示桌面程序快捷方式的程序名,继承至TextView,在文本后面显示一个圆角气泡 调用过程: (以桌面上只有一个View为例) 启动桌面的时候实例化BubbleTextView类,并在构造函数中调用init()方法获取焦点,设置bubble的背景颜色,根据屏幕密度定义圆角半径、水平和垂直边距。 然后执行onAttachedToWindow()方法在桌面上添加View。 然后调用setFrame()方法确定View的大小和位置。 然后执行draw()方法在屏幕上画出View的视图 10-1306: 48: 46.637: INFO/Launcher.BubbleTextView(406): InitializetheBubbleTextView 10-1306: 48: 46.637: INFO/Launcher.BubbleTextView(406): BubbleTextView(Contextcontext,AttributeSetattrs) 10-1306: 48: 46.637: INFO/Launcher.BubbleTextView(406): onAttachedToWindow() 10-1306: 48: 46.677: INFO/Launcher.BubbleTextView(406): setFrame() 10-1306: 48: 46.696: INFO/Launcher.BubbleTextView(406): draw() CellLayout.java 继承至ViewGroup,负责在Workspace中表格化显示快捷方式。 主要实现的功能有: 1)workspace是由celllayout组成的。 Celllayout被划分为了4行4列的表格,配置信息在workspace_screen.xml中定义 launcher: longAxisStartPadding="8dip"长轴起始间距(CellLayout距上边缘的间距) launcher: longAxisEndPadding="78dip"长轴起始间距(CellLayout距下边缘的间距) launcher: shortAxisStartPadding="0dip"短轴起始间距(CellLayout距左边缘的间距) launcher: shortAxisEndPadding="0dip"短轴起始间距(CellLayout距右边缘的间距) launcher: shortAxisCells="4"X轴方向单元格个数 launcher: longAxisCells="4"Y轴方向单元格个数 2)用Boolean类型的mOccupied二维数组来标记每个cell
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 原生 模块 Launcher 分析