Launcher概析

合集下载

Launcher分析

Launcher分析

要看launcher这部分,不记笔记没啥头绪。

这里先记录下来看到的东西,还是按各个文件来记。

一、与界面关系不是太大的部分主要是些数据的东西,为界面显示提供资料不直接参与到界面中。

LauncherApplication.java每个应用只能有一个application,而且应用起来第一个运行的就是application。

所以看Launcher第一个看这个java。

在这里onCreate()函数做了应用初始化的一堆活,其他几个函数做的活到可以不太去注意。

在onCreate()主要做了以下一些工作。

1. 获取屏幕的属性。

主要是大小和密度(分辨率)。

2. 初始化IconCache,这里主要保持各个应用对于的icon。

3. 初始化LauncherModel,在Launcher中界面无关的活大部分在这里面处理。

在这里同时还注册一堆事件给LauncherModel,包含应用删除,安装,变换事件(ACTION_PACKAGE_ADDED/REMOVED/CHANGED);外置存储卡的应用是否可用事件,这个事件可能会携带哪些应用的介绍(ACTION_EXTERNAL_APPLICATIONS_AVAILABLE/UNAVAILABLE);手机环境变换比如语言横竖屏之类的东西(ACTION_LOCALE_CHANGED/ ACTION_CONFIGURATION_CHANGED);搜索管理相关的变换(INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED/SEARCHABLES_CHANGED);还有个自身定义的消息(LauncherModel.SWITCH_SCENE_ACTION)。

4. 监控LauncherSettings.Favorites.CONTENT_URI。

这个发生变化时调用mModel.startLoader。

IconCache.javaINITIAL_ICON_CACHE_CAPACITYCacheEntry 结构体对于一个应用。

Launcherui框架讲解

Launcherui框架讲解

Launcherui框架讲解1.DragLayer--DragLayer继承FrameLayout,并在此基础上组合了DragController实现拖放功能,DragLayer主要监听下面两个用户事件。

onInterceptTouchEventonT ouchEvent交给DragController进行处理,DragController根据是否在拖放中等信息控制控件拖放过程处理.DragLayer 是Launcher这个activity的顶层view,Launcher2这个应用只有一个activity那就是Laucher.java2.DeleteZone--打开launcher.xml,DeleteZone默认是不显示的android:visibility="invisible"但是我们每次开始拖放图标的时候DeleteZone就显示了,它是怎么实现的呢?DeleteZone实现了DragController.DragListener接口,DragListener提供两个接口方法,onDragStart:隐藏把手,显示DeleteZoneonDragEnd:显示把手,隐藏DeleteZone分别在开始DragController开始拖放和结束拖放的时候被调用.另外DeleteZone实现了DropTarget接口,一旦鼠标把图标拖放到DeleteZone,就会调用DeleteZone实现的onDrop方法对应用图标进行删除处理.3.ClippedImageView--屏幕左右移动按钮,正常图标很小,你只能看到小点,我设置view背景不透明为绿色如前面我的截图ClippedImageView要注意三点,--1.桌面左右移动时Drawable的变换,变换图标列表可查看home_arrows_right.xml,ClippedImageView通过把drawable传递给worksapce,当桌面切换时通过调用Drawable.setLevel函数实现不同图标显示.--2.点击ClippedImageView实现左右桌面切换,查看ClippedImageView的布局文件android:onClick="previousScreen",该属性定义了一个ClippedImageView onClick事件响应函数,函数在布局文件对应的Activity中定义也就是在Launcher.java中定义1/**2* @Description:用户点击前一个桌面按钮3*/4@SuppressWarnings({"UnusedDeclaration"})5public void previousScreen(View v) {6if (!isAllAppsVisible()) {7mWorkspace.scrollLeft();8}9}3.在ClippedImageView初始化(LaunchersetupViews)中添加了长按事件OnLongClickListener有当长按ClippedImageView,会执行launcheronlongclick方法,方法执行显示5个桌面的预览微缩图显示,具体实现不做深入说明,后面将作深入研究4.RelativeLayoutandroid:id="@+id/all_apps_button_cluster",如前面截图右边灰色竖状条,它是一个相对布局对象,上面承载了三个view 中间是一个HandleView,是一个进入allappview的按钮,HandleView的上下都是一个进入google搜索的imageview HandleView 1点击事件传递给LauncheronClick进行处理显示应用菜单view 2长按事件传递给LauncheronLongClick进行处理,方法执行显示5个桌面的预览微缩图显示google搜索的imageview onClick响应:android:onClick="launchHotSeat"5.AllApps2D 菜单view,在launcherxml中引用的是:1 <include layout="@layout/all_apps" />2all_apps.xml定义如下:3<merge xmlns:android="/apk/res/android">4<include layout="@layout/all_apps_2d" />5<!--include layout="@layout/all_apps_3d" /-->6</merge>中间增加了一个层次,如果有需要可以定义自己的apps_3d布局AllApps2D包括两个view1.GridView android:id="@+id/all_apps_2d_grid" 应用菜单grid view 它是一个grid view 用来放应用图标GridView对应的Adapter实现类是AppsAdapter,对应的Adapter布局文件是:application_boxed.xml2.view android:id="@+id/all_apps_2d_home" 应用菜单view 右边的home按钮,点击隐藏 AllApps2D6.Workspace用户桌面包括5个workspace_screen,默认显示的是:launcher:defaultScreen="0"workspace继承了viewgroup,5个workspace_screen作为它的child,值得注意它只接收CellLayout类型的child,workspace重写了addview函数,添加非CellLayout的child将抛异常Workspace长按事件仍由launcher.onLongClick来监听Workspace实现了DropTarget,DragSource两个接口,意味着Workspace既是拖放源,又是拖放目的地Workspace实现DragScroller接口,DragScroller接口提供两个方法void scrollLeft();void scrollRight();在拖放过程被DragController调用实现桌面的左右滚动CellLayout Workspace下的一个桌面布局,CellLayout也是ViewGroup的子类,上面我的桌面截图红色区域就是CellLayoutWorkspace 下有5个CellLayout 顺序排列,Workspace 下布局文件:android :scrollbars="horizontal"决定了5个CellLayout 排列是横向还是纵向的.CellLayout 被划分成不同的cell 空间,并使用boolean[][] mOccupied ;来标识每个cell 是否被占用,先看CellLayout 的布局文件workspace_screen.xml :01 <uncher2.CellLayout02 xmlns:android="/apk/res/android"03 xmlns:launcher="/apk/res/uncher"04 android:layout_width="match_parent"05 android:layout_height="match_parent"06 android:hapticFeedbackEnabled="true"07 launcher:cellWidth="115dip"//每一个cell 的宽度08 launcher:cellHeight="100dip"//每个cell 的高度09 launcher:longAxisStartPadding="0dip"//cell 距离父view CellLayout 左边距10 launcher:longAxisEndPadding="0dip"//cell 距离父view CellLayout 右边距11 launcher:shortAxisStartPadding="0dip"//cell 距离父view CellLayout 上边距12 launcher:shortAxisEndPadding="80dip"//cell 距离父view CellLayout 下边距13 launcher:shortAxisCells="3"//对横屏来说表示CellLayout cells 行数 14 launcher:longAxisCells="5"//对横屏来说表示CellLayout cells 列数 15 android:background="#FF0000">16 </uncher2.CellLayout>当纵向的控件不够cells 排列时,cell 将产生重叠,横向不产生重叠,横向每个cell 间隔至少为0CellLayout 覆盖重新实现了onMeasure 方法,和onlayout 方法,它限定了child view 使用的布局参数类型为youtParams因此企图通过修改workspace_screen.xml来改变它的桌面布局是不会得以成功的,你必须修改CellLayout类youtParams说明,youtParams下有几个成员需要说明一下cellX:该child view占用的第几列的cell(若横向占用多个cell,表示最左边的cellx)cellY:该child view占用的第几行的cell(若纵向占用多个cell,表示最上边的celly)cellHSpan:横向跨越的列数cellVSpan:纵向跨越行数isDragging:该child是否正在被拖动regenerateId:是否重新生成view id7.桌面图标的四种类型ItemInfo所有类型的父类ApplicationInfo 应用图标项应用菜单view中所有应用图标的数据表示FolderInfo 桌面文件夹UserFolderInfo 对应实现布局文件yout.folder_iconLiveFolderInfo 对应实现布局文件yout.live_folder_iconLauncherAppWidgetInfo 桌面组件ShortcutInfo 应用快捷方式对应实现布局文件yout.application。

