所谓兵马未动,粮草先行,在了解launcher的细节之前,我们首先需要完成对一些知识 的扫盲。当然这些知识我们都可以在SDK guide大叔那边找到,俺可以很负责任地告诉大家,如果你把SDK guide大叔的三板斧都学会了,APK你基本就处于无敌状态了,绝对护甲+10000,最起码基础 知识是够了,其他比的就是创意了:
1、必须比较完整地了解APK的4个部件,尤其是Activity,现在可以简单地理解Activity是一个应用程序的窗口。
2、必须了解UI的那部分内容,这部分内容是比较多的,English一般的我看得是比较抑郁的,但如果你想设计一个符合自己审美要求的美女或者帅哥是必须得得了解的,不需要一下能完全理解,但至少出了问题你知道去哪部分查~~
3、Resources那部分内容可以当百科全书查
4、intent那部分内容也是需要了解比较详细的,他是和应用沟通的渠道,大家可以参考一下小斯大虾写的文档。
5、manifest必须了解,security可以看看
6、Graphic部分的内容是给需要更高品味的GUI设计提供的,虽然它可能主要用在游戏上面,但我觉得如果要作出够酷的GUI肯定是需要2d,3d引擎的。
7、AppWidget可以作为了解,用的时候再翻阅
各位路过的大虾们肯定被这么多的粮草给直接雷倒了,其实需要我们详细掌握的是1和2,其他的都可以当作百科全书,但是如果能仔细地看透了那是最好了。
好,万事俱备只欠东风了,我们首先来看看这个Home是在啥时候由谁来启动的。这部分知识可以跳过,但是理解一下是好的,你可以了解一个APK进程是如何怀胎十月之后诞生的。可能下面说到的词汇有些生涩,所以建议先看看Android Anatomy and Physiology.pdf。
Linux kernel启动以后会通过App_main进程来初始化android Runtime Java 运行环境,而zygote是android的第一个进程。所有的android的应用以及大部分系统 服务都是通过zygote fork出来的子进程(我现在看到的只有native的service manager不是由zygote fork出来的)。在system server中启动的若干系统服务中与我们启动进程相关的就是Acitivity Manager。
当systerm server启动好所有服务以后,系统就进入”system ready”状态,这个时候Activity Manager就登场了。Activity Manager光看代码行就知道是一个重量级的服务,它主要管理Activity之间的跳转,以及进程的生命周期。当Activity Manager发现系统已经启动好以后它就会发出一个intent:
Intent intent = new Intent(
mTopAction,
mTopData != null ? Uri.parse(mTopData) : null);
intent.setComponent(mTopComponent);
if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
intent.addCategory(Intent.CATEGORY_HOME);
}
通过这个category类型为home的intent,Activity
Manager就会通过:
startActivityLocked(null,
intent, null, null, 0, aInfo,null, null, 0, 0, 0, false, false);
启动Home进程了。而这个启动Home进程的过程实际上还是去通过zygote
fork出的一个子进程。因此只要在manifest中具备这样的intent-filter都可以在开机的时候作为Home启动:
Java代码:
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
多个home之间的switch会在开始的时候有个选择,至于这个选择好像是package manager来实现的,没有仔细研究过。
好啦,了解了Lancher 是如何执行的,我们再来看看整个lancher内部构造。看看一个lancher如何构造才算是个长得对得起观众的娃:
1、取得系统中所有安装好的应用程序,并提供能运行这些程序的映射(形象的理解就是一个一个应用程序的小图标)。这是Lancher的骨架,正所谓何谓lancher是吧~~如果它不能提供应用程序的访问,再好看也至多是一个华丽的花瓶而已,啥用米有。
2、更好一点我们就需要为这个设计良好的骨架提供一些画皮以及一系列动画效果,就是我们的wallpaper以及一系列的图像,animation,graphic之类的。如果完成这部分工作,基本上我们的Home就基本成型了。
3、要使得我们的GUI更具亲和性更方便使用,我们还提供一些额外的功能,比如说现在lancher实现的图标的拖动,快捷方式等等。这些都是仁者见仁智者见智的事情,取决你天马行空的设计了。