Android App的几个核心概念

news2024/11/16 19:13:56

Application启动

点击桌面图标启动App(如下流程图)

针对以上流程图示:

  • ActivityManagerService#startProcessLocked()
  • Process#start()
  • ActivityThread#main(),入口分析的地方
  • ActivityThread#attach(),这个里面的逻辑很核心 ActivityManagerService#attachApplication(),通过Binder机制调用了ActivityManagerService的attachApplication
  • ActivityManagerService#attachApplicationLocked(),整个应用进程已经启动起来
  • ActivityManagerService#thread.bindApplication,具体回到ActivityThread
  • ActivityThread.ApplicationThread#bindApplication(),最后看到sendMessage处理bind逻辑
  • ActivityThread#handleBindApplication(),设置进程的pid,初始化进程信息
  • ActivityThread#mInstrumentation.callApplicationOnCreate,看到Application进入onCreate()方法中,这就是从最开始main()方法开始到最后的Application的onCreate()的创建过程

Window创建

如何创建Window

在创建Activity实例的同时,会调用Activity的内部方法attach方法完成window的初始化。Activity类中相关源码如下所示:

final void attach(Context context, ActivityThread aThread,
        Instrumentation instr, IBinder token, int ident,
        Application application, Intent intent, ActivityInfo info,
        CharSequence title, Activity parent, String id,
        NonConfigurationInstances lastNonConfigurationInstances,
        Configuration config, String referrer, IVoiceInteractor voiceInteractor,
        Window window, ActivityConfigCallback activityConfigCallback) {
    //创建 PhoneWindow
    mWindow = new PhoneWindow(this, window, activityConfigCallback);
}
  • Window是一个抽象类,具体实现是PhoneWindow。PhoneWindow中有个内部类DecorView,通过创建DecorView来加载Activity中设置的布局R.layout.activity_main
  • 创建Window需要通过WindowManager创建,通过WindowManager将DecorView加载其中,并将DecorView交给ViewRoot,进行视图绘制以及其他交互

Android组件设计

ActivityManagerService

  • 启动组件
    • 组件启动时,检查其所要运行在的进程是否已创建。如果已经创建,就直接通知它加载组件。否则,先将该进程创建起来,再通知它加载组件。
  • 关闭组件
    • 组件关闭时,其所运行在的进程无需关闭,这样就可以让组件重新打开时得到快速启动。
  • 维护组件状态
    • 维护组件在运行过程的状态,这样组件就可以在其所运行在的进程被回收的情况下仍然继续生存。
  • 进程管理
    • 在适当的时候主动回收空进程和后台进程,以及通知进程自己进行内存回收
    • 组件的UID和Process Name唯一决定了其所要运行在的进程。
    • 每次组件onStop时,都会将自己的状态传递给AMS维护。
    • AMS在以下四种情况下会调用trimApplications来主动回收进程:
      • A.activityStopped,停止Activity
      • B.setProcessLimit,设置进程数量限制
      • C.unregisterReceiver,注销Broadcast Receiver
      • D.finishReceiver,结束Broadcast Receiver

Binder

  • 为组件间通信提供支持
    • 进程间;进程内都可以
  • 高效的IPC机制
    • 进程间的组件通信时,通信数据只需一次拷贝
    • 进程内的组件通信时,跳过IPC进行直接的通信

说一说DecorView

DecorView是什么

  • DecorView是FrameLayout的子类,它是Android视图树的根节点视图
    • DecorView作为顶级View,一般情况下内部包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下三个部分,上面是个ViewStub,延迟加载的视图(设置ActionBar,根据Theme设置),中间的是标题栏(根据Theme设置,有的布局没有),下面的是内容栏。
<LinearLayout >
    <ViewStub
        android:id="@+id/action_mode_bar_stub"/>
    <FrameLayout>
        <TextView
            android:id="@android:id/title"/>
    </FrameLayout>

    <FrameLayout
        android:id="@android:id/content"/>
</LinearLayout>
  • 上面的id为content的FrameLayout中,在代码中可以通过content来得到对应加载的布局
ViewGroup content = (ViewGroup)findViewById(android.R.id.content);
ViewGroup rootView = (ViewGroup) content.getChildAt(0);

Activity 与 PhoneWindow 与 DecorView 关系