Android Launcher研究

Android Launcher研究

Android Launcher研究一、图文详解手把手教你在Windows环境下下载Android源码(Launcher为例)大家好,这篇文章我将教大家如何在Windows环境下下载Android源码,Android 自2007年11月5号发布以来,发展速度如此之快,和它走开源的路是分不开的。

我们在开发中有什么不明白不清楚的,直接把Android 源码下下来研究就可以了,看源代码将会让你提升很快!在这之前大家先熟悉俩个代码版本管理工具SVN,以及Git。

SVN(Windows环境下最常用的):svn(subversion)是近年来崛起的版本管理工具,是cvs的接班人。

目前,绝大多数开源软件都使用svn作为代码版本管理软件。

Git:Git 是用于Linux 内核开发的版本控制工具。

与常用的版本控制工具CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。

Git 的速度很快,这对于诸如Linux kernel 这样的大项目来说自然很重要。

Git 最为出色的是它的合并跟踪(merge tracing)能力。

而Google Android的项目是基于Git进行版本管理的,所以经常在Linux环境下开发的人,就不用我多说了,而大都数在Windows环境开发的人,就比较陌生了。

那下面我就手把手教你如何在Windows环境下Git Android源码。

第一步:Msysgit工具的下载(这个是Google为Windows环境下开发的Git客户端程序):/p/msysgit/ 下载地址如图:第二步:安装Msysgit软件(一直默认到底),如下图:第三步:建立一个文件夹用来存放Git下来的Android 源码(我这里以G:/Android Src)为例,如下图:第四步:右击Android Src文件夹选择Git Bash出现如下图所示:第五步:查找我们要下载源代码的地址。

launch用法

launch用法

launch用法"launch" 是一个英语动词,有多种用法。

以下是它的主要用法和例子:1. **发射**:用于描述物体或物体的起始运动。

* The spacecraft was launched into orbit.* The ship launched a torpedo.2. **启动**:用于描述开始某项活动或程序。

* The company launched a new product last week.* We launched the website to coincide with the event.3. **发起**:用于描述开始或发起一项活动或计划。

* They launched a fundraising campaign for the charity.* The company launched a new advertising campaign.4. **开办**:用于描述开始或开设某项业务或服务。

* They launched a new restaurant in town.* The company launched a new division to handle international sales. 5. **发布**:用于描述发布信息、产品或服务。

* The company launched a new software product.* The government launched a report on economic growth.6. **开业**:用于描述商店或企业的开业。

* The store launched its grand opening with a big celebration.* The new restaurant will launch next week.7. **开展**:用于描述开始或进行某项活动或项目。

launcher应用讲解

launcher应用讲解


这个是与launcher.java中setupViews()的 dragController.setDragListener(deleteZone)相关联的, 因此跳转进入deleteZone. onDragStart(DragSource source, Object info, int dragAction)这个函数。
部分简单处理





