- 浏览: 512973 次
- 性别:
- 来自: 惠州
文章分类
- 全部博客 (255)
- ant (1)
- springMVC (2)
- ajax (4)
- oracle (12)
- SSH (13)
- struts1 (2)
- Hibernate (14)
- spring (5)
- jstl (1)
- 连接池 (1)
- acegi (4)
- java (17)
- jquery (11)
- div+css (4)
- drupal (1)
- php (8)
- freemaker调模板生成静态页面 (1)
- xml (1)
- json (2)
- javascript (9)
- 正则表达式 (4)
- Ext (8)
- jdbc (1)
- sql server (2)
- perl (5)
- db4o (1)
- webservice (4)
- flex (13)
- it资讯 (1)
- joomla (0)
- 设计模式 (1)
- struts2 (4)
- s2sh (8)
- linux (3)
- ejb (2)
- android旅途 (24)
- android (36)
- C/C++ (16)
- mysql (1)
最新评论
-
fengyuxing168:
IBelyService bs = IBelyService. ...
为 Android 添加 Java 层服务也就是添加自定义的aidl服务到serviceManager 通过ServiceManager.getService取 -
dengzhangtao:
"由于ActivityManagerService是 ...
binder理解 -
yzyspy:
ActivityManagerService:startHom ...
Android的Launcher成为系统中第一个启动的,也是唯一的 -
Matchstick:
使用SELECT DISTINCT alias FROM Po ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题 -
dlheart:
没看懂你什么意思啊,我遇到的问题是一对多,设了fetch = ...
hibernate 一对多表查询时fetchMode.join 生成left outer join 出来数据重复问题
1. Launcher的启动过程
从网络上找了一段关于Launcher 的启动过程的文章,作为学习 Launcher 的背景知识:
Linux kernel
启动以后会通过
a
pp_main
进程来初始化android Runtime Java运行环境,而
zygote
是
A
ndroid的第一个进程。所有的android的应用以及大部分系统服务都是通过zygote fork出来的子进程(
我现在看到的只有native的service manager不是zygote fork出来的)
。在system server中启动的若干系统服务中与我们启动进程相关的就是
Acitivity Manager
。
当
systerm server启动好所有服务以后,系统就进入”system ready”状态,这个时候Activity Manager就登场了。
Activity Manager光看代码行就知道是一个重量级的服务,它主要管理Activity之间的跳转,以及进程的生命周期。当
Activity Manager发现系统已经启动好以后它就会发出一个intent:
通过这个category类型为home的intent,Activity Manager就会通过:
启动
Home
进程了。而这个启动Home进程的过程实际上还是去通过zygote fork出的一个子进程。
因此只要在manifest中具备这样的intent-filter都可以在开机的时候作为Home启动:
多个home之间的switch会在开始的时候有个选择,至于这个选择好像是package manager来实现的,没有仔细研究过。
2.UI结构
通过 launcher/Res/Layout-land/launcher.xml 分析可以得到主屏幕的UI 结构:
整个homescreen是一个包含三个child view的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时,把手位置就会出现一个垃圾桶形状的控件,就是这个控件。
3.应用程序代码分析
由Launcher 中的 AndroidManifest.xml 可以看出整个Launcher 的代码结构。
首先,是一些权限的声明。例如:
|
这部分可以略过;
其次,Application 的构成,如上图:
(1) Launcher :HomeScreen 的 Activity 。
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.HOME" />
- <category android:name="android.intent.category.DEFAULT" />
- <category android:name="android.intent.category.MONKEY" /> </intent-filter>
上面这段代码就标志着它是开机启动后Home 的 Activity 。通过 Launcher.java 中 onCreat() 的分析我们可以大致把握屏幕的主要活动:
|
方法 onActivityResult(): 完成在workspace 上增加 shortcut , appwidge 和 Livefolder ;
方法 onSaveInstantceState() 和 onRestoreInstanceState() :为了防止 Sensor 、 Land 和 Port 布局自动切换时数据被置空,通过 onSaveInstanceState 方法可以保存当前窗口的状态,在即将布局切换前将当前的 Activity 压入历史堆栈。如果我们的 Activity 在后台没有因为运行内存吃紧被清理,则切换时回触发 onRestoreIntanceState() 。
(2) WallpaperChooser :设置墙纸。
同理我们从onCreat() 作为入口来分析这个活动的主要功能。
|
(3) default_searchable
对于home 中任意的 Acitivty ,使能系统缺省 Search 模式,这样就可以使用 android 系统默认的 search UI 。
(4) InstallShortcutReceiver :
继承自BroadcastReceiver ,重写 onReceier() 方法,对于发送来的 Broadcast (这里指 Intent )进行过滤( IntentFilt )并且响应(这里是 InstallShortcut() )。这里分析下 onReceive():
|
其中 IntallShortcut() 方法:首先,对传入的坐标进行判断(findEmptyCell() ) , 如果是空白位置,则可以放置快捷方式;其次,缺省情况下,我们允许创建重复的快捷方式,具体创建过程( addShortcut() )就是把快捷方式的信息传入数据库( addItemToDatabase() )。
(5) UninstallShortcutReceiver :
同理,UninstallShortcutReceiver() 继承自 BroadcastReceiver() ,实现 onReceiver() 方法。定义一个 ContentResolver 对象完成对数据库的访问和操作(通过 URI 定位),进而删除快捷方式 。
(6) LauncherProvider :
继承自ContentProvider() ,主要是建立一个数据库来存放 HomeScreen 中的数据信息,并通过内容提供者来实现其他应用对 launcher 中数据的访问和操作。
重写了ContentProvider() 中的方法 :
getType():返回数据类型。如果有自定义的全新类型,通过此方法完成数据的访问。
query():查询数据。传入 URI ,返回一个 Cursor 对象,通过 Cursor 完成对数据库数据的遍历访问。
I nsert():插入一条数据。
bulkInsert():大容量数据的插入。
delete():删除一条数据。
update():更改一条数据。
sendNotify():发送通知。
类DatabaseHelper 继承自一个封装类 SQLiteOpenHelper(), 方便了数据库的管理和维护。
重写的方法:
onCreate():创建一个表。其中 db.execSQL() 方法执行一条 SQL 语句,通过一条字符串执行相关的操作。当然,对 SQL 基本语句应该了解。
onUpgrade():升级数据库。
对HomeScreen 数据库操作的一些方法:
addClockWidget(),addSearchWidget,addShortcut,addAppShortcut,
loadFavorites(),launcherAppWidgetBinder(),convertWidget(), updateContactsShortcuts (),
copyFromCursor( )
补充:
类 AddAdapter (AddAdapter.java)列出了这四个类型对象。当用户在桌面空白处长按时,下列函数序列被执行:
Launcher::onLongClick -->
Launcher::showAddDialog -->
Launcher::showDialog(DIALOG_CREATE_SHORTCUT); -->
Launcher::onCreateDialog -->
Launcher::CreateShortcut::createDialog:这个函数创建一个弹出式对话框,询问用户是要添加什么(快捷方式,appwidget, 文件夹和墙纸)其内容就来自AddAdapter。
类 DesktopItemsLoader 负责将桌面上所有的对象从content provider中提取。
线程private
ApplicationsLoader
mApplicationsLoader负责从包管理器中获取系统中安装的应用列表。(之后显示在AllAppsGridView上)。ApplicationsLoader::run实现:
1)通过包管理器列出系统中所有类型为Launcher,action为MAIN的activity;
2)对每一个Activity,
a) 将Activity相关元数据信息,如title, icon, intent等缓存到appInfoCache;
b) 填充到ApplicationsAdapter 中。填充过程中用到了一些小技巧,每填充4(UI_NOTIFICATION_RATE)个activity更新一下相应view。
在Launcher::onCreate中,函数startLoaders被调用。而该函数接着调用loadApplications和loadUserItems,分别获取系统的应用列表,以及显示在桌面上的对象列表(快捷方式,appwidget,folder等)。
Launcher
上排列的所有应用图标由AllAppsGridView对象呈现。这个对象是一个GridView。其对应的Adapter是
ApplicationsAdapter,对应的model则是ApplicationInfo数组。数组内容是由ApplicationsLoader
装载的。
发表评论
-
onInterceptTouchEvent和onTouchEvent调用时序
2012-02-08 08:44 1046onInterceptTouchEvent和onTouchEv ... -
Android2.2.1广播大全
2012-01-11 17:29 914Android2.2.1广播大全 博 ... -
Android Gesture Detector
2012-01-06 16:09 1208Android Gesture Detector * ... -
在程序中设置android:gravity 和 android:layout_Gravity属性
2012-01-06 10:04 1571【Android布局】在程序中 ... -
Android应用程序基础 >> 任务栈和亲属关系(Activities and Tasks)
2012-01-05 10:26 1147Android应用程序基础 >& ... -
android 中使用socket使native和framework通信
2011-09-01 10:14 1202android 中使用socket使native和frame ... -
android aidl iBinder理解
2011-06-01 11:51 2063在android中有一个程序员大量使用的操作,就是bindse ... -
Android开发者指南(6) —— AIDL
2011-05-31 10:59 1293Android开发者指南(6) —— AIDL ... -
android 线程间的通信
2011-05-20 13:22 895近来找了一些关 ... -
Android Service学习之AIDL, Parcelable和远程服务
2011-05-20 11:51 1072AIDL的作用 由于每个应用程序都 ... -
有关Android线程的学习
2011-05-20 11:20 10361. Android进程 在了解Android ... -
(转载)Android下Affinities和Task
2011-05-19 16:30 858(转载)Android下Affinities和Tas ... -
Android的Launcher成为系统中第一个启动的,也是唯一的
2011-05-12 19:38 2169Android的Launcher成为系统 ... -
android中使用jni,ndk的C语言回调方法
2011-05-12 19:19 6559android中使用jni,ndk的C ... -
典型应用之——将库打进apk
2011-05-12 19:19 2883典型应用之——将库打进apk (2010-12-17 1 ... -
一个打通jni,java framework,application三层的练习
2011-05-10 10:58 1165转自:http://blogold.chinaunix ... -
android eclipse 和 源码 情况下 引用第三方jar
2011-05-10 10:55 2480android eclipse 和 源码 情况 ... -
1.系统属性获取及设置中的设置值
2011-04-21 15:04 35161.系统属性获取及设置 android.os.SystemP ... -
给应用签名 uid.system platform 权限
2011-04-21 14:58 1480在生成的apk目录下放 signapk.jar platfo ... -
binder理解
2011-03-30 10:37 2226Binder理解 例子代码: /** {@hide} ...
相关推荐
通过处理消息队列来实现对Launcher启动过程的监控。 ##### 回到ActivityManagerService.startHomeActivityLocked 这是启动Launcher的另一个重要环节,确保系统能够正确识别并启动Launcher。 ##### ...
5.1 使用`adb shell am start -W`命令,可以查看 Launcher 启动过程的详细性能数据,帮助优化启动时间。 5.2 如果需要调试特定的Intent处理,可以在模拟器上长按应用图标,选择“Open with”选项,然后选择调试版的...
**Launcher 启动过程** - Launcher 的启动涉及 Android 系统服务的初始化,包括 ActivityManagerService 和 PackageManagerService。 - 主Activity(Launcher)在系统启动后被启动,通过 Intent ACTION_MAIN 和 ...
Android 系统启动流程是一个复杂的过程,从 SystemServer 开始到 Launcher 的启动涉及到多个组件和服务的协作。本文将详细介绍 Android 系统从 SystemServer 开始的 Launcher 启动流程,并对其中的关键组件和服务...
#### 一、Launcher启动过程解析 Android Launcher 的启动流程是一个非常重要的概念,对于理解Android系统的启动机制以及如何定制自己的Launcher应用有着关键的作用。 **1.1 Linux Kernel 启动与Android Runtime ...
"需要清空别的文件 直接升级" 表明在升级过程中,用户需要确保U盘内没有其他无关文件,以保证升级过程的顺利进行,且原有数据将被保留,这意味着Car Launcher在升级时对用户个人设置的兼容性较好。 【标签】 虽然...
### Android启动Launcher详解 #### 一、LauncherApplication的初始化过程 ...通过以上步骤,Launcher完成了从启动到展示桌面的整个过程。这一系列操作确保了用户能够快速且流畅地访问他们常用的程序和功能。
Android 应用程序启动优化之冷启动和热启动详解 一、应用程序启动方式 ...了解 Android 应用程序的启动过程对于优化应用程序的性能非常重要,可以根据应用程序的启动方式和启动过程来进行相应的优化处理。
通过对Zygote启动流程以及systemServer和Home Activity启动过程的详细解析,我们不仅了解了Android系统启动过程中的关键步骤和技术细节,还深入了解了ART虚拟机的工作原理。这些深入的理解对于开发者来说至关重要,...
"机顶盒launcher"是一种专为智能电视或机顶盒设计的应用启动器,它采用了"tab+viewpager"的组合模式来提供用户界面。在Android系统中,Launcher是用户与设备交互的入口,用于展示和启动各种应用程序。下面将详细探讨...
对于《米家游戏启动器》这样的游戏启动器来说,开发者可能会利用.NET的多线程能力优化游戏的下载和更新过程,同时利用C#的强类型和面向对象特性来组织和管理复杂的游戏数据。 "说明.txt"文件通常是提供关于压缩包...
在开发和调试Java应用程序时,理解Java Launcher的工作机制可以帮助我们更好地控制程序的启动过程,解决类加载、依赖管理和性能优化等问题。 此外,Java Launcher还与Java的模块系统(Java Platform Module System...
同时,我们还需要了解 Android 系统的启动过程,包括 Linux Kernel 的启动、App_main 进程的初始化、zygote 的 fork 过程、Activity Manager 的启动等。只有了解这些基础知识,我们才能开发出一个功能强大且美观的 ...
1、Launcher进程启动过程 当用户按下桌面应用图标时,系统会启动一个新的进程用于运行Launcher应用。这个过程中,系统会加载必要的资源和组件,准备启动界面。 2、Launcher初始化――LauncherApplication ...
4. **Intent解析**:分析Intent的创建和解析过程,理解如何通过Intent启动不同应用。 5. **内存管理**:学习Android的内存管理和垃圾回收机制,优化Launcher3的性能。 6. **动画效果**:查看源码中如何实现平滑的...
Launcher3的启动流程(一) 细说ItemInfo Launcher3的启动流程(二) Launcher3分析之拖动图标的流程——按下 Launcher3分析之拖动图标的流程——移动 Launcher3分析之拖动图标的流程——放下 PagedView的原理 – ...
这一过程涉及到ActivityManagerService的调度,以及Intent的解析,源码中的`com.android.launcher2.Launcher$LoaderCallbacks`类处理了数据加载的逻辑。 6. **动态壁纸与小部件** Android 2.2支持动态壁纸和小部件...
用户可以通过Launcher启动其他应用程序,设置桌面壁纸,以及管理手机上的应用。 当我们谈论基于Android Studio(简称AS)的Launcher源码调试时,这意味着我们将使用Google提供的强大集成开发环境(IDE)来分析和...
当Launcher启动时,它需要加载壁纸、快捷方式、文件夹等大量数据。这个过程由ContentProvider、Loader和CursorAdapter共同完成。ContentProvider负责从系统数据库中读取数据,Loader则在后台线程中异步加载数据,...
分析Android Activity的启动过程 Android Activity的启动过程是一个复杂的过程,涉及到多个组件之间的交互和协作。本文将从源码的角度分析Activity的启动过程,并详细介绍其中的每一个步骤。 步骤1: Launcher向...