Andorid N 最近任务管理器流程详解(五)
来源:互联网 发布:windows查看进程命令 编辑:程序博客网 时间:2024/06/10 17:24
5、其他
这章节主要会讲mRecentTasks赋值的地方,截图的时机,一些重点方法等
5.1 mRecentTasks赋值
分别会在startActivity的过程中和重新resume时对mRecentTasks赋值,另外ActivityStack和AMS两者中的mRecentTasks是同一个,具体可以看源码分析
5.1.1 startActivity
其中startActivity这种情况的代码是:
文件:ActivityStackSupervisor.java
final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app, boolean andResume, boolean checkConfig) throws RemoteException { ... if (andResume) { // 见5.1.2 stack.minimalResumeActivityLocked(r); } ... }
5.1.2 minimalResumeActivityLocked
文件:ActivityStack.java
void minimalResumeActivityLocked(ActivityRecord r) { r.state = ActivityState.RESUMED; if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to RESUMED: " + r + " (starting new instance)" + " callers=" + Debug.getCallers(5)); mResumedActivity = r; r.task.touchActiveTime(); // 赋值的代码 mRecentTasks.addLocked(r.task); completeResumeLocked(r); mStackSupervisor.checkReadyForSleepLocked(); setLaunchTime(r); }
将TaskRecord对象加入到mRecentTasks对象中
5.1.2 重新resume
文件:ActivityStack.java
private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) { ... // 给mRecentTasks赋值 mRecentTasks.addLocked(next.task); ... }
5.2 截图的时机
截图的时机是在Activity onPause时完成的,首先找到onPause的代码:
文件:ActivityStack.java
private void completePauseLocked(boolean resumeNext, ActivityRecord resuming) { ...... // 见5.2.1 mStackSupervisor.ensureActivitiesVisibleLocked(resuming, 0, !PRESERVE_WINDOWS); }
5.2.1 ensureActivitiesVisibleLocked
文件:ActivityStackSupervisor.java
void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges, boolean preserveWindows) { // First the front stacks. In case any are not fullscreen and are in front of home. for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) { final ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks; final int topStackNdx = stacks.size() - 1; for (int stackNdx = topStackNdx; stackNdx >= 0; --stackNdx) { final ActivityStack stack = stacks.get(stackNdx); // 见5.2.2 stack.ensureActivitiesVisibleLocked(starting, configChanges, preserveWindows); } } }
继续调用ActivityStack的ensureActivitiesVisibleLocked
5.2.2 ensureActivitiesVisibleLocked
文件:ActivityStack.java
final void ensureActivitiesVisibleLocked(ActivityRecord starting, int configChanges, boolean preserveWindows) { ... makeInvisible(r, visibleBehind); ... }
接着调用makeInvisible
private void makeInvisible(ActivityRecord r, ActivityRecord visibleBehind) { ...... // 见5.2.3 setVisible(r, false); ...... }
5.2.3 setVisible
文件:ActivityStack.java
private void setVisible(ActivityRecord r, boolean visible) { r.visible = visible; if (!visible && r.mUpdateTaskThumbnailWhenHidden) { // 更新TaskThumbnail,调用screenshotActivitiesLocked,才是真正截图的地方 r.updateThumbnailLocked(r.task.stack.screenshotActivitiesLocked(r), null); r.mUpdateTaskThumbnailWhenHidden = false; } mWindowManager.setAppVisibility(r.appToken, visible); final ArrayList<ActivityContainer> containers = r.mChildContainers; for (int containerNdx = containers.size() - 1; containerNdx >= 0; --containerNdx) { ActivityContainer container = containers.get(containerNdx); container.setVisible(visible); } mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = true; }
看到screenshotActivitiesLocked你应该就会感到很熟悉,之前讲获取缩略图时讲到过,这个是截图的方法,所以setVisible才是真正截图的地方
截图之后,会同过saveImage保存起来,你应该会有映像,在缩略图的获取那个章节中,setLastThumbnailLocked方法调用了该方法,接下来我们来看看saveImage方法
5.2.4 saveImage
文件:RecentTasks.java
void saveImage(Bitmap image, String path) { // 见5.2.5 保存缩略图 mTaskPersister.saveImage(image, path); }
5.2.5 保存缩略图
文件:TaskPersister.java
void saveImage(Bitmap image, String filePath) { synchronized (this) { int queueNdx; for (queueNdx = mWriteQueue.size() - 1; queueNdx >= 0; --queueNdx) { final WriteQueueItem item = mWriteQueue.get(queueNdx); if (item instanceof ImageWriteQueueItem) { ImageWriteQueueItem imageWriteQueueItem = (ImageWriteQueueItem) item; if (imageWriteQueueItem.mFilePath.equals(filePath)) { // replace the Bitmap with the new one. imageWriteQueueItem.mImage = image; break; } } } if (queueNdx < 0) { mWriteQueue.add(new ImageWriteQueueItem(filePath, image)); } if (mWriteQueue.size() > MAX_WRITE_QUEUE_LENGTH) { mNextWriteTime = FLUSH_QUEUE; } else if (mNextWriteTime == 0) { mNextWriteTime = SystemClock.uptimeMillis() + PRE_TASK_DELAY_MS; } // 可以看到保存的路径*** if (DEBUG) Slog.d(TAG, "saveImage: filePath=" + filePath + " now=" + SystemClock.uptimeMillis() + " mNextWriteTime=" + mNextWriteTime + " Callers=" + Debug.getCallers(4)); notifyAll(); } yieldIfQueueTooDeep(); }
看filePath可以的得知路径为:/data/system_ce/0/recent_images
5.3 布局
- recent.xml –> 最近任务管理器的布局
- RecentsView –> 显示最近任务列表的
- private TaskStackView mTaskStackView –> 记录了所有的TaskView;每一个TaskView都代表了一个recent app,也就是一个任务;
- TaskView中onLongClick是处理托动的方法,里面
EventBus.getDefault().register(this, RecentsActivity.EVENT_BUS_PRIORITY + 1);
EventBus.getDefault().send(new DragStartEvent(mTask, this, mDownTouchPos));
是处理事件的开始
- TaskView中onLongClick是处理托动的方法,里面
- private TaskStackView mTaskStackView –> 记录了所有的TaskView;每一个TaskView都代表了一个recent app,也就是一个任务;
- RecentsView –> 显示最近任务列表的
5.4 事件处理
- 一般事件的发出方为:TaskView和TaskStackView
- 事件定义的路径为:frameworks/base/packages/SystemUI/src/com/android/systemui/recents/events
5.5 时序图
暂无
- Andorid N 最近任务管理器流程详解(五)
- Andorid N 最近任务管理器流程详解(一)
- Andorid N 最近任务管理器流程详解(二)
- Andorid N 最近任务管理器流程详解(三)
- Andorid N 最近任务管理器流程详解(四)
- 转贴 详解任务管理器
- 任务管理器五大奇招
- 【Windows 任务管理器进程详解】
- Windows 任务管理器进程详解
- SystemUI任务管理器缩略图获取流程
- 迭代最近点算法流程详解(ICP算法)
- 常用Windows任务管理器进程详解
- 任务管理器开发(一)
- 任务管理器开发(二)
- 任务管理器开发(三)
- 任务管理器
- 任务管理器
- android N 最近任务的 全部清除按钮不隐藏
- mybatis 参考文档地址
- STM32F407时钟配置
- HDU初学者训练指南(转载),感谢前人们的贡献
- HTML5+CSS3(播放视频,矩形,半圆,选择器)
- linux下socket模板函数接受与发送
- Andorid N 最近任务管理器流程详解(五)
- php 之 system exec
- C的八大排序法
- 鼠标悬浮出现列表后点击
- 分布式session
- 【bzoj2150】部落战争(最小路径覆盖)
- cropper.js 实现HTML5 裁剪图片并上传(裁剪上传头像。)
- JZOJ 1407. 教主的游乐场
- 学界 | 机器翻译新突破:谷歌实现完全基于attention的翻译架构