菜单处理详见Launcher.java中的 onCreateOptionsMenu()、 onPrepareOptionsMenu()、 onOptionsItemSelected()方法 在桌面上可以摆放四种类型的对象: 1. ITEM_SHORTCUT,应用快捷方式 2. ITEM_APPWIDGET,app widget 3. ITEM_LIVE_FOLDER,文件夹 4. ITEM_WALLPAPER,墙纸 方法onActivityResult() 完成在workspace上增加shortcut, appwidge和Livefolder; 方法startActivitySafely()启动应用程序
AndroidManifest.xml分析

由Launcher中的AndroidManifest.xml可以看出整 个Launcher的代码结构。
文件简要分析
Launcher遵循MVC模式 (M:launchermodel,V:draglayer,C:launcher) AddAdapter:添加主屏幕窗口的适配器,维护了 live fold , widget , shortcut , wallpaper 4 个 ListItem , 长按桌面会显示该 列表 AllAppsList:存储桌面元素数据相关。 CellLayout: 使屏幕网格化。 Celllayout被划分为了4行4列的表 格,用Boolean类型的mOccupied二维数组来标记每个cell是否 被占用。在attrs.xml中定义了shortAxisCells和longAxisCells分 别存储x轴和y轴方向的cell个数。在Celllayout构造函数中初始 化。 修改为5*5,见修改 DeleteZone:launcher的删除区域,继承ImageView DragController:拖动控制接口。 DragLayer:继承FrameLayout,实现接口DrayController DragView :继承View,实现接口TweenCallback ,拖动显示相关

Android系统(Launcher)

Android系统(Launcher)

本文将详细分析Launcher应用程序的启动过程。

Android系统的Home应用程序Launcher是由ActivityManagerService启动的,而ActivityManagerService和PackageManagerService一样,都是在开机时由SystemServer组件启动的,SystemServer组件首先是启动ePackageManagerServic,由它来负责安装系统的应用程序,具体可以参考前面一篇文章Android应用程序安装过程源代码分析,系统中的应用程序安装好了以后,SystemServer 组件接下来就要通过ActivityManagerService来启动Home应用程序Launcher了,Launcher在启动的时候便会通过PackageManagerServic把系统中已经安装好的应用程序以快捷图标的形式展示在桌面上,这样用户就可以使用这些应用程序了,整个过程如下图所示:点击查看大图下面详细分析每一个步骤。

Step 1. SystemServer.main这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 1。

Step 2. SystemServer.init1这个函数是一个JNI方法,实现在 frameworks/base/services/jni/com_android_server_SystemServer.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 2。

Step 3. libsystem_server.system_init函数system_init实现在libsystem_server库中,源代码位于frameworks/base/cmds/system_server/library/system_init.cpp文件中,具体可以参考前面一篇文章Android应用程序安装过程源代码分析的Step 3。

高中英语单词天天记launch素材

高中英语单词天天记launch素材

· launch· v. [lɔːntʃ] ( launches;launched;launching )·· 双解释义· vt. 1.使…下水set (a ship, especially one newly built) afloat· vt. 2.发动;发出;发射set in motion; send; aim· 基本要点•unch用作及物动词时常作“使…下水”解,后面常接船、客轮、海轮等之类的名词,多用于被动结构。

launch也可表示“发射”,后面常接飞船、卫星、火箭、导弹等之类的名词,这时多用于主动结构。

unch还可表示“发动”“猛射”“使开始”“开办”。

unch与副词out和介词into连用时,意思是“投身,着手,开始”。

•· 词汇搭配••launch auspiciously 吉利地开始•launch ceremoniously 隆重地出航•launch formally 形式上地开办•launch politically 政治上地发动•launch successfully 成功地发射•launch forth 出航,出海•launch off 开始,产生,挥霍,大讲•launch out 下水,开始••launch against 殴打某人•launch at 威胁某人•launch for 向…出航•launch from 从…驶下水•launch into 发射到•launch on 向…猛击•launch with 以(…方式)推出· 常用短语•launch against〔at〕(v.+prep.)发起进攻 attack▲launch sth against〔at〕 sb/sthThey launched a fresh anathema against him.他们又发起了把他们赶出教门的运动。

如虎添翼——Palm上的经典Launcher软件

如虎添翼——Palm上的经典Launcher软件

如虎添翼——Palm上的经典Launcher软件
阿猪呆
【期刊名称】《新潮电子》
【年(卷),期】2003(000)003
【摘要】所谓Launcher软件就是Palm上文件、信息和资源等方面的第三方管理程序(类似当前电脑上基于Linux操作系统的X-Windows管理软件)。

它们通常比系统自带的Launcher功能强大,而且还会提供一些高级应用,比如拖放操作、背景图片显示和扩展卡支持等等。

选择一款合适的Launcher软件不仅能够让你对Palm的操作更加得心应手,而且还能大幅提高工作效率。

下面笔者就从较为经典的几款出发,为大家简单介绍一下Launcher软件。

【总页数】2页(P109-110)
【作者】阿猪呆
【作者单位】无
【正文语种】中文
【中图分类】TP368.33
【相关文献】
1.Palm上手动感宝典—Palm软件介绍与应用专题 [J], 沧蓝
2.PC上的模拟战斗:—5款经典模拟器软件一览 [J], 王博
3.令Palm OS如虎添翼的Hack和DA软件 [J],
4.让你的Palm不"感冒"--Palm反病毒软件介绍 [J],
5.Palm手机经典游戏推荐 [J], 流水时光
因版权原因,仅展示原文概要,查看原文内容请购买。

AndroidLauncher3简单分析

AndroidLauncher3简单分析

AndroidLauncher3简单分析Launcher 3的界⾯主要由SearchDropTargetBar、Workspace、CellLayout、PageIndicator、Hotseat组成。

