編輯:關於Android編程
我們知道,activity 在 AMS 中的形式是 ActivityRecord,task 在 AMS 中的形式為TaskRecord,進程在 AMS 中的管理形式為 ProcessRecord。
我們先看下 4.4 之前的版本:
android4.4 之前的版本,AMS 管理 Task 是通過一個 ArrayList mHistory 來管理所有的 activity:
結論如下:
(1)所有的 ActivityRecord 會被存儲在 mHistory 管理;
(2) 每個 ActivityRecord 會對應到一個 TaskRecord,並且有著相同 TaskRecord 的
ActivityRecord 在 mHistory 中會處在連續的位置;
(3)同一個 TaskRecord 的 Activity 可能分別處於不同的進程中,每個 Activity 所
處的進程跟 task 沒有關系;
(4)TaskRecord 和 ProcessRecord 沒有聯系。
4.4 版本的管理方式發生了變化:
4.4
4.2
可以發現,4.4 新增了一個 ActivityStackSupervisor 類來輔助管理 TaskStack,查看源碼可知:
/** 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; /** All the non-launcher stacks */ private ArrayList mStacks = new ArrayList(); private static final int STACK_STATE_HOME_IN_FRONT = 0; private static final int STACK_STATE_HOME_TO_BACK = 1; private static final int STACK_STATE_HOME_IN_BACK = 2; private static final int STACK_STATE_HOME_TO_FRONT = 3; private int mStackState = STACK_STATE_HOME_IN_FRONT;
結論如下:
(1)管理層次的最上面是一個 ActivityStack 類型的數組 mStacks,用於管理所有的 ActivityStack。
(2)系統中只有兩個 ActivityStack,一個是 mHomeStack,用於保存 Launcher 的Activity,另一個是 mFocusedStack,用於保存非 Launcher 的 App 的 Activity。
ps:調查發現,長按 home 出現的任務管理界面 Recent 也會保存在 mHomeStack。
(3)mStacks 數組中,只有上述的兩個棧,但不知道為什麼要用一個 List 來管理這兩個元素。
(4)在每個 ActivityStack 中,都可以擁有多個 TaskRecord。這些 TaskRecord 存儲在 ActivityStack.java:ArrayList
(5)在 TaskRecord 中,包含 ArrayList mActivities,用於存放該Task 中的所有的 Activity 的信息;包含 ActivityStack stack,用於記錄所屬的棧;包含 int
numActivities,用於記錄當前 Task 中的 Activity 數量。
(6)綜合上面的分析可知,要想找到某個 Activity,需要按層次查找:先找到對應的棧,再找到棧中的 Task,再在該 Task 中查找 Activity。
需要注意的是:
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); } } } ActivityStack getLastStack() { switch (mStackState) { case STACK_STATE_HOME_IN_FRONT: case STACK_STATE_HOME_TO_BACK: return mHomeStack; case STACK_STATE_HOME_TO_FRONT: case STACK_STATE_HOME_IN_BACK: default: return mFocusedStack; } }
ViewAndroid所有的控件都是View或者View的子類,它其實表示的就是屏幕上的一塊矩形區域,用一個Rect來表示,left,top表示View相對於它的pare
react-native-easy-toast一款簡單易用的 Toast 組件,支持 Android&iOS。安裝1.在終端運行 npm i react-nati
南丁格爾玫瑰圖 在常規圖表中實在很驚艷,但我初看沒看懂,一查原來南丁格爾這麼偉大,確實值得尊敬。再仔細研究了下這種圖的構成,發現原來就是把柱形圖的柱形換成了扇形圖的半徑來
概要 對於mvp模式,大家都知道是由mvc演變而來的,對於MVC大家都知道 M Model(用於存放實體模型與業務邏輯) V View(存放布局和資源文件) C Co