最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程。 Launcher其实是贯彻于手机的整个系统的,时时刻刻都在运行,要是Launcher不运行了,手机就得黑屏了。Launcher的 LauncherMode=singletask,所以说不管Launcher启动了哪个应用,总有个Launcher的实例在堆栈中,并且位于栈底。点 击Home键进入到Launcher,上篇Android的全局键(home键/长按耳机键)详解【android源码解析八】中有详细的介绍。大致思路其实就是启动launcher的时候,新启动一个task。大致先说这么多,先看截图:

图(1)

上图是4.0的Launcher界面,下面我们分步来解析一下Launcher的启动过程。

Step 0:首先要给大家介绍一下Launcher的数据库,这个数据库中存放着待机界面的图标,主屏底部的应用程序图标和桌面folder中各应用程序的图 标,ICS4.0的folder中只能放应用程序的快捷方式,shortcut不能放到这个folder中,先看截图:

图(2)

说说各字段的含义:

title:表示桌面应用程序的名字,有的title为空,表示是widget的快捷方式;

intent:表示启动这个图标的intent放到数据库中,当click的时候就会调用这个字段,启动相应的应用程序;

container:表示应用程序的容器,folder的容器为整数,-100:表示在桌面的程序,-101:表示是主屏底部的程序;

screen:表示在第几个屏,folder的screen都是0, container=-101的为0,1,3,4;2为allapp的按钮;

cellX:表示在屏幕X轴的位置,(0,1,2,3),左上角为0点,往右依次增加;

cellY:表示在屏幕Y轴的位置,(0,1,2,3),左上角为0点,往下依次增加;

spallX:表示占X轴几个格;

spallY:表示占Y轴几个格;

itemType:应用程序用0表示,shortcut用1表示,folder用2表示,widget用4表示;

appWidgetId:-1表示不是widget,数字大于0表示才是widget;

isShortCut:值为0表示不是应用程序的ShortCut,值为1表示是应用程序的ShortCut;

iconType:值为0表示图标的名字被定义为包名的资源id,值为1表示图标用bitmap保存;

icon:表示应用程序的图标,二进制的;显示为一张图片;

说明:folder中的应用快捷方式绑定folder---->是用container的值绑定folder的id的;

详细的讲解请参考LauncherSettings.java这个类,有数据库字段的详细讲解;

手 机是在第一次烧机完成后,数据库的值还没有,这时候launcher解析default_workspace.xml把这个值存到数据库中;所以说想定制 什么样的开机桌面就在default_workspace.xml中做相应的配置,具体参照我前面的博客:

Android中源码Launcher主屏幕程序排列详解【安卓Launcher进化一】中有详细的介绍:

i f (!convertDatabase(db)) {
                 // Populate favorites table with initial favorites
                loadFavorites(db, R.xml.default_workspace);
        }

Step 1:开机后先启动LauncherApplication.java这个类的onCreate()方法,下面看代码:

Step 2:在LauncherApplication.java中onTerminate()的方法,解除监听的绑定;

 

  1. /**
  2. * There's no guarantee that this function is ever called.
  3. */
  4. @Override
  5. public void onTerminate() {
  6. super.onTerminate();
  7. unregisterReceiver(mModel);
  8. ContentResolver resolver = getContentResolver();
  9. resolver.unregisterContentObserver(mFavoritesObserver);
  10. }

 

Step 3:Step1中的数据库mFavoritesObserver监听内部类如下:

  1. /**
  2. * Receives notifications whenever the user favorites have changed.
  3. */
  4. private final ContentObserver mFavoritesObserver = new ContentObserver(new Handler()) {
  5. @Override
  6. public void onChange(boolean selfChange) {
  7. mModel.startLoader(LauncherApplication.this, false);
  8. }
  9. };

Step 4: 接着我们来看看mModel.startLoader(LauncherApplication.this, false)的方法:

  1. public void startLoader(Context context, boolean isLaunching) {
  2. synchronized (mLock) {
  3. if (DEBUG_LOADERS) {
  4. Log.d(TAG, "startLoader isLaunching=" + isLaunching);
  5. }
  6. // Don't bother to start the thread if we know it's not going to do anything
  7. if (mCallbacks != null && mCallbacks.get() != null) {
  8. // If there is already one running, tell it to stop.
  9. // also, don't downgrade isLaunching if we're already running
  10. isLaunching = isLaunching || stopLoaderLocked();
  11. mLoaderTask = new LoaderTask(context, isLaunching);
  12. sWorkerThread.setPriority(Thread.NORM_PRIORITY);
  13. sWorker.post(mLoaderTask);
  14. }
  15. }
  16. }

Step 5:接着我们来看看LoaderTask.java的run()方法:

加载桌面图标对应的数据库的值,这些值能把这些图标显示在屏幕上。

Step 6:LauncherApplication.onCreate()方法启动完成后,接着开始调用Launcher.java的onCreate()方法。代码如下:

Step 7:其中LauncherModel这个类中有个回调接口,具体定义如下:

