Android launcher 开发笔记(三) 启动过程分析 part 1
2016-07-21 14:32
363 查看
在启动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之后再续。
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之后再续。
相关文章推荐
- Andriod界面设计适配和Android Studio中的资源
- Android launcher 开发笔记(三) 启动过程分析
- androidstudio类注释模板创建
- Android第一周(第二部分)-Intent和Activity生命周期
- Android Process 详解
- Android定位的实现
- Android_学习安卓必备网址
- java.lang.ClassCastException: android.app.Application cannot be cast to 异常
- AIDL的android:process的理解
- Android 数据库ORMLite用法
- 初识Android之(二)- 实现Service AIDL小Demo
- Android自定义流式标签控件
- 带返回值跳转的->安卓
- Material Design系列,自定义Behavior实现Android知乎首页
- Android表情解决方案
- android:process用于在新进程中启动Activity
- Android ListView分两列显示(不用自定义Adapter)
- android-auto-scroll-view-pager (无限广告轮播图)
- Android中ExpandableListView常用属性总结
- Part1:Volley磁盘缓存