第1章  Launcher的诞生

1.1 Framework启动Launcher流程

1.2 Launcher自身启动流程

App-Launcher-数据加载和UI绑定

目录 [隐藏]

1 1.Launcher桌面数据和主菜单数据加载流程

1.1 1.1 加载主菜单数据

1.1.1 1.加载调用流程

1.2 1.2 加载桌面数据

1.3 1.3 插入SIM卡时候的数据加载的问题

1.4 1.4 经典Bug

1.4.1 166085

[编辑]1.Launcher桌面数据和主菜单数据加载流程[编辑]1.1 加载主菜单数据PackageManager中加载应用程序数据结构,AppwidgetsManager中加载小部件数据结构,从Favorites数据库中加载桌面数据结构

[编辑]1.加载调用流程LoaderTask一个任务是加载桌面,一个任务是加载抽屉,同步(一个接一个)进行。LauncherModel:waitForIdle()方法用于等待桌面加载完成再加载抽屉。

等待从favorite表中loadAndBindWorkspace的完成,即完成 桌面的数据 从数据库到内存对象的加载,并且已经显示到了桌面Workspace,

然后开始loadAndBindAllApps加载主菜单的数据(PackageManager) ,在launcher-loader 子线程获取数据后通过mHandler.postIdle() mHandler.post()将任务post到主线程任务队列DefferedHandler:mQueue中更新UI。

/** Runs the specified runnable immediately if called from the main thread, otherwise it is

* posted on the main thread handler. */

private void runOnMainThread(Runnable r) {

if (sWorkerThread.getThreadId() == Process.myTid()) {

// If we are on the worker thread, post onto the main handler

mHandler.post(r);

} else {

r.run();

}

}

/** Runs the specified runnable immediately if called from the worker thread, otherwise it is

* posted on the worker thread handler. */

private static void runOnWorkerThread(Runnable r) {

if (sWorkerThread.getThreadId() == Process.myTid()) {

r.run();

} else {

// If we are not on the worker thread, then post to the worker handler

sWorker.post(r);

}

}

当用户点击主菜单按钮的时候,将loadAllAppsByBatch获得的数据与PagedViewIcon绑定。 AppsCustomizePagedView:syncAppsPageItems将ApplicationInfo数组构建每一个 PagedViewIcon并添加到PagedViewCellLayout。

for (int i = startIndex; i < endIndex; ++i) {

ApplicationInfo info = mApps.get(i);

PagedViewIcon icon = (PagedViewIcon) mLayoutInflater.inflate(

R.layout.apps_customize_application, layout, false);

icon.applyFromApplicationInfo(info, true, this);

pagedViewCellLayout.addViewToCellLayout(icon, -1, i, new PagedViewCellLayout.LayoutParams(x,y, 1,1));

items.add(info);

images.add(info.iconBitmap);

}

LoaderTask:run()--->LoaderTask:loadAndBindAllApps()--->LoaderTask:loadAllAppsByBatch()--->

Launcher:bindAllApplications()--->AppsCustomizePagedView:setApps()--->AppsCustomizePagedView:invalidateOnDataChange()

在点击“主菜单”按钮之前, AppsCustomizePagedView没有任何 Child.点击之后执行时序如下: AppsCustomizeTabHost.onMeasure(...)--->AppsCustomizePagedView.onMeasure(...)--->AppsCustomizePagedView.onDataReady(...)--->(AppsCustomizePagedView)PagedView.invalidatePageData--->AppsCustomizePagedView:syncPages()

[编辑]1.2 加载桌面数据LauncherModel:startLoader--->LoaderTask:bindWorkspace--->LoaderTask:bindWorkspaceItems--->Launcher:bindItems

[编辑]1.3 插入SIM卡时候的数据加载的问题1.Launcher因为低内存会导致Launcher Activtiy 执行onDestory() onCreate(),会再次执行

startLoader-->loadAndBindWorkSpace---->loadAndBindAllApps

2.Launcher 注册了act=android.intent.action.CONFIGURATION_CHANGED Reload apps on config change. curr_mcc:460 prevmcc:0 当识别SIM 的时候也会执行

startLoader-->loadAndBindWorkSpace---->loadAndBindAllApps

但是这两种情况导致startLoader调用的时候mAllAppsLoaded==false,mWorkspaceLoaded==false 所以其实是在执行如下,不会重新加载数据结构ArrayList

startLoader-->BindWorkSpace---->onlyBindAllApps

--------------------------------------------------------------------------------

private void loadAndBindAllApps() {

if (DEBUG_LOADERS) {

Log.d(TAG, "loadAndBindAllApps mAllAppsLoaded=" + mAllAppsLoaded);

}

if (!mAllAppsLoaded) {

loadAllAppsFromPersistence();

loadAllAppsByBatch();

synchronized (LoaderTask.this) {

if (mStopped) {

return;

}

mAllAppsLoaded = true;

}

} else {

onlyBindAllApps();

}

}

--------------------------------------------------------------------------------

[编辑]1.4 经典Bug[编辑]166085Launcher:onCreate()---new Thread--->startLoader--->读favoriteDB--->post(bindItem)

