八股总结(六):Android基础:四大组件与UI控件

news/2024/7/24 2:47:14 标签: android, ui

文章目录

  • 四大组件
    • 基本概念
    • Activity
      • zygote是什么?有什么作用?
      • SystemServer是什么?有什么用,与zygote的关系是什么?为什么称为服务端对象?
      • APP、AMS、zygote是三个独立的进程,他们之间如何通信呢?(IPC通信方式)
      • Launcher是什么?什么时候启动的?

四大组件

基本概念

  • ActivityManagerServices,简称AMS,服务端对象,负责系统中所有Activity的生命周期。
  • ActivityThread,App的真正入口。当开启App之后,会调用main()开始运行,开启消息循环队列,这就是UI线程或者叫主线程。与ActivityManagerServices配合,一起完成Activity的管理工作。
  • ApplicationThread,用来实现ActivityManagerService与ActivityThread之间的交互。在ActivityManagerService需要管理相关Application中的Activity的生命周期时,通过ApplicationThread的代理对象与ActivityThread通讯。
  • ApplicationThreadProxy,是ApplicationThread在服务器端的代理,负责和客户端的ApplicationThread通讯。AMS就是通过该代理与ActivityThread进行通信的。
  • Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityThread要创建或暂停某个Activity时,都需要通过Instrumentation来进行具体的操作。
  • ActivityStack,Activity在AMS的栈管理,用来记录已经启动的Activity的先后关系,状态信息等。通过ActivityStack决定是否需要启动新的进程。
  • ActivityRecord,ActivityStack的管理对象,每个Activity在AMS对应一ActivityRecord,来记录Activity的状态以及其他的管理信息。其实就是服务器端的Activity对象的映像。
  • TaskRecord,AMS抽象出来的一个“任务”的概念,是记录ActivityRecord的栈,一个“Task”包含若干个ActivityRecord。AMS用TaskRecord确保Activity启动和退出的顺序。如果你清楚Activity的4种launchMode,那么对这个概念应该不陌生。

Activity

zygote是什么?有什么作用?

fork是Unix/Linux操作系统中的一个用于创建新进程的系统调用函数,fork会复制原进程的所有内容包括代码、数据和内存空间。

zygote:直译为受精卵zygote 是一个进程的名字,Android是基于Linux系统的,当手机开机后,Linux内核加载完成之后就会启动一个init 的进程,在Linux系统中,所有的的进程都是init进程fork出来的,zygote进程也不例外。

每一个APP其实都是:

  • 一个单独的dalvik虚拟机
  • 一个单独的进程

当系统里边的第一个zygote进程运行之后,开启APP,就相当于新开启一个进程,而为了实现资源共用和更快的启动速度,Android系统开启新进程的方式是通过fork一个zygote进程实现的。就像受精卵这种有遗传物质的细胞一样,快速进行分裂。

SystemServer是什么?有什么用,与zygote的关系是什么?为什么称为服务端对象?

zygote进程后开启后会执行startSystemServer(),fork出SystemServer进程

SystemServer是Android Framework中除zygote外另一个十分重要的线程,系统里边的重要服务:ActivityManagerService、PackageManagerService、WindowManagerService都在这个线程中开启。

服务端/客户端模型不仅仅存在于Web开发中,在Android框架设计中也是这种模式,服务端是所有APP共有的系统服务,比如上边提到到AMS(活动管理服务)、PMS(包管理服务)、WMS(窗口管理服务),而客户端指的就是Android系统上的各种APP,当某个APP要实现某个操作,需要告诉这些系统服务,例如如果想要打开一个App,最终是由AMS通知zygote进程来fork一个新进程,进而开启目标APP的。

APP、AMS、zygote是三个独立的进程,他们之间如何通信呢?(IPC通信方式)

APP与AMS通过Binder进行IPC通信,AMS与zygote通过Socket进行IPC通信。

Launcher是什么?什么时候启动的?

当我们点击手机桌面上的图标时,App就由Launcher开始启动,Launcher本质上也是一个应用程序,和我们的App一样,也是继承自Activity,Launcher实现了点击、长按等回调接口,来接收用户的输入。Launcher中开启一个App,其实和我们在Activity中直接startActivity()基本一样,都是调用了Activity.startActivityForResult()。


http://www.niftyadmin.cn/n/358171.html

相关文章

error while loading shared libraries: libc.so.6 误删除libc.so.6急救办法,

故障原因: 在高版本的环境中编译了一个软件,然而在低版本系统中无法使用,缺少libc.so支持,然而在编译过程中误删除了 libc.so.6的软连接,rm /lib64/libc.so.6 删除后发现系统好多命令都无法使用了,悲催&#xff01…

Python中的全局变量与局部变量

1 定义 全局变量指的是在整个python文件中定义的变量,而局部变量是在函数内部定义的变量。 a 1 def yang_func():b 2 从以上代码中可以看出,变量a是全局变量,变量b是定义在yang_func()函数的内部,因此b是局部变量。 2 使用范…

C++标准库算法std::upper_bound示例

C标准库算法std::upper_bound示例 贺志国 2023.5.25 C标准库算法std::upper_bound使用二分查找算法在已按升序排列的序列中返回指向第一个大于给定值的元素的迭代器,例如:已按升序排列的序列为{100.0, 101.5, 102.5, 102.5, 107.3},第一个大…

ansible——利用主机模式选择主机

一:主机模式:对目标主机的一种选择方式 1.以student用户身份并使用student作为密码登录workstations ssh studentworkstation 2.创建projects-host项目文件,并下载ansible配置文件 lab projects-host start 3.在 workstation上更改到/home…

人生得意马蹄急,成长的痛,坚持痛并快乐

关键词 困惑 坚持 成长 深耕 开放 在竞争激烈的职场上,各种职场难题时常出现,如何进行有效沟通、如何应对工作压力、如何提升职业能力等,这都是需要去克服的问题。一起来分享一下你的经验吧! 一、你遇到过哪些职场问题&#xff…

免费部署你的私人 ChatGPT 网页应用

免费部署你的私人 ChatGPT 网页应用 1、注册Github账号,拷贝仓库 第一步、打开GitHub官网,点击右上角Sign up注册即可 第二步、打开开源项目【Chatgpt-next-web】,点击fork,点击Create fork完成操作 2、选择免费的容器【vercel】或者【r…

mp3格式怎么弄?制作mp3格式文件,教您2个有效的方法!

案例:如何制作mp3格式的文件? 【我想制作自己的mp3文件,但不知道如何开始。有没有小伙伴可以分享一下制作mp3格式的方法?】 MP3是一种非常流行的音频格式,被广泛用于数字音频的存储和传输。制作mp3格式文件可以让您方…

JavaEE(系列15) -- 多线程(JUC中常见的类)

JUC----- java.util.concurrent(并发) 1. ReentrantLock 1. 可重入互斥锁. 和 synchronized 定位类似, 都是用来实现互斥效果, 保证线程安全. 2. ReentrantLock 也是可重入锁. "Reentrant" 这个单词的原意就是 "可重入". 1. ReentrantLock 的用法: lock():…