对LauncherModel进行初始化的时候mModel = app.setLauncher(this);---->mModel.initialize(launcher);----->

public void initialize(Callbacks callbacks) {
                      synchronized (mLock) {
                              mCallbacks = new WeakReference<Callbacks>(callbacks);
                       }
               }

这 个callbacks就是定义的接口回调,具体实现是在Launcher.java中定义的,启动Launcher的过程中,这些实现是异步来实现的。还 有Launcher.java的onResume()方法没有讲解,到这儿基本上Android的Launcher已经启动起来了,这个 onResume()我研究后再更新。

欢迎各界同僚留言指正错误和拍砖!欢迎留言!

Android4.0源码Launcher启动流程分析【android源码Launcher系列一】的更多相关文章

  1. Spring源码解析02:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  2. Spring源码解析 | 第二篇:Spring IOC容器之XmlBeanFactory启动流程分析和源码解析

    一. 前言 Spring容器主要分为两类BeanFactory和ApplicationContext,后者是基于前者的功能扩展,也就是一个基础容器和一个高级容器的区别.本篇就以BeanFactory基 ...

  3. 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(下)

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/12/es-code03/ 前提 上篇文章写完了 ES 流程启动的一部分,main 方法都入 ...

  4. 渣渣菜鸡的 ElasticSearch 源码解析 —— 启动流程(上)

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/08/11/es-code02/ 前提 上篇文章写了 ElasticSearch 源码解析 -- ...

  5. Netty 源码学习——客户端流程分析

    Netty 源码学习--客户端流程分析 友情提醒: 需要观看者具备一些 NIO 的知识,否则看起来有的地方可能会不明白. 使用版本依赖 <dependency> <groupId&g ...

  6. Netty 拆包粘包和服务启动流程分析

    Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你能掌握EventLoopGroup的工作流程,ServerBootstrap的启动流程,ChannelPipeline是如何操作管理Ch ...

  7. Uboot启动流程分析(转载)

    最近一段时间一直在做uboot移植相关的工作,需要将uboot-2016-7移植到单位设计的ARMv7的处理器上.正好元旦放假三天闲来无事,有段完整的时间来整理下最近的工作成果.之前在学习uboot时 ...

  8. 【转】Netty 拆包粘包和服务启动流程分析

    原文:https://www.cnblogs.com/itdragon/archive/2018/01/29/8365694.html Netty 拆包粘包和服务启动流程分析 通过本章学习,笔者希望你 ...

  9. imx6 uboot启动流程分析

    参考http://blog.csdn.net/skyflying2012/article/details/25804209 这里以imx6平台为例,分析uboot启动流程对于任何程序,入口函数是在链接 ...

随机推荐

  1. What is the Linux High Availabi

    What is the Linux High Availabi    简介:     高可用性群集的出现是为了使群集的整体服务尽可能可用,以便考虑计算硬件和软件的易错性.如果高可用性群集中的主节点发生 ...

  2. 感觉比较好一些的vultr中文网

    搜索一波vultr的中文网,发现很多,基本上都是靠活动以及一些SS的教程维持,全都是大同小异,感觉比较有可比性估计一下这个: https://www.thevultr.org/ 可以对比一些美国常用V ...

  3. Linux下使用SSH远程执行命令方法收集

    说明:可以做SSH免密登录之后执行,这样可以省去每次执行输入密码的提示. 对于简单的命令: 如果是简单执行几个命令,则: ssh user@remoteNode "cd /home ; ls ...

  4. ios开发中object-c中UTF-8 和 GBK 的 NSString 相互转化的方法

    应用都要遇到一个很头疼的问题:文字编码,汉字的 GBK 和 国际通用的 UTF-8 的互相转化稍一不慎, 就会满屏乱码.下面介绍 UTF-8 和 GBK 的 NSString 相互转化的方法   NS ...

  5. JSP入门详解

    一.基础知识详解 1.JSP中使用html注释<!-- -->客户端可见,使用jsp注释<%-- --%>客户端不可见(查看源文件只看到空行),单行和多行注释也看不到(//或者 ...

  6. WebService如何抛出干净的异常

    转载:http://www.cnblogs.com/ahdung/p/3953431.html 说明:[干净]指的是客户端在捕获WebService(下称WS)抛出的异常时,得到的ex.Message ...

  7. Ext的表格控件如何绑定

    1. XML数据源 假设我们有一个数据源是以XML的形式存在的,我们需要从里面取出数据并绑定在界面.XML的结构如下: </age>  <name>石曼迪</name&g ...

  8. thinkphp输出表格

    //这是打印5列n行的表格,所以mod="5" value="4" <tr> <volist name="data" id ...

  9. 类似于GROUP BY SUM() 用于字符串连接的语句

    CREATE TABLE T ( [f1] VarCHAR(100), [f2] VarCHAR(100))goINSERT INTO T   VALUES ('a','abc')INSERT INT ...

  10. js定义对象并赋值

    1.可以通过  var ratio = {}; ratio.low = 70; ratio.high = 90; ratio.scale = 0.2; 2.可以通过 var obj = new Obj ...