本文将带你了解Android应用开发Android 7.0 Launcher3的启动和加载流程分析,希望本文对大家学Android有所帮助。

Android

7.0

Launcher3的启动和加载流程分析,Launcher的本质就是一个普通应用,它比普通应用多配置了Category的Android:name=”android.intent.category.HOME”属性,之后ActivityManagerService的startHomeActivityLocked方法将启动含有这个属性的Activity。

boolean startHomeActivityLocked(int userId) {

if(this.mHeadless) {

this.ensureBootCompleted();

return false;

} else if(this.mFactoryTest == 1 && this.mTopAction == null)   {

return false;

} else {

Intent intent = new Intent(this.mTopAction, this.mTopData != null?Uri.parse(this.mTopData):null);

intent.setComponent(this.mTopComponent);

if(this.mFactoryTest != 1)   {

intent.addCategory("android.intent.category.HOME");

}

ActivityInfo aInfo =   intent.resolveActivityInfo(this.mContext.getPackageManager(), 1024);

if(aInfo != null) {

intent.setComponent(new ComponentName(aInfo.applicationInfo.packageName,   aInfo.name));

aInfo = new ActivityInfo(aInfo);

aInfo.applicationInfo = this.getAppInfoForUser(aInfo.applicationInfo,   userId);

ProcessRecord app = this.getProcessRecordLocked(aInfo.processName,   aInfo.applicationInfo.uid);

if(app == null || app.instrumentationClass == null) {

intent.setFlags(intent.getFlags() |   268435456);

this.mMainStack.startActivityLocked((IApplicationThread)null, intent, (String)null,   aInfo, (IBinder)null,   (String)null,   0, 0,   0, 0,   (Bundle)null,   false,   (ActivityRecord[])null);

}

}

return true;

}

}

接下来看看Launcher界面的划分。Launcher3实质其实就是一个Activity包含N个自定义的View。

结合图和布局文件可能更好理解Launcher3的界面

下面是Launcher3中一些类的大致含义:

Launcher:主界面Activity,最核心且唯一的Activity。

LauncherAppState:单例对象,构造方法中初始化对象、注册应用安装、卸载、更新,配置变化等广播。这些广播用来实时更新桌面图标等,其receiver的实现在LauncherModel类中,LauncherModel也在这里初始化。

LauncherModel:数据处理类,保存桌面状态,提供读写数据库的API,内部类LoaderTask用来初始化桌面。

InvariantDeviceProfile:一些不变的设备相关参数管理类,其内部包涵了横竖屏模式的DeviceProfile。

WidgetPreviewLoader:存储Widget信息的数据库,内部创建了数据库widgetpreviews.db。

LauncherAppsCompat:获取已安装App列表信息的兼容抽象基类,子类依据不同版本API进行兼容性处理。

AppWidgetManagerCompat:获取AppWidget列表的兼容抽象基类,子类依据不同版本API进行兼容性处理。

LauncherStateTransitionAnimation:各类动画总管处理执行类,负责各种情况下的各种动画效果处理。

IconCache:图标缓存类,应用程序icon和title的缓存,内部类创建了数据库app_icons.db。

LauncherProvider:核心数据库类,负责launcher.db的创建与维护。

LauncherAppWidgetHost:AppWidgetHost子类,是桌面插件宿主,为了方便托拽等才继承处理的。

LauncherAppWidgetHostView:AppWidgetHostView子类,配合LauncherAppWidgetHost得到HostView。

LauncherRootView:竖屏模式下根布局,继承了InsettableFrameLayout,控制是否显示在状态栏等下面。

DragLayer:一个用来负责分发事件的ViewGroup。

DragController:DragLayer只是一个ViewGroup,具体的拖拽的处理都放到了DragController中。

BubblTextView:图标都基于他,继承自TextView。

DragView:拖动图标时跟随手指移动的View。

Folder:打开文件夹展示的View。

FolderIcon:文件夹图标。

DragSource/DropTarget:拖拽接口,DragSource表示图标从哪开始拖,DropTarget表示图标被拖到哪去。

ItemInfo:桌面上每个Item的信息数据结构,包括在第几屏、第几行、第几列、宽高等信息;该对象与数据库中记录一一对应;该类有多个子类,譬如FolderIcon的FolderInfo、BubbleTextView的ShortcutInfo等。

了解上面这些类后,现在来看看Launcher3的启动流程:(小提示:若看不清图片可将网页放大至200%)

由于Launcher3也是一个Activity,其启动后首先会执行onCreate()方法,从流程图中可以看出在该方法里会调用LauncherAppState.getInstance()方法,Launcher3的各类数据的初始化和广播的注册都在这里被执行。随后执行LauncherModel

mModel =

app.setLauncher(this),将当前Launcher对象的引用传给LauncherProvider,在该方法里调用了LauncherModel的initialize(Callbacks

callbacks)方法,因为Launcher也实现了LauncherModel.Callbacks接口,因此这里将Launcher和LauncherModel建立了联系,LauncherModel中的所有操作都会通过Callbacks接口中的方法传给Launcher。可以来看看LauncherModel.Callbacks接口。

