我是靠谱客的博主 洁净硬币,最近开发中收集的这篇文章主要介绍Andorid N 最近任务管理器流程详解(五)5、其他,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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));

          是处理事件的开始

5.4 事件处理

  • 一般事件的发出方为:TaskView和TaskStackView
  • 事件定义的路径为:frameworks/base/packages/SystemUI/src/com/android/systemui/recents/events

5.5 时序图

暂无

最后

以上就是洁净硬币为你收集整理的Andorid N 最近任务管理器流程详解(五)5、其他的全部内容,希望文章能够帮你解决Andorid N 最近任务管理器流程详解(五)5、其他所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部