一个 Activity 对应一个 PhoneWindow,一个 PhoneWindow 持有一个 DecorView 实例,DecorView 本身是一个 FrameLayout。

如何创建DecorView

  • 从Activity中的setContentView()开始
    • 在Activity中的attach()方法中,生成了PhoneWindow实例。既已有Window对象,那么就可以设置DecorView给Window对象了。
    • 从中获取mContentParent。获得到后,通过installDecor方法生成DecorView,源码中操作比较复杂,大概先从主题中获取样式,根据样式加载对应的布局到DecorView中,为mContentParent添加View,即Activity中的布局。

Android 学习笔录

Android 性能优化篇:https://qr18.cn/FVlo89
Android 车载篇:https://qr18.cn/F05ZCM
Android 逆向安全学习笔记:https://qr18.cn/CQ5TcL
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap

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

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

相关文章

20230621 taro+vue3+webpack5+antdv时,在vue文件中特定组件时,devH5环境报错

问题 在某个vue文件下 import { notification } from ant-design-vue;然后在终端开始 yarn dev:h5在浏览器看效果 回出现以下错误 Uncaught (in promise) TypeError: __webpack_require__.hmd is not a functionat ./node_modules/.taro/h5/prebundle/ant-design-vue.js原因…

提高客户体验:智能客服外包服务的优势

随着科技的发展&#xff0c;智能客服外包服务越来越受到企业的青睐。这种服务能够帮助企业提高客户体验&#xff0c;减少客服成本&#xff0c;提高工作效率。本文将从技术、用户体验等方面阐述智能客服外包服务的优势。 人工智能技术 智能客服外包服务采用了一系列的技术手段&…

自然语言处理库NLTK的初步环境配置和使用例子

NLTK的基本介绍见此&#xff0c; 了解自然语言处理_bcbobo21cn的博客-CSDN博客 先安装python&#xff1b;然后用pip命令安装nltk&#xff1b; 然后进入python&#xff0c;下载nltk的数据包&#xff1b;输入下图语句&#xff0c;弹出一个框&#xff0c; 一般选择 all&#xff…

PHP 实验室设备系统mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 实验室设备系统 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/87959348https://downlo…

Kaggle 数据竞赛 | ICR - 鉴定与年龄相关的疾病

文章目录 一、前言二、主要内容1. 评估2. 时间线3. 奖金4. 代码要求 三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 使用机器学习技术&#xff0c;通过匿名健康特征的测量数据来检测疾病。 比赛目标 本次比赛的目标是预测一个人是…

华为云Classroom一站式教学实践平台,开启云端教学新征程

随着高考落下帷幕&#xff0c;各高校将迎来新一届大学新生入学&#xff0c;他们的学长学姐们经过四年的学习&#xff0c;也即将步入社会&#xff0c;迈向一段新的人生旅程。 在这里小智先祝大家未来一切顺意&#xff0c;不忘初心&#xff0c;大鹏一日同风起&#xff0c;扶摇直…

win10环境下php安装thinkPHP5的曲线方式

win10环境下php安装thinkPHP5的曲线方式 强调一下在win10环境安装thinkPHP5需要使用Composer。 首先是thinkphp的教程&#xff1a;https://www.kancloud.cn/manual/thinkphp5/118006 你就会发现很坑逼 安装Composer的时候一种报错&#xff0c;就是php.ini文件错误。网上说什么…

Unity内置渲染管线升级URP教程

简介 URP全称为Universal Render Pipeline(通用渲染管线)&#xff0c;可以提供更加灵活的渲染方案&#xff0c;通过添加Render Feature实现各种渲染效果。并且可以针对移动平台进行专门的优化&#xff0c;同时还提供了SRPBatcher提高渲染效率。Unity的一些工具&#xff0c;比如…

客户关系管理系统有哪些?5款客户关系管理软件评测

客户关系管理系统是一种企业与客户之间的交互平台&#xff0c;它将客户的需求、市场环境、企业的发展战略等融入到整个业务流程中&#xff0c;在企业和客户之间建立起一个共享的资源库&#xff0c;使企业对客户的了解更深更全面&#xff0c;进而实现与客户的深入互动&#xff0…

C#创建窗体应用程序

