Android AMS基础

153 阅读6分钟

前言

ActivityManagerService(AMS)负责管理应用的生命周期和任务栈。它是Android系统的核心之一。

  1. 生命周期管理:AMS负责监控和管理应用程序Activity生命周期,包括:创建、启动、暂停、恢复、停止和销毁等状态。
  2. 任务栈管理:AMS维护任务栈(Task Stack),存放不同应用的Activity实例。负责管理任务栈的创建、销毁、任务切换等。
  3. 进程管理:进程创建、销毁以及进程通信等
  4. 启动模式管理:管理Activity启动模式(Launch Mode),根据不同的启动模式来决定Activity的创建:单实例、单任务等。

AMS启动过程

  1. Zygote初始化:系统启动时,Zygote进程会被初始化,并创建SystemService进程。
  2. SystemService初始化:SystemService进程会初始化各种系统服务,包括AMS。
  3. AMS初始化:AMS初始化各种数据结构和状态,监听来自系统的消息和请求
  • Zygote是Android系统的特殊进程,负责为系统创建其他应用程序进程。
  • SystemServer是Android系统中核心服务进程,负责初始化和管理各种系统服务
  • AMS会在SystemServer进程中初始化,并成为系统四大组件管理中心

生命周期管理

Android系统中,AMS监控应用的组件(Activity、Service、Broadcast Receiver)的状态变化,管理应用程序生命周期。

  1. 启动应用程序:用户点击应用图标时,AMS首先会启动应用的进程(如果该应用的进程尚未存在),然后创建应用程序的启动Activity,并调用生命周期(onCreate->onStart->onResume)
  2. 活动状态管理:应用处于前台活动状态时,AMS监控用户与应用程序交互,如:按下Home键、切换到其他应用等。用户切到其他应用时,当前Activity依次调用生命周期(onPause->onStop)。当用户返回应用时,AMS会将应用任务栈顶部的Activity调回前台,调用生命周期(onRestart->onStart->onResume)。
  3. 后台状态管理:应用程序进入后台,AMS根据系统内存情况决定是否清理后台进程。如果系统不足,AMS会根据应用程序优先级情况杀死一些后台进程,释放内存资源。
  4. 终止应用程序:用户退出应用时,AMS会依次调用各个组件生命周期方法,并将其销毁。如果应用程序不再有任何活动组件运行,AMS会结束当前进程释放资源。

任务栈管理

Android中每个应用程序都有自己的任务栈(Task Stack),用于管理活动(Activity)。任务栈后进先出(LIFO)堆栈结构,其中存储着应用程序启动的各个活动实例。新的活动启动时,会被推入任务栈顶部;用户按下Back键或活动被销毁时,活动会被从任务栈中弹出。 任务栈管理由AMS负责。AMS维护了一个任务栈列表,记录系统中所有应用程序的任务栈信息。

  1. 任务栈创建与销毁:用户启动一个应用程序,AMS会创建一个新的任务栈,将Activity压入任务栈;当应用所有Activity销毁时,AMS会销毁该任务栈。
  2. 任务栈调度:用户从一个应用切到另一个应用,AMS会根据应用程序启动模式(standard、singleTop、singleTask、singleInstance)来据欸的那个如何调度任务栈。如:用户启动已经在任务栈中的活动,模式为singleTop,那么AMS会调用该活动的onNewIntent方法,不是创建新的Activity。
  3. 任务栈优先级:由栈顶的Activity优先级决定。AMS根据任务栈优先级决定是否将其置于前台,调度任务栈中的活动。

任务栈(Task)和任务Affinity

任务Affinity指一个Activity所属的任务栈,Activity都有默认的任务Affinity(应用程序的包名)。可以通过AndroidManifest.xml设置activity标签的taskAffinity属性来改变所属任务Affinity。任务Affinity作用:

  1. 影响Activity启动行为:新启动的Activity与当前Activity相同的Affinity,则新Activity会被压入当前Activity任务栈;否则会创建一个新任务栈,将新Activity压入。
  2. 影响Activity启动模式:任务Affinity会影响Activity启动模式中的singleTask和singleInstance模式。在singleTask模式下指定任务Affinity,新Activity会被放入与该任务Affinity相同的任务栈中;在singleInstance模式下,则会创建一个新的任务栈来管理该Activity。

进程管理

进程优先级,由高到低:

  1. 前台进程(Foreground Progress):进程正在与用户交互,如:当前显示的Activity的进程、正在执行前台Service(在Service的onCreate中startForeground(1, notification))的进程等。前台进程拥有最高的优先级,不容易被系统回收。
  2. 可见进程(Visible Process):没有在前台与用户交互,但Activity对用户可见(位于屏幕顶部,被其他Activity的透明部分覆盖)。可见进程优先级次于前台进程,高于后台进程。
  3. 服务进程(Service Process):在后台执行Service,没有与用户直接交互,可能执行一些时间运行的任务。服务进程次于可见进程,高于后台进程。
  4. 后台进程(Background Process):进程对用户不可见,不执行任何可见的Activity或前台Service。后台进程优先级最低,是系统资源回收的首要对象。
  5. 空进程(Empty Process):不含任何应用组件的进程,通常系统保留用于缓存。

AMS根据进程优先级来调度系统资源分配。系统会保持至少一个前台进程,确保用户体验;当系统内存不足时,AMS会优先杀死后台进程,释放内存资源。

Android系统内存管理机制AMS参与其中

  1. 内存分配和回收:Android系统使用Linux内核管理机制分配和回收内存。每个应用运行在独立的进程中,拥有自己的内存空间。应用程序需要分配内存时,AMS会向系统申请一块内存空间,分配给应用程序;当应用不需要某块内存时,AMS会及将其回收,并释放给系统。
  2. 内存压力:系统内存不足时,Android系统会采取一系列措施减少内存压力,如:杀死一些后台进程、清理缓存数据等。AMS负责监控系统内存使用情况,系统内存达到一定阈值时,AMS会触发内存压力事件,采取相应的措施释放内存。
  3. 内存优化:如:进程优先级、内存泄漏检测、内存紧张事件等。AMS会根据这些机制来调度系统资源,保证系统稳定性和性能。

Activity启动流程和AMS

  1. 调用startActivity方法:传入目标Activity的Intent
  2. Intent解析:系统解析Intent,根据ComponentName找到目标Activity对应的类名。
  3. 启动过程交给AMS:AMS根据启动模式等信息判断是否需要创建新进程以及如何启动Activity
  4. 创建Activity实例:AMS会负责创建Activity所在的进程,创建Activity实例。
  5. Activity生命周期调用:AMS会按照生命周期规定调用目标Activity各个生命周期方法,完成Activity创建和初始化。
  6. 界面显示:目标Activity界面会显示在屏幕上,可以与用户交互