如下图:Launcher 3 最主要的是⼀个Activity,基本上所有操作都集中在这个Activity上。

这个Activity⽂件为Launcher.java,他的布局⽂件为launcher.xml。

下⾯为竖屏的布局⽂件,路径为res/layout-port/launcher.xml。

1<?xml version="1.0" encoding="utf-8"?>23<!-- Full screen view projects under the status bar and contains the background -->4<uncherRootView xmlns:android="/apk/res/android"5 xmlns:launcher="/apk/res-auto"6 android:id="@+id/launcher"7 android:layout_width="match_parent"8 android:layout_height="match_parent"9 android:fitsSystemWindows="true">1011<uncher3.DragLayer12android:id="@+id/drag_layer"1314 android:layout_width="match_parent"15 android:layout_height="match_parent">1617<uncher3.FocusIndicatorView18android:id="@+id/focus_indicator"19 android:layout_width="22dp"20 android:layout_height="22dp"/>2122<!-- The workspace contains 5 screens of cells -->23<!-- DO NOT CHANGE THE ID -->24<uncher3.Workspace25android:id="@+id/workspace"26 android:layout_width="match_parent"27 android:layout_height="match_parent"28 launcher:defaultScreen="@integer/config_workspaceDefaultScreen"29 launcher:pageIndicator="@+id/page_indicator"></uncher3.Workspace>3031<!-- DO NOT CHANGE THE ID -->32<include33android:id="@+id/hotseat"34 layout="@layout/hotseat"3536 android:layout_width="match_parent"37 android:layout_height="match_parent"/>3839<include40android:id="@+id/overview_panel"41 layout="@layout/overview_panel"42 android:visibility="gone"/>4344<!-- Keep these behind the workspace so that they are not visible when45 we go into AllApps -->46<include47android:id="@+id/page_indicator"48 layout="@layout/page_indicator"49 android:layout_width="wrap_content"50 android:layout_height="wrap_content"51 android:layout_gravity="center_horizontal"/>5253<include54android:id="@+id/search_drop_target_bar"5556 layout="@layout/search_drop_target_bar"/>5758<include59android:id="@+id/widgets_view"60 layout="@layout/widgets_view"61 android:layout_width="match_parent"62 android:layout_height="match_parent"63 android:visibility="invisible"/>6465<include66android:id="@+id/apps_view"67 layout="@layout/all_apps"68 android:layout_width="match_parent"69 android:layout_height="match_parent"70 android:visibility="invisible"/>71</uncher3.DragLayer>7273<ViewStub74android:id="@+id/launcher_overlay_stub"75 android:layout_width="match_parent"76 android:layout_height="match_parent"77 android:inflatedId="@+id/launcher_overlay"78 android:layout="@layout/launcher_overlay"/>79</uncherRootView>SearchDropTargetBar屏幕最上⽅有个搜索框,在我们拖动图标的时候,搜索框会替换成“删除“Workspace就是屏幕上左右滑的好⼏屏幕的容器CellLayoutWorkspace⾥⾯可以滑动的单独⼀屏,CellLayout负责图标和⼩部件的显⽰和整齐摆放。

Launcher设计原理

Launcher设计原理

Home Screen 的代码位于packages/apps/Launcher 目录。

Launcher 工程中的主要类如下: AddAdapter :添加桌面元素的适配器;AllAppsGridView :应用程序图标列表的主界面,继承GridView ;ApplicationInfo :保存有应用程序的信息;ApplicationsAdapter :AllAppsGridView 对应的Adapter ;DeleteZone :Launcher 的删除区域,继承ImageView ;DragController :拖动控制接口;DragLayer :整个launcher 的父节点,继承FrameLayout ,实现接口DrayController ; DragScrollerDragSource 拖动源接口,定义了void onDropCompleted(View target, Boolean success); DropTarget :拖动目标,定义很多拖动过程需要的方法;HandleView :launcher 抽屉的开关;ItemInfo :记录ITEM_TYPE_APPLICATION , ITEM_TYPE_USER_FOLDER , ITEM_TYPE_LIVE_FOLDER , ITEM_TYPE_WIDGET_SEARCH 这些类型的Item ;Launcher :整个launcher 的程序的入口;LauncherModel :主要负责维护Launcher 的状态和提供一些更新Launcher 数据库状态的API ; LauncherProvider :存储桌面上可以放置的几个对象,包括shortcut, search 和clock 等; WallpaperChooser :设置墙纸Workspace :控制桌面显示区域的layout ,几个窗口就是它下面的子节点;从文件launcher.xml ,workspace_screen.xml 可获知Home Screen 的UI 结构如下图所示:整个homescreen 是一个包含三个child view 的FrameLayout (uncher.DragLayer )。

Android_launcher源码全面分析

Android_launcher源码全面分析
<favorite //程序快捷键属性标签
launcher:className="com.apical.radio.radioMainActivity" //点击图标时,需要启动的类 launcher:packageName="com.apical.radio" launcher:screen="1" launcher:x="0" l0auncher:y="0" /> //该应用的包名 //第1屏,0-4屏共5屏 //图标X位置,左上角第一个为0,向左递增,0-4共5个 //图标Y位置,左上角第一个为0,向下递增,0-2共3个
Launcher默认是有5个分屏,不过这个可以配置。同样,每行每列有多少图标也是可以配置 的。这里按我修改的是3行5列的界面排布(对应上面的效果图)。 一般配置APP的快捷方式,使用上面的属性标签就可以。
<appwidget //插件
launcher:className="de.dnsproject.clock_widget_main.Clock1AppWidgetProvider" //该应用的类 launcher:packageName="de.dnsproject.clock_widget_main" launcher:screen="1" launcher:x="2" launcher:y="1" launcher:spanX="3" launcher:spanY="2" /> //第1屏,0-4屏共5屏 //图标X位置,左上角第一个为0,向左递增,0-4共5个 //图标Y位置,左上角第一个为0,向下递增,0-2共3个 //在x方向上所占格数 //在y方向上所占格数 //该应用的包名

