在 Android ROS (11) 及之前,是 ActivityStackSupervisor.
在 Android SOS (12) 及之后,是 ActivityTaskSupervisor.
即由 XXXStackXXX -> XXXTaskXXX.
再往后可能会删除这个类,把它的逻辑移至相关类中.
另外, Android SOS 上也删除了 ActivityStack 类(继承自 Task).
猜测是统一用 Task 了, 太多类更容易 混淆.
1. 源码
frameworks/base/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java
// TODO: This class has become a dumping ground. Let's
// - Move things relating to the hierarchy to RootWindowContainer
// - Move things relating to activity life cycles to maybe a new class called ActivityLifeCycler
// - Move interface things to ActivityTaskManagerService.
// - All other little things to other files.
public class ActivityTaskSupervisor implements RecentTasks.Callbacks {
private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityTaskSupervisor" : TAG_ATM;
final ActivityTaskManagerService mService;
RootWindowContainer mRootWindowContainer;
/** List of requests waiting for the target activity to be launched or visible. */
private final ArrayList<WaitInfo> mWaitingActivityLaunched = new ArrayList<>();
/** List of activities that are ready to be stopped, but waiting for the next activity to
* settle down before doing so. */
final ArrayList<ActivityRecord> mStoppingActivities = new ArrayList<>();
/**
* Cached value of the topmost resumed activity in the system. Updated when new activity is
* resumed.
*/
private ActivityRecord mTopResumedActivity;
从上面的变量可以看出, 它有与 ATMS /RWC 交互,并且后续的逻辑会移动到对应的类。
并且 有系列 关于 Activity 生命周期的操作
再看下它的构造函数:
public ActivityTaskSupervisor(ActivityTaskManagerService service, Looper looper) {
mService = service;
mLooper = looper;
mHandler = new ActivityTaskSupervisorHandler(looper);
}
void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) {
// Is this activity's application already running?
final WindowProcessController wpc =
mService.getProcessController(r.processName, r.info.applicationInfo.uid);
boolean knownToBeDead = false;
if (wpc != null && wpc.hasThread()) {
try {
realStartActivityLocked(r, wpc, andResume, checkConfig);
}
一些关键方法:
boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,
boolean andResume, boolean checkConfig) throws RemoteException {
final Task task = r.getTask();
final Task rootTask = task.getRootTask();
}
2. 已删除的 ActivityStack
在 Android S (12) 上,已经删除了 ActivityStack。
Android 11 上才有。
2.1 Android ROS (11) 上的 ActivityStack
frameworks/base/services/core/java/com/android/server/wm/ActivityStack.java
/**
* State and management of a single stack of activities.
*/
class ActivityStack extends Task {
private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityStack" : TAG_ATM;
enum ActivityState {
INITIALIZING,
STARTED,
RESUMED,
PAUSING,
PAUSED,
STOPPING,
STOPPED,
FINISHING,
DESTROYING,
DESTROYED,
RESTARTING_PROCESS
}
/**
* Used to keep resumeTopActivityUncheckedLocked() from being entered recursively
*/
boolean mInResumeTopActivity = false;
int mCurrentUser;
/** For comparison with DisplayContent bounds. */
private Rect mTmpRect = new Rect();
private Rect mTmpRect2 = new Rect();
一些关键方法:
void moveToFront(String reason) {
moveToFront(reason, null);
}
/**
* @param reason The reason for moving the stack to the front.
* @param task If non-null, the task will be moved to the top of the stack.
* */
void moveToFront(String reason, Task task) {
if (!isAttached()) {
return;
}
final TaskDisplayArea taskDisplayArea = getDisplayArea();
}
/**
* This moves 'task' to the back of this task and also recursively moves this task to the back
* of its parents (if applicable).
*
* @param reason The reason for moving the stack to the back.
* @param task If non-null, the task will be moved to the bottom of the stack.
**/
void moveToBack(String reason, Task task) {
if (!isAttached()) {
return;
}
final TaskDisplayArea displayArea = getDisplayArea();
}
@GuardedBy("mService")
boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {
if (mInResumeTopActivity) {
// Don't even start recursing.
return false;
}
boolean result = false;
try {
}
void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity,
boolean newTask, boolean keepCurTransition, ActivityOptions options) {
Task rTask = r.getTask();
final boolean allowMoveToFront = options == null || !options.getAvoidMoveToFront();
final boolean isOrhasTask = rTask == this || hasChild(rTask);
// mLaunchTaskBehind tasks get placed at the back of the task stack.
if (!r.mLaunchTaskBehind && allowMoveToFront && (!isOrhasTask || newTask)) {
// Last activity in task had been removed or ActivityManagerService is reusing task.
// Insert or replace.
// Might not even be in.
positionChildAtTop(rTask);
}
Task task = null;
}
大概可以看出,这些方法现在都在 Task 类里。
网友评论