1、新建项目&#xff0c;选择窗体应用 2、打开相关视图 工具箱&#xff1a;将工具箱中的控件直接拖拽到界面中&#xff0c;会自动生成对用的控件。 属性&#xff1a;可以设置控件的相关属性&#xff0c;包括事件&#xff0c;双击 3、设计应用界面 4、新建一个交互窗口 5、在登…

MVP(Multi-view Prompting):多视图提示改进了方面情感元组预测

论文题目&#xff08;Title&#xff09;&#xff1a;MVP: Multi-view Prompting Improves Aspect Sentiment Tuple Prediction 研究问题&#xff08;Question&#xff09;&#xff1a;多视图提示对方面情感元组检测的影响 研究动机&#xff08;Motivation&#xff09;&#x…

AI智能人脸识别,抠图-应用证件照

效果展示&#xff1a; 关键代码&#xff1a; import numpy as np import cv2 import osdef crop_face(source_image_path, output_folder_path, tag_width, tag_height):face_detector cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xm…

【算法题解】45. N叉树的层序遍历

这是一道 中等难度 的题 https://leetcode.cn/problems/n-ary-tree-level-order-traversal/ 题目 给定一个 N 叉树&#xff0c;返回其节点值的层序遍历。&#xff08;即从左到右&#xff0c;逐层遍历&#xff09;。 树的序列化输入是用层序遍历&#xff0c;每组子节点都由 nu…

fopen,fputs,fgets,fclose

fopen 是打开文件 fputs 往文件里面写内容(里面有2个参数其中第一个是一个char 型 数组用于存放读取的字符串&#xff0c;表示读取 1-n个字符。第二个表示是文件读入指针) fgets 读取文件里面的内容 (里面有三个参数其中 第一个是一个char 型 数组用于存放读取的字符串。第二…

阿里云安全组 IP地址段 设置方法 斜线后面数字含义

比如公司搬家后,我的ip变成了101.83.11.11 但我希望安全组中.只限制ip的前2段,后面两段是多少,都不会限制访问 先登录阿里云的服务器管理后台,找到主机,进安全组,添加 设置方法为 端口1234为自定义的,比如远程桌面访问你的服务器,源:就是ip地址段. 101.83.1.1/16解释 斜杠…

使用 Jetpack Compose 构建 LinearProgressIndicator

欢迎阅读这篇关于如何使用 Jetpack Compose 构建 LinearProgressIndicator&#xff08;线性进度指示器&#xff09;的博客。Jetpack Compose 是 Google 推出的一款现代化 UI 工具包&#xff0c;用于构建 Android 界面。其声明式的设计使得 UI 开发更加简洁、直观。 什么是 Line…

mfc100u.dll丢失的各种解决方法分享,探究mfc100u.dll文件

在计算机系统中&#xff0c;有许多重要的文件扮演着关键角色。其中之一就是Mfc100u.dll&#xff0c;一但这个文件丢失了&#xff0c;那么你的电脑就会出现问题&#xff0c;如程序运行不了等等。今天主要来给大家讲讲Mfc100u.dll这个文件&#xff0c;mfc100u.dll丢失的各种解决方…

由spring定时任务@Scheduled(cron = “0 0 0/1 * * ?“)引起的坑

这两天做到的一个功能&#xff0c;定时任务每整点生成一条记录&#xff0c;然后使用的cron表达式是&#xff1a; Scheduled(cron "0 0 0/1 * * ?")意为每整点执行一次。 定时任务执行之后使用new Date() 拿到当前本机时间&#xff0c;作为记录的创建时间&#xf…

使用Jmeter完成数据库造数

1.添加驱动 如果使用jmeter连接数据库&#xff0c;需要在jmeter的lib下添加对应的数据库驱动 MySQL: mysql-connector-jar Oracle: ojdbc6-11.2.0.3.jar ps:找到自己对应的驱动版本 2.bin目录启动 localhost bin % sh jmeter.sh ps: Jmeter版本&#xff1a;5.6 mysq…

在windows同时安装两个idea的方法教程

因为近期使用jdk17&#xff0c;所以需要升级Idea的版本&#xff0c;但是我电脑之前用的Idea2018,我又不想卸载&#xff0c;所以想同时装两个版本的。 安装教程如下&#xff1a; IDea官网&#xff1a;https://www.jetbrains.com.cn/idea/download/?sectionwindows 在官网下载.…