前言
ActivityManagerService(AMS)负责管理应用的生命周期和任务栈。它是Android系统的核心之一。
- 生命周期管理:AMS负责监控和管理应用程序Activity生命周期,包括:创建、启动、暂停、恢复、停止和销毁等状态。
- 任务栈管理:AMS维护任务栈(Task Stack),存放不同应用的Activity实例。负责管理任务栈的创建、销毁、任务切换等。
- 进程管理:进程创建、销毁以及进程通信等
- 启动模式管理:管理Activity启动模式(Launch Mode),根据不同的启动模式来决定Activity的创建:单实例、单任务等。
AMS启动过程
- Zygote初始化:系统启动时,Zygote进程会被初始化,并创建SystemService进程。
- SystemService初始化:SystemService进程会初始化各种系统服务,包括AMS。
- AMS初始化:AMS初始化各种数据结构和状态,监听来自系统的消息和请求
- Zygote是Android系统的特殊进程,负责为系统创建其他应用程序进程。
- SystemServer是Android系统中核心服务进程,负责初始化和管理各种系统服务
- AMS会在SystemServer进程中初始化,并成为系统四大组件管理中心
生命周期管理
Android系统中,AMS监控应用的组件(Activity、Service、Broadcast Receiver)的状态变化,管理应用程序生命周期。
- 启动应用程序:用户点击应用图标时,AMS首先会启动应用的进程(如果该应用的进程尚未存在),然后创建应用程序的启动Activity,并调用生命周期(onCreate->onStart->onResume)
- 活动状态管理:应用处于前台活动状态时,AMS监控用户与应用程序交互,如:按下Home键、切换到其他应用等。用户切到其他应用时,当前Activity依次调用生命周期(onPause->onStop)。当用户返回应用时,AMS会将应用任务栈顶部的Activity调回前台,调用生命周期(onRestart->onStart->onResume)。
- 后台状态管理:应用程序进入后台,AMS根据系统内存情况决定是否清理后台进程。如果系统不足,AMS会根据应用程序优先级情况杀死一些后台进程,释放内存资源。
- 终止应用程序:用户退出应用时,AMS会依次调用各个组件生命周期方法,并将其销毁。如果应用程序不再有任何活动组件运行,AMS会结束当前进程释放资源。
任务栈管理
Android中每个应用程序都有自己的任务栈(Task Stack),用于管理活动(Activity)。任务栈后进先出(LIFO)堆栈结构,其中存储着应用程序启动的各个活动实例。新的活动启动时,会被推入任务栈顶部;用户按下Back键或活动被销毁时,活动会被从任务栈中弹出。 任务栈管理由AMS负责。AMS维护了一个任务栈列表,记录系统中所有应用程序的任务栈信息。
- 任务栈创建与销毁:用户启动一个应用程序,AMS会创建一个新的任务栈,将Activity压入任务栈;当应用所有Activity销毁时,AMS会销毁该任务栈。
- 任务栈调度:用户从一个应用切到另一个应用,AMS会根据应用程序启动模式(standard、singleTop、singleTask、singleInstance)来据欸的那个如何调度任务栈。如:用户启动已经在任务栈中的活动,模式为singleTop,那么AMS会调用该活动的onNewIntent方法,不是创建新的Activity。
- 任务栈优先级:由栈顶的Activity优先级决定。AMS根据任务栈优先级决定是否将其置于前台,调度任务栈中的活动。
任务栈(Task)和任务Affinity
任务Affinity指一个Activity所属的任务栈,Activity都有默认的任务Affinity(应用程序的包名)。可以通过AndroidManifest.xml设置activity标签的taskAffinity属性来改变所属任务Affinity。任务Affinity作用:
- 影响Activity启动行为:新启动的Activity与当前Activity相同的Affinity,则新Activity会被压入当前Activity任务栈;否则会创建一个新任务栈,将新Activity压入。
- 影响Activity启动模式:任务Affinity会影响Activity启动模式中的singleTask和singleInstance模式。在singleTask模式下指定任务Affinity,新Activity会被放入与该任务Affinity相同的任务栈中;在singleInstance模式下,则会创建一个新的任务栈来管理该Activity。
进程管理
进程优先级,由高到低:
- 前台进程(Foreground Progress):进程正在与用户交互,如:当前显示的Activity的进程、正在执行前台Service(在Service的onCreate中startForeground(1, notification))的进程等。前台进程拥有最高的优先级,不容易被系统回收。
- 可见进程(Visible Process):没有在前台与用户交互,但Activity对用户可见(位于屏幕顶部,被其他Activity的透明部分覆盖)。可见进程优先级次于前台进程,高于后台进程。
- 服务进程(Service Process):在后台执行Service,没有与用户直接交互,可能执行一些时间运行的任务。服务进程次于可见进程,高于后台进程。
- 后台进程(Background Process):进程对用户不可见,不执行任何可见的Activity或前台Service。后台进程优先级最低,是系统资源回收的首要对象。
- 空进程(Empty Process):不含任何应用组件的进程,通常系统保留用于缓存。
AMS根据进程优先级来调度系统资源分配。系统会保持至少一个前台进程,确保用户体验;当系统内存不足时,AMS会优先杀死后台进程,释放内存资源。
Android系统内存管理机制AMS参与其中
- 内存分配和回收:Android系统使用Linux内核管理机制分配和回收内存。每个应用运行在独立的进程中,拥有自己的内存空间。应用程序需要分配内存时,AMS会向系统申请一块内存空间,分配给应用程序;当应用不需要某块内存时,AMS会及将其回收,并释放给系统。
- 内存压力:系统内存不足时,Android系统会采取一系列措施减少内存压力,如:杀死一些后台进程、清理缓存数据等。AMS负责监控系统内存使用情况,系统内存达到一定阈值时,AMS会触发内存压力事件,采取相应的措施释放内存。
- 内存优化:如:进程优先级、内存泄漏检测、内存紧张事件等。AMS会根据这些机制来调度系统资源,保证系统稳定性和性能。
Activity启动流程和AMS
- 调用startActivity方法:传入目标Activity的Intent
- Intent解析:系统解析Intent,根据ComponentName找到目标Activity对应的类名。
- 启动过程交给AMS:AMS根据启动模式等信息判断是否需要创建新进程以及如何启动Activity
- 创建Activity实例:AMS会负责创建Activity所在的进程,创建Activity实例。
- Activity生命周期调用:AMS会按照生命周期规定调用目标Activity各个生命周期方法,完成Activity创建和初始化。
- 界面显示:目标Activity界面会显示在屏幕上,可以与用户交互