Android Framework分析Launcher启动过程

news2024/10/5 17:16:19

在这里插入图片描述

简介:

Launcher是Android系统中默认的桌面应用程序,负责管理设备的屏幕和应用程序图标。本文将详细介绍Launcher的启动过程,并使用源代码示例进行说明。

Launcher的启动过程:

下面是Launcher的启动过程的详细步骤:

  1. 由系统框架启动应用程序进程。

Launcher是Android系统默认的应用程序,它会在系统启动时被自动加载。与其他应用程序一样,它是由系统框架启动的。系统框架会加载以"com.android.launcher3.Launcher"为启动器的类,然后启动Launcher应用程序。

  1. 加载应用程序主入口函数。

在Launcher应用程序启动时,系统框架会加载应用程序主入口函数。这个函数负责初始化Launcher应用程序并为用户提供UI界面。

  1. 加载主Activity。

主Activity是指Launcher应用程序中的MainActivity,它是应用程序的入口点。系统框架会实例化MainActivity并调用其onCreate()方法。

  1. 加载设计资源。

Launcher应用程序中的设计资源是指应用程序的UI元素,例如:图标、背景、字体等资源。这些资源是在应用程序启动时加载的,并用于构建应用程序的UI界面。

  1. 加载布局文件。

Launcher应用程序中的布局文件包含了应用程序的UI元素的结构和排列方式。这些布局文件是在应用程序启动时加载的,并用于构建应用程序的UI界面。

  1. 加载LauncherModel。

LauncherModel是Launcher应用程序的数据模型。它负责管理设备上所有应用程序的图标和应用程序的位置。LauncherModel还负责从系统资源中获取新安装的应用程序,并将其更新到Launcher中。

下面是LauncherModel的构造函数的源代码示例:

public LauncherModel(LauncherAppState app) {
    // Load configuration from a different thread.
    mApp = app;
    mIconCache = app.getIconCache();
    mBgAllAppsList = new DeferredHandler();
    mWorkerHandlerThread = new HandlerThread("launcher-loader");
    mWorkerHandlerThread.start();
    mWorkerHandler = new WorkerHandler(mWorkerHandlerThread.getLooper());
    mModelCache = new LoaderResultsCache(this);
}
  1. 加载界面布局。

Launcher应用程序中的UI布局是通过加载Fragment获得的。Launcher应用程序中有多个Fragment,包括:工作区、小部件和小部件配置屏幕等。Fragment以类似Activity的方式加载。系统框架会加载包含这些Fragment的布局资源,并在应用程序启动时使用这些资源。

下面是Launcher应用程序中加载工作区的源代码示例:

private void populateWorkspace() {
    Runnable r = new Runnable() {
        public void run() {
            mWorkspace.loadUserItems(false);
            if (mSynchronouslyBound) {
                mSynchronouslyBound = false;
                mDragLayer.onAppsBound();
                mWorkspace.post(new Runnable() {
                    public void run() {
                        mOverlayDrawer.startDiscoveryAnimation();
                    }
                });
            }
        }
    };
    runOnMainThread(r, BIND_WORKSPACE_SCREEN_TIMEOUT_SECONDS);
}
  1. 加载小部件。

小部件是常驻应用程序,它们在设备上运行并提供有用的功能。Launcher应用程序中的小部件在应用程序启动时加载。这些小部件的位置和大小信息存储在LauncherModel中。

下面是Launcher应用程序中加载小部件的源代码示例:

private void populateAppWidgetHostView(AppWidgetHostView view, ItemInfo info, LauncherAppWidgetProviderInfo appWidgetInfo) {
    view.setAppWidget(appWidgetInfo);
    view.setTag(info);
    info.applyFromAppWidgetProviderInfo(appWidgetInfo);
    view.setVisibility(View.VISIBLE);
}
  1. 加载小部件配置屏幕。

小部件配置屏幕是一个用于管理和配置小部件的界面。在Launcher应用程序启动时,会检查是否需要打开小部件配置屏幕。如果需要,系统框架会加载小部件配置屏幕并启动它。

下面是Launcher应用程序中打开小部件配置屏幕的源代码示例:

private void showAllApps(boolean animated, boolean fromHome) {
    if (mState == State.APPS_SPRING_LOADED || mState == State.APPS_SPRING_LOADED_HIGHLIGHTED) {
        return;
    }
    if (mState == State.WORKSPACE) {
        mWorkspace.setVisibility(View.INVISIBLE);
    }

    mStateTransitionAnimation = animated;

    if (mState != State.WORKSPACE_HIDDEN) {
        if (AppsCustomizePagedView.DISABLE_ALL_APPS) {
            showWorkspace(animated);
        } else {
            showAppsCustomizeHelper(animated, false, fromHome);
        }
    }
}
  1. 启动应用程序。

