Andorid 4.4 AMS (1 데이터 구조)
사실은 말하자면 그 가 말 하 는 stack 은 모두 Array List 입 니 다. Array List 로 stack 을 모 의 했 습 니 다. 처음에 stack 이 라면 어떻게 안에 activity 를 찾 는 지 궁금 하기 시 작 했 습 니 다. 스 택 꼭대기 요 소 를 조작 하 는 것 이 아 닙 니까?
전체 stack:
/** All the non-launcher stacks */
private ArrayList<ActivityStack> mStacks = new ArrayList<ActivityStack>();
이 mStacks 는 모든 stack 을 저장 합 니 다. 그 중에서 모든 stack 에는 하나의 task 가 저장 되 어 있 고 모든 task 에는 activity 가 저장 되 어 있 습 니 다.
전체적인 크기 관 계 는:
mStacks > Stack > task [처음에는 대소 관 계 를 잘 모 르 고 한참 을 고민 했다. 이 코드 에서 알 수 있다]
void removeTask(TaskRecord task) {
mWindowManager.removeTask(task.taskId);
final ActivityStack stack = task.stack;
final ActivityRecord r = stack.mResumedActivity;
if (r != null && r.task == task) {
stack.mResumedActivity = null;
}
if (stack.removeTask(task) && !stack.isHomeStack()) {
if (DEBUG_STACK) Slog.i(TAG, "removeTask: removing stack " + stack);
mStacks.remove(stack);
final int stackId = stack.mStackId;
final int nextStackId = mWindowManager.removeStack(stackId);
// TODO: Perhaps we need to let the ActivityManager determine the next focus...
if (mFocusedStack == null || mFocusedStack.mStackId == stackId) {
// If this is the last app stack, set mFocusedStack to null.
mFocusedStack = nextStackId == HOME_STACK_ID ? null : getStack(nextStackId);
}
}
}
여기 서 삭제 하 는 것 은 task 입 니 다. 먼저 이 task 가 있 는 stack 을 가 져 옵 니 다. 바로 세 번 째 줄 코드 입 니 다. 그리고 이 stack 의 task 를 삭제 한 다음 에 이 줄 코드 를 주의 하 십시오.
4. 567913. 모 때문에 나 는 task 만 삭제 하고 너 는 나의 stack 도 삭제 하려 고 하 니?혹시 task > stack??
관건 은 여기에 있다.
mStacks.remove(stack);
이 if 문 구 는 stack 으로 돌아 가서 그의 removeTask 의 실현 을 보 겠 습 니 다.
if (stack.removeTask(task) && !stack.isHomeStack()) {
원래 stack 에서 task 를 삭제 할 때 마지막 으로 현재 stack 의 task 가 비어 있 는 지 판단 합 니 다. 아무것도 없 으 면 이 stack 도 삭제 할 수 있 습 니 다.
이것 또한 mStacks > stack > task 를 증명 합 니 다.
전체 Activity Stack Supervisor. java 를 살 펴 보면 Stack 에 관 한 것 은 mStacks 를 제외 하고 전체 stack 의 집합 이 고 모두 2 개의 stack 이다. 각각:
4. 567913. 이 두 가지 만...
mHomestack 은 luncher 와 관련 된 내용 을 저장 합 니 다. 즉, home 입 니 다. 다른 하 나 는 현재 초점 에 있 는 stack 을 저장 합 니 다. mHomestack 은 켜 진 후에 자동 으로 mStacks 에 가입 합 니 다. 그리고 0 번 위치 만 차지 하고 mFocusedStack 은 1 번 위 치 를 차지 합 니 다.
boolean removeTask(TaskRecord task) {
final int taskNdx = mTaskHistory.indexOf(task);
final int topTaskNdx = mTaskHistory.size() - 1;
if (task.mOnTopOfHome && taskNdx < topTaskNdx) {
mTaskHistory.get(taskNdx + 1).mOnTopOfHome = true;
}
mTaskHistory.remove(task);
return mTaskHistory.isEmpty();
}
디 버 깅 할 때 10 여 개의 애플 리 케 이 션 을 켰 는데 이 애플 리 케 이 션 의 activity 가 모두 mFocused Stack 에 들 어 갔 음 을 발 견 했 습 니 다. mStacks 의 두 번 째 위 치 는 사용 되 지 않 았 습 니 다. 궁금 합 니 다. 제 가 많이 사용 하지 않 았 는 지 모 르 겠 습 니 다. 만약 에 2 개의 위치 만 사용 하면 mStacks 가 쓸데없는 짓 이 아 닙 니까?이것 도 잘 생각해 봐 야 겠 다.
이것 봐:
/** The stack containing the launcher app */
private ActivityStack mHomeStack;
/** The non-home stack currently receiving input or launching the next activity. If home is
* in front then mHomeStack overrides mFocusedStack.
* DO NOT ACCESS DIRECTLY - It may be null, use getFocusedStack() */
private ActivityStack mFocusedStack;
이 두 stack 에서 왔다갔다 하 는 것 같 습 니 다. 세 번 째 위 치 를 사용 할 지 에 대해 서 는 좀 더 확인 이 필요 합 니 다.