Launcher3的启动流程(一)

于 2014年03月23日 发布在 android开发 跳到评论

(系列文章点这里)

Launcher3作为一个用户经常使用,常驻内容的应用,运行时维护着许多信息,而这些信息都需要在开机的时候加载完,今天就来分析下Launcher3是怎样一步一步启动的。

如果你手里还没有源码,请点击这里,编译并让他在你的手机上运行。然后打开Eclipse,一步步跟着走。

在启动Launcher这个Activity之前,先看下桌面的LauncherApplication吧,任何一个组件(Component)启动之前都会启动他的。代码只有寥寥几行。

LauncherAppState我们在上一篇博客里面说过,主要用来初始化对象,注册广播接收器等等,这些都在他的构造方法里面完成了。这里监听的广播有应用的安装、卸载和更新,SD卡上应用的可用或不可用,地区变化和配置变化等等。接收应用安装更新什么的广播,都是为了方便实时更新桌面上的图标,如果用豌豆荚安装了应用会在桌面上马上显示出来,这都是这些个广播接收器在发挥作用。需要注意的是贯穿始终的LauncherModel就是在这个构造方法里初始化的。

准备工作做好了,就开始启动Launcher Activity。Activity的启动从onCreate开始查找。

和helloworld程序不同的是,Launcher是在做了一系列初始化操作之后才进行setContentView,目的应该是方便界面上的View来获取初始化的这些对象。我们从一些成员的初始化开始看起。

  • mSharedPrefs: 之前我们说过,桌面在第一次启动的时候会有一个指导界面,告诉用户怎么使用,在以后的启动中,就不会再出现了。控制这个逻辑就是通过SharedPreference,他以key-value的形式把信息存储到一个xml文件当中。
  • mModel: LauncherModel的对象,他是通过LauncherAppState.setLauncher(..)方法获得的,在其中执行了LauncherModel.initialize(..)方法,他给LaucherModel传递了一个CallBacks对象(在Launcher.java中定义)。为什么要传这个对象呢,因为LauncherModel主要是负责数据层的东西,界面方面的操作都交给了Launcher来做,那当LauncherModel需要更新界面的时候怎么操作呢,就是通过调用这些个回调函数来完成的。
  • mIconCache: 从名字就可以看出是用来做缓存的,桌面的图标这么多,IconCache用来提高性能。
  • mDragController: 用来控制拖拽对象的东西,到后面会和DragLayer结合起来。
  • mInflater: 在图标加载的时候,会一个一个去生成BubbleTextView,而这些都是通过mInflater.inflate(..)方法从xml生成出来的,使用次数还是挺多的,详情参加Launcher.creatShortcut方法。
  • mAppWidgetManager用来管理小工具,mAppWidgetHost用来生成小工具的View对象并更新。

下面就到setContentView(R.layout.launcher)了,显示界面,有了界面之后会通过setupViews()方法吧view对象和之前初始化过的DragController等东西结合起来。跳进函数看一下,一大溜的findViewById,为的就是获取UI对象。我们在 这篇 里面讲述的界面元素的对象基本都是在这里获得的,基本上都会通过setup方法和DragController联系起来,然后设置下onClickListener,onLongClickListener。

下面是往下走最重要的地方了,找到LauncherModel的startLoader方法调用地方。接下来整个过程都跳转到LauncherModel里面了,在这里会读取数据库,确定哪些东西要加载到桌面上,加载的顺序等等。显示到UI是在Launcher里面的,而这中间的桥梁,就是上文提到的Callbacks,这桥梁上传递的东西,就是ItemInfo,我将会在下一篇博文中详细讲解ItemInfo。而桌面启动流程的后半截,会在ItemInfo之后再续。

PS:不太喜欢帖代码,格式容易搞乱,真心希望你能下载代码在eclipse上跟着代码一步一步走。

本文共有 7条评论 | 沙发:文章评论

  1. 492626097说道:

    跟踪的时候太别容易断掉,如何破?

  2. 大哥说道:

    application在哪里,怎么没有发现 :?:

  3. 大哥说道:

    对比了4.4launcher3, 的确有application, 就LauncherAppState.getInstance();

  4. 刘洋说道:

    大神 看你的博客太棒了 方便家QQ吗?

留下评论!

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)