Launcher应用程序中的应用程序图标是一个View对象。当用户点击应用程序图标时,系统框架会启动指定的应用程序并将其显示在屏幕上。

下面是Launcher应用程序中启动应用程序的源代码示例:

private void startActivitySafely(View v, Intent intent, ItemInfo item) {
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    if (item != null && item instanceof ShortcutInfo) {
        int[] pos = new int[2];
        v.getLocationOnScreen(pos);
        intent.putExtra(EXTRA_SHORTCUT_ID, ((ShortcutInfo)item).id);
        intent.putExtra(EXTRA_SHORTCUT_INTENT, intent);
        intent.putExtra(EXTRA_SHORTCUT_ICON_RESOURCE, ((ShortcutInfo)item).iconResource);
        intent.putExtra(EXTRA_SHORTCUT_ICON, ((ShortcutInfo)item).iconBitmap);
        intent.putExtra(EXTRA_SHORTCUT_ICON_PACKAGE, ((ShortcutInfo)item).iconResource.packageName);
        intent.putExtra(EXTRA_SHORTCUT_ICON_RESOURCE_TYPE, ((ShortcutInfo)item).iconResource.resourceTypeName);
        intent.putExtra(EXTRA_SHORTCUT_ADDED_TO_HOME, ((ShortcutInfo)item).isAddedToHome());
        intent.putExtra(EXTRA_ANIMATED_THUMBNAIL, mDragLayer.getAnimatedIconBitmap());
        intent.putExtra(EXTRA_CONTROLLER, mStats);
        intent.putExtra(EXTRA_DOWN_AND_OUT, true);
        intent.putExtra(EXTRA_PROFILE, mUser);
        intent.putExtra(EXTRA_DIRECT_CALL_SHORTCUT, true);
        intent.putExtra(EXTRA_ANIM_SCALE_FACTOR, mZoomScale);
        intent.putExtra(EXTRA_DRAG_SOURCE_Y_OFFSET, mIconDragEvent.getY()
                - (mDragLayer.getInsets().top - mWorkspace.getInsets().top + pos[1]));
    }
    mStats.recordLaunch(intent, item);
    getContext().startActivity(intent);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/649475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源软件介绍——开源基金会和开源许可证

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来看一看世界范围内知名的开源基金会和开源许可证。 开源基金会 基金会是开源生态中的一个重要组成部分,用于资金的筹集与开源项目的前期资助与后期的发展。这里将介绍部分重要基金会&am…

嵌入式Linux时间同步 gpsd+chrony+pps

硬件设计 GNSS模块输出pps到CPU,1PPS_1.8V用于V2X的pps,GPIO35_1.8V用于pps-gpio。这里做了pps一分二,由于距离太近不影响功能,焊接R35 0欧电阻。 驱动配置 gps_pps_pins:ublox_gps2 {leadcore,pins "gpio34";leadcore…

echarts几个公司内部数据可视化图表必

目录 折线图 日负荷折线图最大需求表柱状图 日电量柱状图分时电量功率因数三相温度水球图 年月日负荷率图散点图 三相平衡 最近公司有一个需求,要做一个数据可视化的页面,所有的图表都在下面,做这些都是本人自己写的,全部都是真…

【笔记】Fastapi 服务器部署无法访问接口

主要原因: # 主函数 if __name__ "__main__":uvicorn.run(appmain:app, host127.0.0.1, port8181, reloadFalse)以上都是测试环境,可以使用127.0.0.1,但是服务器上不能用这个地址,要改为0.0.0.0。 参考:服…

Qt_C++读写NXP、富士通15693标签支持windows国产linux操作系统

常用15693标签NXP ICODE存储结构说明 片内含1024位E2PROM,共分为32 Block,每个Block 32bit。其中64位为唯一序列号,32位用作特殊功能(EAS、AFI、DSFID等),32位用于Block锁定,其余为用户使用区。…

mock测试(挡板测试)

https://www.cnblogs.com/lc-blogs/p/17027617.html mock测试(挡板测试)就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法。 比如:测试天气这个接口,最…

RIP协议路由配置(Cisco Packet Tracer)

实验环境: windows10操作系统、思科模拟器、网络正常; 实验内容: 新建packettracer拓扑图;设置PC机的网络配置信息;配置路由器的接口IP;为路由器的RIP添加地址;为路由器添加静态路由。测试PC…

由于找不到wpcap.dll导致软件无法运行的解决办法,特此记录

由于找不到wpcap.dll导致软件无法运行的解决办法,特此记录提示 目录 前言 一、解决找不到wpcap.dll错误的办法 前言 今天在运行一个软件时弹出,找不到wpcap.dll,无法运行的弹出,目前已解决此问题,特此记录&#xff…

MQTT服务等级

1.QoS含义 Quality of Service,服务质量 很多时候,使用 MQTT 协议的设备都运行在网络受限的环境下,而只依靠底层的 TCP传输协议,并不能完全保证消息的可靠到达。因此,MQTT 提供了 QoS机制,其核心是设计了多种消息交互…

什么是electron?

Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建 在Windows上运行的跨平台应用 macOS和Linux——不需要本地开发 经验 election的主要组成部分:…

5、共享模型之内存

目录 5.1 Java的内存模型5.2 可见性1、退不出的循环2、解决办法:3、可见性 vs 原子性 5.3 有序性1、为什么会有指令重排2、如何禁止指令重排3、原理之volatile4、happens-before 5.1 Java的内存模型 JMM 即 Java Memory Model(Java内存模型)…

如何学习Java“高并发”,并在项目中实际应用?

前几天收到一位粉丝私信,说的是他才一年半经验,去面试却被各种问到分布式,高并发,多线程之间的问题。基础层面上的是可以答上来,但是面试官深问的话就不会了!被问得都怀疑现在Java招聘初级岗位到底招的是初…

DMHS同步原理介绍以及DM8同步到DM8

一、DMHS原理介绍 1.DMHS介绍 达梦数据实时同步软件 DMHS 是达梦公司推出的新一代支持异构环境的高性能、高可靠和高可扩展的数据库实时同步系统。该产品基于成熟的关系数据模型和标准接口,跨越多种软硬件平台实现秒级数据实时同步。该产品可广泛应用于应急系统、…

什么是产品经理 | 文末赠书

目录 一. 产品经理是什么?二. 产品经理需要具备的技能三. 产品经理的职责四. 产品经理在软件开发过程中如何平衡不同利益方的需求?五. 入门建议六. 发展前景七. 总结🦁文末福利图书介绍作者简介 一. 产品经理是什么? 产品经理是指…

使用阿里巴巴开源神器Arthas进行性能分析

目录 前言: Arthas介绍 启动 分析命令 Profiler工具 前言: Arthas是一款由阿里巴巴开源的Java诊断工具,它可以在生产环境中帮助开发人员快速地定位问题,并进行高效的性能分析。通过在命令行中输入简单的命令,开发人员…

Win10开机后自动显示右键菜单怎么办?

Win10开机后自动显示右键菜单怎么办?用户打开Win10电脑后发现电脑自动显示右键菜单,如果是使用联想电脑的用户,需要打开联想管家,关掉联想锁屏即可,若是系统不兼容导致的,这时候用户就需要恢复Win10系统来解…

前端性能优化:高在性能,大在范围,必要前置知识一网打尽!(上)

前言 前端性能优化 又是个听起来很高大上的词,确实是的,因为它需要 高在性能,大在范围 ,所幸很多大佬都已经输出了很多高质量的内容供大家参考,作者最近也在学习和了解这方面的内容,对如下文中的一些理解若…

死磕测试 10 余年,呕心整理出了核心知识点已经做成PDF,无私奉献

前言: 想在面试、工作中脱颖而出?想在最短的时间内快速掌握 软件测试 的核心基础知识点?想要成为一位优秀的测试工程师?本篇文章能助你一臂之力! 目前正值招聘求职旺季,很多同学对一些新技术名词都能侃侃…

智能文本生成:进展与挑战

智能文本生成:进展与挑战 万小军 北京大学王选计算机研究所 摘要:智能文本生成是人工智能与自然语言处理领域的前沿研究方向,也是AI生成内容(AIGC)的关键技术支撑,近些年受到学术界和产业界的高度关注&…

[笔记]pg常用命令

数据库版本 :9.6.6 注意 :PostgreSQL中的不同类型的权限有SELECT,INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER,CREATE,CONNECT,TEMPORARY,EXECUTE 和 USAGE。 1. 登录PG数据库 以管理员身份 postgres 登陆,然后通过 #psql -U postg…