- Launcher 的启动从 systemReady( )@AMS开始,其中会调用resumeTopActivityLocked(null)@ActivityStack 尝试去启动 topActivity;
- ActivityStack 发现没有任何 Activity 的记录,于是就去调用 startHomeActivityLocked( )@AMS 去启动Launcher。
- AMS 去向PMS 请求 Launcher 相关的信息,然后就和先启动 Launcher 的进程,然后双方通信。我们直接看 Launcher 的启动。
- Launcher 相关的类有 Launcher.java, LauncherApplication.java(Launcher 的 Application),LauncherModel.java(用于 load 已经安装 apk 的信息)。
- LauncherApplication 实例化一个 LauncherModel,而 Launcher 派生自 Callback,作为 initialize( )的参数传入到LauncherModel,之后Launcher 持有 LauncherModel。
- Launcher布局中主要的 UI 是一个AllApps2D.java
- 在 Launcher 的 onCreate( ) 中执行 startLoader( )@LauncherModel 开始加载已安装的应用信息。
- LauncherModel 中有一个 LoaderTask(派生自 Runnable),在 startLoader( )中将 LoaderTask post 到主线程。随后会调用 run( )LoaderTask 真正开始加载应用信息。
- 我们关心 APP 的 load,因此关注其中的 loadAndBindAllApps( );随后调用 loadAllAppsByBatch( );
- 在 loadAllAppsByBatch( )中会构造一个 Intent,向 PMS 查询 Intent.ACTION_MAIN 同时 Intent.CATEGORY_LAUNCHER的 Activity 信息。【众所周知,一个应用会将根 Activity 添加 action 为 Intent.ACTION_MAIN与 category 为 Intent.CATEGORY_LAUNCHER的 intent_filter】
- 随后将查询到的所有的根 Activity 相关的ResolveInfo,包装为 ApplicationInfo;同时将这个 ArrayList通过 callbacks(实质上是 Launcher)传递出去。然后来到 bindAllApplications( )@Launcher
- 前面说过 Launcher 中有个 View 为 AllApps2D.java,将得到的 ArrayList<ApplicationInfo>传递给 AllApps2D。
- AllApps2D 内部有一个 GridView,传入的 List<ApplicationInfo>作为 GridView 的 Adapter 的数据源。
- 对于 GridView 设置 OnItemClickListener( ),其回调在 startActivitySafely( )@Launcher。便开始熟悉的 Activity 的启动流程了。
网友评论