|

Launcher:onReume()----new Thread--->getMissedCallCount--->post(updateCallLogIcon)------>workspace:updateShortCut()

当来电 启动 InCallScreen 的时候 会执行Launher:onDestory,挂了电话会执行Launcher:onCreate 由于startLoader消耗的时间 要比getMissedCallCount 长,导致post(updateCallLogIcon)先被执行, 可是这个时候桌面的图标没有被bind,导致没有将未接来电的图标进行更新。

第2章 Launcher布局与视图

2.1 hierarchyviewer研究launcher.xml布局

在Android的SDK工具包中,有很多十分有用的工具,可以帮助程序员开发和测试Android应用程序,大大提高其工作效率。其中的一款叫Hierachy Viewer的可视化调试工具,可以很方便地在开发者设计,调试和调整界面时,提高用户的开发效率。

第3章  Launcher View拖拽详解

第4章  Launcher AppWiget架构

第5章  桌面缩略图实现

android启动器开发,Android启动器(Launcher)开发详解相关推荐

  1. 必过SafetyNet!以MIUI开发版系统为例详解Android设备通过SafetyNet校验方法

    必过SafetyNet!以MIUI开发版系统为例详解Android设备通过SafetyNet校验方法 作者 梓沐啊_(KylinDemons) 版权声明 Copyright © 2021 KylinD ...

  2. android什么控件能够输入多行文字,Android开发:文本控件详解——EditText(一)基本属性...

    一.简单实例: EditText输入的文字样式部分的属性,基本都是和TextView中的属性一样. 除此之外,EditText还有自己独有的属性. 二.基本属性: hint 输入框显示的提示文本 te ...

  3. Android NDK开发之旅(3): 详解JNI数据类型与C/C++、Java之间的互调

    Android NDK开发之旅(3):详解JNI数据类型与C/C++.Java之间的互调 (码字不易,转载请声明出处:http://blog.csdn.net/andrexpert/article/d ...

  4. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  5. 【转】Android APK反编译就这么简单 详解(附图)

     转自:http://blog.csdn.net/vipzjyno1/article/details/21039349/ [置顶] Android APK反编译就这么简单 详解(附图) 分类: and ...

  6. Android JNI使用方法,JNI机制详解

    Android JNI使用方法,JNI机制详解 JNI的出现使得开发者既可以利用Java语言跨平台.类库丰 富.开发便捷等特点,又可以利用Native语言的高效. JNI是JVM实现中的一部分,因此N ...

  7. Android性能优化之APK瘦身详解(瘦身73%)

    image 公司项目在不断的改版迭代中,代码在不断的累加,终于apk包不负重负了,已经到了八十多M了.可能要换种方式表达,到目前为止没有正真的往外推过,一直在内部执行7天讨论需求,5天代码实现的阶段. ...

  8. Android 各大厂面试题汇总与详解(持续更新)

    介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...

  9. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  10. android中怎么网络判断,Android中判断网络是否连接实例详解

    Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...

最新文章

  1. JDK8对并发的新支持
  2. CentOS7添加中文输入法
  3. [CTSC2017]吉夫特
  4. java mysql settings_Java中使用MySQL从安装、配置到实际程序测试详解
  5. 如何看待李开复演讲称早期帮旷视拿了蚂蚁金服大量人脸数据,以及李开复、蚂蚁和旷视的澄清?该如何保护隐私?...
  6. 洛谷 P1508 Likecloud-吃、吃、吃
  7. echarts柱状图的数据差距过大影响美观
  8. Bash:把粘贴板上的内容拷贝的文件中。
  9. 用gdb调试动态链接库
  10. 使用HTML5,CSS3和jQuery增强网站用户体验
  11. python 身份证识别_Card-Ocr:身份证识别 OCR
  12. HTMLTestRunner文件
  13. 数据库实验五-数据库设计实验
  14. cmd检查java_如何通过cmd查看java环境
  15. Qt调节电脑屏幕亮度
  16. oracle12c用plsql连不上,plsql developer 连不上11G64位ORACLE
  17. 计算机维护工具全能版,USBOS V3.0彪悍版
  18. 【微信推送】微信专属推送——改源码教程
  19. hdu 5418 Victor and World (floyd+状压dp)
  20. 使用路由器后,上网速度比较慢(下载慢、延迟大)?

热门文章

  1. 再看《周渔的火车》 转载一篇不错的影评
  2. MFC单文档应用程序的基础
  3. 为何汽车制造商需要关注HTML5
  4. 阿里巴巴面试题- - -多线程并发篇(三十七)
  5. 简单选择排序显示第K趟
  6. Cozmo人工智能机器人SDK使用笔记(4)-任务部分cubes_and_objects
  7. Web网站开发中,Cookie是什么?
  8. 上海爱数前端面试总结
  9. WARN NetworkClient: [Consumer clientId=consumer-g1-1, groupId=g1] Error connecting to node
  10. TEF(Tensorflow Extend Framework):大规模推荐系统深度学习解决方案