android launcher

android launcher

LauncherLauncher主要修改涉及以下几个方面:一、默认界面配置,主要包括以下几个部分:1、桌面分屏个数,基础界面配置。

Android launcher 默认的界面配置是在default_workspace.xml中定制的,Launcher在第一次显示时会加载这个xml的数据。

default_workspace.xml主要是配置APP快捷方式、widget等,他里面常用的语法如下://default_workspace.xml中,支持的标签有:favorite:应用程序快捷方式。

shortcut:链接,如网址,本地磁盘路径等。

search:搜索框。

clock:桌面上的钟表Widget//支持的属性有:launcher:title:图标下面的文字,目前只支持引用,不能直接书写字符串;launcher:icon:图标引用;launcher:uri:链接地址,链接网址用的,使用shortcut标签就可以定义一个超链接,打开某个网址。

launcher:packageName:应用程序的包名;launcher:className:应用程序的启动类名;launcher:screen:图标所在的屏幕编号;launcher:x:图标在横向排列上的序号;launcher:y:图标在纵向排列上的序号;Launcher的默认分屏个数是可以定制的,这个是在workspace.xml中定制的,默认的是五个分屏,其实是包含了五个CellLayout。

也可以在Launcher.java中定制。

static final int SCREEN_COUNT = 5;static final int DEFAULT_SCREEN = 2;这里的意思是五个默认屏幕,将第三个屏幕作为默认页面,在xml中定义也是一样。

2、桌面图标定制Android原生图标大小都是可以定制的,配置路径在/res/values/dimens.xml。

launcher

launcher
launcher
启动流程
• • • •
android如何启动launcher Launcher功能 UI布局 Launcher应用启动流程
android如何启动launcher
• 加电,cpu执行bootloader程序,正常启动系统,加 载boot.img(其中包含内核还有ramdisk) • bootloader加载kernel,kernel自解压,初始化,载 入built-in驱动程序,完成启动。内核启动后会创建 若干内核线程,在后装入并执行程序/sbin/init/,载入 init process,切换至用户空间(user-space) • Init进程启动 • Servicemanager属于Native Service,注册各项服务。 • Zygote用于初始化虚拟机的进程。 • System server主要负责Android系统初始化并启动其 他服务。System server加载所有的服务后,系统初 始化完成.
LauncherApplication->onCreate
• • • • 1.设置最小堆内存4M 2.建立应用图标缓存器 3.建立LauncherModel 4.注册Intent.ACTION_PACKAGE_ADDED, Intent.ACTION_PACKAGE_REMOVED, Intent.ACTION_PACKAGE_CHANGED事件监听器 LauncherModel作为广播接收器对上面3中事件 进行监听 • 5.添加对桌面favorites content provider 数据变 化监听器
android系统启动launcher简要流向
• Bootloader kernel内核载入built-in驱动 程序Init进程启动 Servicemanager Zygote System serverHome启动

python launcher 用法 -回复

python launcher 用法 -回复

python launcher 用法-回复Python Launcher 是一个用来管理多版本Python 安装的工具,它允许用户在同一台电脑上安装多个Python 版本,并且能够轻松地在不同版本之间切换。

本文将介绍Python Launcher 的用法,以及如何在不同的操作系统上安装和配置。

第一步:安装Python LauncherPython Launcher 是Python 的一个标准库模块,因此在安装Python 或更新Python 版本时,它会自动安装到计算机上。

可以在Python 官方网站上下载最新版的Python,然后按照提示进行安装。

第二步:了解Python Launcher 的基本概念在继续之前,让我们先了解一下Python Launcher 的一些基本概念。

Python Launcher 的主要作用是为不同版本的Python 解释器分配一个唯一的标识符,并提供一个命令行工具(在Windows 上是py.exe,在macOS 和Linux 上是python3)来执行特定版本的Python 解释器。

第三步:在Windows 上使用Python Launcher在Windows 上,Python Launcher 的默认安装路径是C:\PythonXX\,其中XX 是安装的Python 版本号。

默认情况下,最新版本的Python 会被关联为py.exe,即可以直接在命令行中使用py 命令来执行Python 脚本。

如果已经安装了多个Python 版本,可以使用py -0 命令来列出已安装的Python 版本。

使用py -3 命令可以指定使用Python 3.x 版本,py -2 则会使用Python 2.x 版本。

如果希望在命令行中使用特定版本的Python,可以使用py -X.Y 命令,其中X.Y 是所需版本的主版本号和次版本号。

例如,要使用Python 3.8 版本,可以执行py -3.8 命令。

Android原生模块Launcher分析

Android原生模块Launcher分析

Android原⽣模块Launcher分析Launcher2详细分析Launcher2功能介绍Launcher2是在Android 系统原⽣的启动界⾯,也就是我们所说的HomeScreen,可以把他理解为Windows 中的Explorer.exe,它是主要功能有:1、设置墙壁纸2、显⽰系统安装应⽤程序图标3、提供应⽤程序⼊⼝4、提供⼿机设置⼊⼝5、桌⾯切换6、添加widget7、添加快捷⽅程式8、添加Folder9、拖动图标的位置10、删除图标11、显⽰桌⾯Launcher2结构图整个homescreen是⼀个包含三个child view的FrameLayout(/doc/e1f95a839e314332396893f8.html uncher.DragLayer)。

