美文网首页
2.3 - Launcher 的启动

2.3 - Launcher 的启动

作者: Wi1ls努力努力再努力 | 来源:发表于2019-07-15 21:00 被阅读0次
    • 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 的启动流程了。

    从 Launcher 启动应用

    相关文章

      网友评论

          本文标题:2.3 - Launcher 的启动

          本文链接:https://www.haomeiwen.com/subject/dcrnkctx.html