ActivityManagerService(简称AMS)是Android三大核心的功能之一(其他两个是View,WindowManagerService),它的代码庞大(约2万行),逻辑纷繁,主要负责系统中四大组件的启动、切换、调度及应用程序进程的管理和调度等工作。对于这样庞大复杂的代码,我们应该从它的功能角度出发,分析它的每个功能对应的代码逻辑,逐个突破。
public final class ActivityThread {
......
final ApplicationThread mAppThread = new ApplicationThread();
final Looper mLooper = Looper.myLooper();
final H mH = new H();
final ArrayMap<IBinder, ActivityClientRecord> mActivities = new ArrayMap<>();
......
final ArrayMap<IBinder, Service> mServices = new ArrayMap<>();
......
Application mInitialApplication;
final ArrayList<Application> mAllApplications
= new ArrayList<Application>();
......
final ArrayMap<IBinder, ProviderClientRecord> mLocalProviders
= new ArrayMap<IBinder, ProviderClientRecord>();
......
private class ApplicationThread extends ApplicationThreadNative {
......
}
......
}
public class ActivityManagerService extends ActivityManagerNative
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
......
final ActivityStackSupervisor mStackSupervisor;
......
final ProcessMap<ProcessRecord> mProcessNames = new ProcessMap<ProcessRecord>();
......
final SparseArray<ProcessRecord> mPidsSelfLocked = new SparseArray<ProcessRecord>();
}
final class ProcessRecord {
......
final ApplicationInfo info; //进程中第一个APK包信息
......
final String processName;
......
// List of packages running in the process
final ArrayMap<String, ProcessStats.ProcessStateHolder> pkgList = new ArrayMap<>();
......
IApplicationThread thread;
......
int pid;
......
final ArraySet<BroadcastRecord> curReceivers = new ArraySet<BroadcastRecord>();
......
// all activities running in the process
final ArrayList<ActivityRecord> activities = new ArrayList<>();
// all ServiceRecord running in this process
final ArraySet<ServiceRecord> services = new ArraySet<>();
......
final ArrayMap<String, ContentProviderRecord> pubProviders = new ArrayMap<>();
}
在Android中,
每一件事可以被看作是一个Task,一个Task又可以被细分成多个子步骤,每个子步骤可以被看作是一个Activity。这个Activity 既可以是本程序进程中的Activity,也可以是其他程序进程中的的Activity,这种基于组件的设计,弱化了进程的概念,
通过重用Activity可以节省一定的开销,同时为用户提供一致的界面和用户体验。比如,你在自己的程序中想发邮件,你就可以定义一个具有"send"动作的Intent,并且传入一些数据,如对方邮箱地址、邮件内容等,然后就会有系统的Activity被打开,发送完邮件,点击返回仍然还是会回到你的应用程序当中,这让用户看起来好像刚才那个编写邮件的Activity就是你的应用程序当中的一部分。所以说,即使有很多个Activity分别都是来自于不同应用程序的,Android系统仍然可以将它们无缝地结合到一起,之所以能实现这一点,就是因为这些Activity都是存在于一个相同的任务(Task)当中的。
final class TaskRecord extends ConfigurationContainer implements TaskWindowContainerListener {
......
final int taskId; // Unique identifier for this task.
String affinity; // The affinity name for this task, or null; may change identity.
......
/** List of all activities in the task arranged in history order */
final ArrayList<ActivityRecord> mActivities;
/** Current stack. Setter must always be used to update the value. */
private ActivityStack mStack;//当前任务的管理者
......
}
TaskRecord 的affinity属性是第一次创建这个task时指定的值,可以把他当作这个Task的名字,Activity所在的Task可以通过AndroidManifest.xml中<Activity>标签中的android:taskAffinity="xxx"来指定,通常不去主动设置一个Activity的taskAffinity属性,那么taskAffinity的值缺省使用包名。所以,同一个应用中所有的Activity的taskAffinity属性值默认都是相同的,都是包名,所以在应用中使用FLAG_ACTIVITY_NEW_TASK标志去启动一个本应用中的一个Activity,也不会创建一个新的task,除非这个Activity 额外指定了不同的taskAffinity属性值。final class ActivityRecord extends ConfigurationContainer implements AppWindowContainerListener {
......
final ActivityManagerService service; // owner
final IApplicationToken.Stub appToken; ////token用来和wms交互
final ActivityInfo info; // all about me
final ApplicationInfo appInfo; // information about activity's app
......
final Intent intent; // the original intent that generated us
final ComponentName realActivity; // the intent component, or target of an alias.
final String resolvedType; // as per original caller;
final String packageName; // the package implementing intent's component
final String processName; // process where this component wants to run
final String taskAffinity; // as per ActivityInfo.taskAffinity
......
int mActivityType;
......
private int logo; // resource identifier of activity's logo.
private int theme; // resource identifier of activity's theme.
private TaskRecord task;
......
ProcessRecord app; // if non-null, hosting application
ActivityState state; // current state we are in
......
}
class ActivityStack<T extends StackWindowController> extends ConfigurationContainer
implements StackWindowListener {
......
private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();
......
final int mStackId;
......
/** Run all ActivityStacks through this */
protected final ActivityStackSupervisor mStackSupervisor;
}
提示:Android 在4.4版本之前的的栈结构与现在的不同,请看下面4.4之前的代码结构public class ActivityStack {
......
final boolean mMainStack;
......
final ArrayList<ActivityRecord> mHistory = new ArrayList<ActivityRecord>();
}
class TaskRecord extends ThumbnailHolder {
......
int numActivities;
......
}
在Android 在4.4版本之前,ActivityStack类型只有一个:mMainStack,并且 ActivityStack用mHistory这个ArrayList保存所有的ActivityRecord,令人大跌眼镜的是,该mHistory保存了系统中所有Task的ActivityRecord,而不是针对某个Task进行保存。这种实现方式有优点亦有缺点,优点是:少了TaskRecord一级的管理,直接以ActivityRecord为管理单元,这种做法能降低管理方面的开销;缺点是:弱化了Task的概念,结构不够清晰。虽然栈结构变化,但是设计理念还是不变的。
public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener {
......
final ActivityManagerService mService;
......
WindowManagerService mWindowManager;
DisplayManager mDisplayManager;
......
ActivityStack mHomeStack;
ActivityStack mFocusedStack;
private ActivityStack mLastFocusedStack;
......
/** Mapping from (ActivityStack/TaskStack).mStackId to their current state */
SparseArray<ActivityStack> mStacks = new SparseArray<>();
}
mHomeStack 中只保存了 Launcher APP中相关的Task,包括Launcher、RecentTask,Keyguad,,除此之外的其他 Task 则都放入mFocusStack 中管理,mStacks以键值的方式保存了所有的ActivityStack,用来查询所需要的ActivityStack,其中的键是StackId。(三)ActivityThread和AMS通信模型