public interface Callbacks {

//如果Launcher在加载完成之前被强制暂停,那么需要通过这个回调方法通知Launcher

//在它再次显示的时候重新执行加载过程

public boolean setLoadOnResume();

//获取当前屏幕序号

public int getCurrentWorkspaceScreen();

//启动桌面数据绑定

public void startBinding();

//批量绑定桌面组件:快捷方式列表,列表的开始位置,列表结束的位置,是否使用动画

public void bindItems(ArrayList shortcuts,   int   start, int end,

boolean forceAnimateIcons);

//批量绑定桌面页,orderedScreenIds   序列化后的桌面页列表

public void bindScreens(ArrayList orderedScreenIds);

public void bindAddScreens(ArrayList orderedScreenIds);

//批量绑定文件夹,folders   文件夹映射列表

public void bindFolders(LongArrayMap   folders);

//完成绑定

public void finishBindingItems();

//批量绑定小部件,info 需要绑定到桌面上的小部件信息

public void bindAppWidget(LauncherAppWidgetInfo   info);

//绑定应用程序列表界面的应用程序信息,apps   需要绑定到应用程序列表中的应用程序列表

public void bindAllApplications(ArrayList   apps);

//批量添加组件

public void bindAppsAdded(ArrayList newScreens,

ArrayList   addNotAnimated,

ArrayList   addAnimated,

ArrayList   addedApps);

//批量更新应用程序相关的快捷方式或者入口

public void bindAppsUpdated(ArrayList   apps);

public void bindShortcutsChanged(ArrayList   updated,

ArrayList   removed, UserHandleCompat user);

<

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

android app启动流程分析,Android应用开发之Android 7.0 Launcher3的启动和加载流程分析...相关推荐

  1. Android 7.0 Launcher3的启动和加载流程分析----转载

     Android 7.0 Launcher3的启动和加载流程分析,Launcher的本质就是一个普通应用,它比普通应用多配置了Category的Android:name="android ...

  2. android显示通知图标大全,Android应用开发之android 桌面APP应用图标显示通知消息的数量显示与去除...

    本文将带你了解Android应用开发之android 桌面APP应用图标显示通知消息的数量显示与去除,希望本文对大家学Android有所帮助. android   桌面APP应用图标显示通知消息的数量 ...

  3. android签到功能开发,Android应用开发之Android简单实现app每月签到功能

    本文将带你了解Android应用开发Android简单实现app每月签到功能,希望本文对大家学Android有所帮助. 本文实例为大家分享了Android实现app每月签到功能的具体代码,供大家参考, ...

  4. android换肤的实现方案,Android应用开发之Android一键换肤功能实现

    本文将带你了解Android应用开发之Android一键换肤功能实现,希望本文对大家学Android有所帮助. < 市面上对数的App都提供换肤功能,这里暂且不讲白天和夜间模式 下图是网易云音乐 ...

  5. android studio开发工具介绍,Android应用开发之Android开发工具介绍、Android Studio配置...

    本文将带你了解Android应用开发之Android开发工具介绍.Android Studio配置,希望本文对大家学Android有所帮助. 2.1   Android Studio配置 2.1.1 ...

  6. 3G应用开发之Android 传智播客 基础知识总结

    3G应用开发之Android Android应用开发之3G  3G应用开发之Android 3G应用开发之Android 应用开发之 讲师: 讲师:黎活明 北京传智 播客教育 www.itcast.c ...

  7. android 插件化 方案,Android应用开发之Android 插件化,qihoo360插件方案配置教程

    本文将带你了解Android应用开发Android 插件化,qihoo360插件方案配置教程,希望本文对大家学Android有所帮助. Android 插件化,qihoo360插件方案 目录 Andr ...

  8. 镜像处理坐标 android,Android应用开发之Android重写ImageView实现图片镜像效果的代码教程...

    本文将带你了解Android应用开发之Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助. 前两天朋友问我一个问题,如何实现从手机系统相册加载一张图 ...

  9. android图标随着进度条动画,Android开发之ProgressBar字体随着进度条的加载而滚动...

    在网上翻阅了很多关于ProgressBar滚动效果,但是始终没有找到适合项目中的这种效果,故自己写这篇文章,记录一下写作过程,给大家做一个参考.先看下最终效果效果图 我这里用的是LICEcap软件录制 ...

最新文章

  1. 用vector实现一个变长数组
  2. TypeScript学习笔记3:运算符
  3. oracle转义字符
  4. GPU Gems1 - 17 环境遮挡
  5. java stream 求和_谈谈Java任务的并行处理
  6. java基本数据类型存储,JAVA - 基本数据类型的存储空间长度
  7. DistCp迁移Hive数据过程中源集群增加删除文件等场景测试
  8. thinkphp框架环境部署
  9. 【元胞自动机】基于matlab六边形网格六方元胞自动机【含Matlab源码 1362期】
  10. spine怎么取消版本升级_设置 - Spine用户指南
  11. 用计算机教学体育,浅谈计算机在体育教学中的应用
  12. 汽车抛负载7637-5A/5B测试介绍
  13. Mstar方案软件运行基本原理
  14. 基于CNN+tensorflow对搜狐新闻进行分类并对函数进行封装
  15. 【UEFI实战】EDK的编译流程说明
  16. 集团化公司快递收发管理教程
  17. 软件开发模型-瀑布模型、V形模型、原型模型、增量模型、快速开发、敏捷模型
  18. 操作系统-时间片轮转调度算法
  19. 学python有必要用固态硬盘吗-pythonssd
  20. 高等数学笔记-苏德矿-第九章-重积分(Ⅰ)-二重积分

热门文章

  1. 弃用Dubbo!这个新一代框架阿里都用疯了!
  2. 【Weex】 理性思考
  3. CSS3制作漂亮的照片墙
  4. python面试“神器”
  5. JSP表单中的隐藏域
  6. 数据仓储设计的基本概念
  7. emui11华为主题破解_余承东:鸿蒙OS手机明年会有!华为开发者大会将发布鸿蒙、HMS和EMUI三大系统升级...
  8. 自考和成考会有学计算机的吗,成人高考和自考有什么区别 成考录取后用去学校吗...
  9. pythonappium自动化框架_Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)...
  10. 一级建造师《公路工程》讲解:1B420142预制场布设 干货!