第⼀个child就是桌⾯/doc/e1f95a839e314332396893f8.html uncher.Workspace。

这个桌⾯⼜包含三个child。

每个child就对应⼀个桌⾯。

这就是你在Android上看到的三个桌⾯。

每个桌⾯上可以放置下列对象:应⽤快捷⽅式,appwidget和folder。

第⼆个child是⼀个SlidingDrawer控件,这个控件由两个⼦控件组成。

⼀个是/doc/e1f95a839e314332396893f8.html uncher.HandleView,就是Android桌⾯下⽅的把⼿,当点击这个把⼿时,另⼀个⼦控件,/doc/e1f95a839e314332396893f8.html uncher.AllAppsGridView就会弹出,这个⼦控件列出系统中当前安装的所有类型为/doc/e1f95a839e314332396893f8.html uncher的Activity。

第三个child是/doc/e1f95a839e314332396893f8.html uncher.DeleteZone。

launcher启动

launcher启动

Launcher介绍一、Launcher 是什么?uncher 是个启动器类似pc 上的桌面uncher 也是个应用二、让应用变为Launcher三、Launcher 具备的功能1.列出所有安装的应用2.启动应用程序3.显示壁纸4.显示窗口小部件5.显示书签6.显示文件夹7.……..四、工程类介绍1、AddAdapter: 维护了live fold , widget , shortcut , wallpaper 4 个ListItem ,长按桌面会显示该列表2、AllAppsGridView :显示APP 的网格3、ApplicationInfo :一个可启动的应用4、ApplicationsAdapter :gridview 的adapter5、BubbleTextView: 一个定制了的textview6、CellLayout: 屏幕网格化7、DeleteZone :UI 的一部分8、DragController ,dragscroller, dragsource, droptarget: 支持拖拽操作9、DragLayer :内部支持拖拽的viewgroup10、FastBitmapDrawable :工具11、Folder :Icons 的集合12、FolderIcon: 出现在workspace 的icon 代表了一个folder13、FolderInfo: ItemInfo 子类14、HandleView :一个imageview 。

I15、nstallShortcutReceiver ,UninstallShortcutReceiver :一个broadcastrecier16、ItemInfo: 代表Launcher 中一个Item (例如folder )17、Launcher: Launcher 程序的主窗口18、LauncherApplication :在VM 中设置参数19、LauncherAppWidgetHost ,LauncherAppWidgetHostView ,:Widget 相关20、LauncherModel :MVC 中的M21、LauncherProvider :一个contentprovider ,为Launcher 存储信息22、LauncherSettings: 设置相关的工具23、LiveFolder ,LiveFolderAdapter ,LiveFolderIcon ,LiveFolderInfo :livefolder 相关24、Search :搜索25、UserFolder ,UserFolderInfo :文件夹包含applications ,shortcuts26、Utilities: 小工具27、WallpaperChooser :选择wallpaper 的activity28、Workspace: 屏幕上的一块区域29、widget : 代表启动的widget 实例,例如搜索Launcher 启动流程一、在 VM 中设置参数LauncherApplication->onCreate1.设置最小堆内存4M2.建立应用图标缓存器3.建立LauncherModel4.注册Intent.ACTION_PACKAGE_ADDED,Intent.ACTION_PACKAGE_REMOVED,Intent.ACTION_PACKAGE_CHANGED事件监听器LauncherModel作为广播接收器对上面3中事件进行监听5.添加对桌面favorites content provider 数据变化监听器二、Launcher 程序的主窗口Launcher->onCreate1.获取LauncherApplication LauncherModel mIconCache等LauncherApplication初始化的对象2.新建拖放控制器new DragController(this)4.获取桌面组件管理器,启动桌面组件host5.从array.hotseats中加载所有的hotseats(热键如挂机按钮,google浏览器)6.从launcher.preferences加载本地设置7.设置壁纸尺寸宽度=display.getWidth()* WALLPAPER_SCREENS_SPAN,高度=display.getHeight()8.加载布局文件9.初始化所有控件10.从Bundle savedInstanceState获取桌面持久化数据设置mRestoring = true;11.如果mRestoring == false,调用LauncherModel加载桌面项mModel.startLoader(this,true,isLanguageChange);uncherModel.Loader.startLoader()代码同步处理b.新建LauncherModel.Loader.LoaderThread线程并启动线程(桌面项加载,详细见第三步)12.注册Intent.ACTION_CLOSE_SYSTEM_DIALOGS广播监听三、桌面、抽屉项加载1.等待主线程运行结束才开始加载2.判断是否先加载桌面;loadWorkspaceFirst = cbk != null ?(!cbk.isAllAppsVisible ()):true;3.loadWorkspaceFirst==truea.loadAndBindWorkspace()loadWorkspace():从数据库launcher.db中查询中所有桌面项构造对应类型的ItemInfo 对象存入mItems,mAppWidgets,mFolders列表.bindWorkspace():ucher.startBinding(),异步调用,在主线程中handle//do no thingsucher.bindItems(),异步调用,在主线程中handle1.根据ItemInfo对象创建桌面图标view对象2.获取item.screen,item.cellX,item.cellY,spanX,spanY,调用workspace.addInScreen添加到对应桌面的cell1.重新设置桌面图标view 的layoutparam(类型为youtparam)2.根据item.screen获取桌面的celllayout对象,也就是workspace下5个用户桌面中的一个3.调用celllayout.addview方法把桌面图标view对象添加为celllayout的child,也就是为用户桌面添加一个桌面图标4.桌面图标view对象添加OnLongClickListener=laucher,由laucher负责监听桌面图标view的longclick事件5.如果桌面图标是DropTarget对象,拖放控制器mDragController添加该view到拖放目的地列表ucher.bindFolders(),异步调用,在主线程中handle//launcher.mFolders.putAll(mFolders);ucher.bindAppWidget(),异步调用,在主线程中handle1.获取LauncherAppWidgetInfo的appWidgetId2.获取AppWidgetProviderInfo appWidgetInfo mAppWidgetManager.getAppWidgetInfo (appWidgetId)3.根据appWidgetInfo创建桌面组件的view AppWidgetHostView对象4.调用workspace.addInScreen添加到对应桌面的cellucher.finishBindingItems(),异步调用,在主线程中handlemWorkspaceLoading=falseb.loadAndBindAllApps();如果没有加载apps或者改变了语言设置loadAllAppsByBatch();1.//设置package 查询条件Intent.ACTION_MAIN Intent.CATEGORY_LAUNCHER2.//清空mAllAppsList mAllAppsList.clear();3.//packageManager 查询所有应用pakages4.分批次mAllAppsList.add 应用pakagesucher.bindAllApplications()//异步调用mAllAppsGrid.setApps(apps)6.若分多个批次加载laucher.bindAppsAdded()//异步调用mAllAppsGrid.addApps(apps);否则onlyBindAllApps();1.mAllAppsList.data.clone();ucher.bindAllApplications()//异步调用mAllAppsGrid.setApps(apps)4.loadWorkspaceFirst==falsea.loadAndBindAllApps();b.loadAndBindWorkspace();四、数据库创建及初始化默认配置LauncherProvider在创建数据库时进行默认配置填充loadFavorites(db);1.系统默认配置加载2.自定义配置加载(定义在指定目录的加载文件,如果不存在加载系统默认配置)Launcher WorkSpase (主屏介绍) WorkSpase 是我们启动android 手机进入launcher 给用户最先显示的部分。

