android app启动流程分析,Android应用开发之Android 7.0 Launcher3的启动和加载流程分析...
本文将带你了解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的启动和加载流程分析...相关推荐
- Android 7.0 Launcher3的启动和加载流程分析----转载
Android 7.0 Launcher3的启动和加载流程分析,Launcher的本质就是一个普通应用,它比普通应用多配置了Category的Android:name="android ...
- android显示通知图标大全,Android应用开发之android 桌面APP应用图标显示通知消息的数量显示与去除...
本文将带你了解Android应用开发之android 桌面APP应用图标显示通知消息的数量显示与去除,希望本文对大家学Android有所帮助. android 桌面APP应用图标显示通知消息的数量 ...
- android签到功能开发,Android应用开发之Android简单实现app每月签到功能
本文将带你了解Android应用开发Android简单实现app每月签到功能,希望本文对大家学Android有所帮助. 本文实例为大家分享了Android实现app每月签到功能的具体代码,供大家参考, ...
- android换肤的实现方案,Android应用开发之Android一键换肤功能实现
本文将带你了解Android应用开发之Android一键换肤功能实现,希望本文对大家学Android有所帮助. < 市面上对数的App都提供换肤功能,这里暂且不讲白天和夜间模式 下图是网易云音乐 ...
- android studio开发工具介绍,Android应用开发之Android开发工具介绍、Android Studio配置...
本文将带你了解Android应用开发之Android开发工具介绍.Android Studio配置,希望本文对大家学Android有所帮助. 2.1 Android Studio配置 2.1.1 ...
- 3G应用开发之Android 传智播客 基础知识总结
3G应用开发之Android Android应用开发之3G 3G应用开发之Android 3G应用开发之Android 应用开发之 讲师: 讲师:黎活明 北京传智 播客教育 www.itcast.c ...
- android 插件化 方案,Android应用开发之Android 插件化,qihoo360插件方案配置教程
本文将带你了解Android应用开发Android 插件化,qihoo360插件方案配置教程,希望本文对大家学Android有所帮助. Android 插件化,qihoo360插件方案 目录 Andr ...
- 镜像处理坐标 android,Android应用开发之Android重写ImageView实现图片镜像效果的代码教程...
本文将带你了解Android应用开发之Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助. 前两天朋友问我一个问题,如何实现从手机系统相册加载一张图 ...
- android图标随着进度条动画,Android开发之ProgressBar字体随着进度条的加载而滚动...
在网上翻阅了很多关于ProgressBar滚动效果,但是始终没有找到适合项目中的这种效果,故自己写这篇文章,记录一下写作过程,给大家做一个参考.先看下最终效果效果图 我这里用的是LICEcap软件录制 ...
最新文章
- 用vector实现一个变长数组
- TypeScript学习笔记3:运算符
- oracle转义字符
- GPU Gems1 - 17 环境遮挡
- java stream 求和_谈谈Java任务的并行处理
- java基本数据类型存储,JAVA - 基本数据类型的存储空间长度
- DistCp迁移Hive数据过程中源集群增加删除文件等场景测试
- thinkphp框架环境部署
- 【元胞自动机】基于matlab六边形网格六方元胞自动机【含Matlab源码 1362期】
- spine怎么取消版本升级_设置 - Spine用户指南
- 用计算机教学体育,浅谈计算机在体育教学中的应用
- 汽车抛负载7637-5A/5B测试介绍
- Mstar方案软件运行基本原理
- 基于CNN+tensorflow对搜狐新闻进行分类并对函数进行封装
- 【UEFI实战】EDK的编译流程说明
- 集团化公司快递收发管理教程
- 软件开发模型-瀑布模型、V形模型、原型模型、增量模型、快速开发、敏捷模型
- 操作系统-时间片轮转调度算法
- 学python有必要用固态硬盘吗-pythonssd
- 高等数学笔记-苏德矿-第九章-重积分(Ⅰ)-二重积分
热门文章
- 弃用Dubbo!这个新一代框架阿里都用疯了!
- 【Weex】 理性思考
- CSS3制作漂亮的照片墙
- python面试“神器”
- JSP表单中的隐藏域
- 数据仓储设计的基本概念
- emui11华为主题破解_余承东:鸿蒙OS手机明年会有!华为开发者大会将发布鸿蒙、HMS和EMUI三大系统升级...
- 自考和成考会有学计算机的吗,成人高考和自考有什么区别 成考录取后用去学校吗...
- pythonappium自动化框架_Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)...
- 一级建造师《公路工程》讲解:1B420142预制场布设 干货!