launcher介绍

launcher介绍

Launcher是Android的应用程序启动器,Launcher的功能还包含:桌面的切换、应用程序快捷(shortcut)功能、背景图(Wallpaper)功能等等。

在Android的桌面最下方,有一个图示,按下后可以拉出应用程序图示清单,这是Launcher提供的功能。

我们这个实例是用GridView来实现Launcher效果的,下面的截屏显示本实例的效果图:源代码如下:main.xml布局文件,只有一个GridView:[xhtml:collapse:showcolumns]+ expand sourceview plaincopy .........10........20........30........40........50........60........70........80........90........100.......110.......120.......130.......140. (150)GridView的每一个Item也需要一个布局文件,用来定义应用的图标与标题,application_layout.xml:[xhtml:collapse:showcolumns]+ expand sourceview plaincopy .........10........20........30........40........50........60........70........80........90........100.......110.......120.......130.......140. (150)主程序文件,Launcher.java:[c-sharp:collapse:showcolumns]+ expand sourceview plaincopy .........10........20........30........40........50........60........70........80........90........100.......110.......120.......130.......140. (150)几点说明:1. 函数setupViews()是建立Launcher桌面的Views的。

Android_Launcher详解

Android_Launcher详解

Android_Launcher详解(根据网络视频)(1)Launcher的定义:Android系统启动后,加载的第一个程序,是其他应用程序的入口。

(2)Launcher的构成:HomeScreen(1.workspace(AppWidget,Wallpaper,Livefolder,ShortCut),2.HotSeats,3.AllApps/allApplist:GridView)(3)针对Launcher的开发类型:1.开发自定义的Launcher2.与Workspace相关的开发(AppWidget,Wallpaper,Livefolder,ShortCut)(4)解读Launcher源代码(以ShortCut为例),Launcher为系统级应用,位于Applications 层。

源代码位于MyAndroid\packages\apps\Launcher2中,可讲它导入eclipse中。

(5)看Manifest文件可知,Launcher的主Activity为:uncher。

下面是它的部分配置信息:(6)关于Activity的四种加载模式(android:launchMode):在多Activity开发中,有可能是自己应用之间的Activity跳转,或者夹带其他应用的可复用Activity。

有可能会希望跳转到原来某个Activity实例,而不是产生大量重复的Activity。

这就需要为Activity 配置特定的加载模式,而不是默认的加载模式。

1.Standard:默认模式,每次激活Activity时都会创建Activity,并放入任务栈中。

2.singleTop:如果在任务栈栈顶正好存在该Activity的实例,就重用该实例(会调用实例的onNewIntent()),否则就会创建新的实例并放入栈顶,即使栈中已经存在该Activity的实例。

3.singleTask:如果在栈中已经有该Activity的实例,就会重用该实例,重用时,会让该实例回到栈顶,因此在它上面的实例将会被移出栈。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、主要文件和类uncher.java:launcher中主要的activity。

2.DragLayer.java:l auncher layout的rootview。

DragLayer实际上也是一个抽象的界面,用来处理拖动和对事件进行初步处理然后按情况分发下去,角色是一个controller。

它首先用onInterceptTouchEvent(MotionEvent)来拦截所有的touch事件,如果是长按item拖动的话不把事件传下去,直接交由onTouchEvent()处理,这样就可以实现item的移动了,如果不是拖动item的话就把事件传到目标view,交有目标view的事件处理函数做相应处理。

如过有要对事件的特殊需求的话可以修改onInterceptTouchEvent(MotionEvent)来实现所需要的功能。

3. DragController.java:为Drag定义的一个接口。

包含一个接口,两个方法和两个静态常量。

接口为DragListener(包含onDragStart(),onDragEnd()两个函数),onDragStart()是在刚开始拖动的时候被调用,onDragEnd()是在拖动完成时被调用。

在launcher中典型的应用是DeleteZone,在长按拖动item时调用onDragStart()显示,在拖动结束的时候onDragEnd()隐藏。

两个函数包括startDrag()和setDragItemInfo().startDrag()用于在拖动是传递要拖动的item的信息以及拖动的方式,setDragItemInfo()用于传递item的参数信息(包括位置以及大小)。

两个常量为DRAG_ACTION_MOVE,DRAG_ACTION_COPY来标识拖动的方式,DRAG_ACTION_MOVE为移动,表示在拖动的时候需要删除原来的item,DRAG_ACTION_COPY为复制型的拖动,表示保留被拖动的item。

uncherModel.java:辅助的文件。

里面有许多封装的对数据库的操作。

包含几个线程,其中最主要的是ApplicationsLoader和DesktopItemsLoader。

ApplicationsLoader 在加载所有应用程序时使用,DesktopItemsLoader在加载workspace的时候使用。

其他的函数就是对数据库的封装,比如在删除,替换,添加程序的时候做更新数据库和UI的工作。

5.Workspace.java:抽象的桌面。

由N个celllaout组成,从cellLayout更高一级的层面上对事件的处理。

uncherProvider.java:launcher的数据库,里面存储了桌面的item的信息。

在创建数据库的时候会loadFavorites(db)方法,loadFavorites()会解析xml目录下的default_workspace.xml文件,把其中的内容读出来写到数据库中,这样就做到了桌面的预制。

7.CellLayout.java:组成workspace的view,继承自viewgroup,既是一个dragSource,又是一个dropTarget,可以将它里面的item拖出去,也可以容纳拖动过来的item。

在workspace_screen里面定了一些它的view参数。

8.ItemInfo.java:对item的抽象,所有类型item的父类,item包含的属性有id(标识item的id),cellX(在横向位置上的位置,从0开始),cellY(在纵向位置上的位置,从0开始),spanX(在横向位置上所占的单位格),spanY(在纵向位置上所占的单位格),screen(在workspace的第几屏,从0开始),itemType(item的类型,有widget,search,application等),container(item所在的)。

erFolder.java: 用户创建的文件夹。

可以将item拖进文件夹,单击时打开文件夹,长按文件夹上面标题处可以重命名文件夹。

10.LiveFolder.java:系统自带的文件夹。

从系统中创建出的如联系人的文件夹等。

11.DeleteZone:删除框。

在平时是出于隐藏状态,在将item长按拖动的时候会显示出来,如果将item拖动到删除框位置时会删除item。

DeleteZone实现了DropTarget 和DragListener两个接口。

uncherSettings.java:字符串的定义。

数据库项的字符串定义,另外在这里定义了container的类型,还有itemType的定义,除此还有一些特殊的widget(如search,clock的定义等)的类型定义。

二、主要模块1.界面模型:Launcher的界面的rootview是DragLayer,它是一个FrameLayout,在它上面workspace (应该说是celllayout)占了绝大部分的空间,celllayout的参数文件是workspace_screen.xml。

workspace既是一个DropTarget又是一个DragSource,可以从AllAppGridView中拖出应用程序放在它上面,也可以把它里面的item拖走删除或者拖到bottomabr里面去。

2.Drop& Drag模型:DragSource:可以拖动的对象来源的容器,在launcher中主要有AllAppGridView,workspace等。

void onDropCompleted(View target, boolean success,int x,int y);DropTarget:可以放置被拖动的对象的容器。

在launcher中有folder,workspace,bottombar等,一个View既可以是Dragsource也可以是DropTarget。

主要包含以下几个接口:boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);acceptDrop函数用来判断dropTarget是否可以接受item放置在自己里面。

void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);onDragEnter是item被拖动进入到一个dropTarget的时候的回调。

void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);onDragOver是item在上一次位置和这一次位置所处的dropTarget相同的时候的回调。

void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);onDragExit是item被拖出dropTarget时的回调。

boolean onDrop(DragSource source, int x, int y, int xOffset, int yOffset, Object dragInfo);onDrop是item被放置到dropTarget时的回调。

函数的调用模式为:DropTarget dropTarget = findDropTarget((int) x, (int) y, coordinates);if (dropTarget != null) {/*** 当这一次的target 跟上一次相同时,根据坐标来移动item*/if (mLastDropTarget == dropTarget) {dropTarget.onDragOver(mDragSource, coordinates[0], coordinates[1],(int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo);} else {/*** 当上一次的位置跟这一次不同而且上一次的位置不为空,说明item移*动出了,将上次的View 根据上次的坐标重新排列,并根据当前坐标重排*当前的*/if (mLastDropTarget != null) {mLastDropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],(int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo);}dropTarget.onDragEnter(mDragSource, coordinates[0], coordinates[1],(int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo);}} else {//如果这一次为null ,上一次不为null ,那么把上一次坐标位置的cell 去掉if (mLastDropTarget != null) {mLastDropTarget.onDragExit(mDragSource, coordinates[0], coordinates[1],(int) mTouchOffsetX, (int) mTouchOffsetY, mDragInfo);}}//记录上次的droptargetmLastDropTarget = dropTarget;3.Touch event总结:由于launcher的事件比较多比较复杂,所以在事件处理的时候一般采用rootview先用onInterceptTouchEvent(MotionEvent)拦截所有的touch事件,经过判断后分发给childview。

判断的规则如下:a.down事件首先会传递到onInterceptTouchEvent()方法b.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return false,那么后续的move, up等事件将继续会先传递给该ViewGroup,之后才和down事件一样传递给最终的目标view的onTouchEvent()处理。

c.如果该ViewGroup的onInterceptTouchEvent()在接收到down事件处理完成之后return true,那么后续的move, up等事件将不再传递给onInterceptTouchEvent(),而是和down事件一样传递给该ViewGroup的onTouchEvent()处理,注意,目标view 将接收不到任何事件。

相关文档
最新文档