startActivityUnchecked 开始处理Activity的栈

在这个办法中,便是面试常问的建议办法,几种办法混搭在一次,在栈内的状况。

这儿我分为7数据结构c语言版个进程来详细剖析Acti索引失效的几种状况vity栈的算法。

初始化核算Activity栈

    private int startActivityUnchecked(f操作系统有哪些inal ActivityRecord r, ActivityRecord sourceRecord,
IVoiceInteractionSession voiceSession, IVoiceInter操作系统是什么的接口actor voiceInteractor,
int startFlags, boolean d缓存视频兼并oResume, ActivityOptions optio索引页是哪一页ns, TaskRecord inTask,
ActivityRecord[] outActivity) {
setInitialState(r数据结构课程设计, optio索引页是哪一页ns, inTask,数据结构课程设计 doResume, startFlags, sourceRecord, voiceSession,
voiceInteractor);
computeLaunchingTas操作系统有哪些kFlags();
computeSourceStack();
mIntent.setFlags(mLaunchFlags);
ActivityRecord reusedActivity = getReusableIntentActivity(索引失效的几种状况);

setInitialState初始化如下的数据

 private void setIni缓存tial数据结构有哪些State(ActivityRecord r, ActivityOptions options, TaskRec索引超出矩阵维度ord inTask,
boolean doResume, int startFlags, ActivityRecord sourceRecord,
IVoiceInteractionSession voiceSession, IVoiceInteractor voi缓存视频兼并app下载ceI面试问题大全及答案大全nteractor) {
reset(false /* clearRequest */);
mStartActivity = r;
mIntent = r.intent;
mOptions = options;
mCallingUid = r.launchedFromUid;
mSourceRecord = sourceRecord;
mVoiceSession = voiceSession;
mVoiceInteractor = voiceInte数据结构课程设计ractor;
//获取一个优先的逻辑闪现器,是否是vr办法(相关源码会在之后说DisplayService)
m数据结构P数据结构严蔚敏第二版课后答案referredDisplayId = getPreferedDi索引splayId(mSourceRecord, mStartActivity, options);
mLaunchParams.reset();
mSupervisor.getLaunchParamsController().calculate(inTask, null /*layout*/, r, sourceRecord,
options, mLaunchParams);
mLaunchMode = r.launchMode;
mLaunchF操作系统是对什么进行处理的软件lags = adjustLaunchFlagsToDocumentMode(索引是什么意思
r, LAUNCH_SI操作系统的主要功用是N数据结构c语言版GLE_INSTANCE == mLaunchMode,
LAUNCH_SINGLE_TASK == mLaunchMode, mIntent索引页是哪一页.getFlags());
mLaunchTaskBehind = r.mLaunchTaskB索引失效ehind
&& !isLaunchModeOneOf(LAUNCH_SINGLE_TASK, LAUNCH_SINGLE_INSTANCE)
&amp数据结构教程第5版李春葆答案;& (mLaunchFl索引超出了数组边界什么意思ags & F数据结构题库LAG_ACTIVITY_NEW_DOCUMENT) != 0;
sendNewTaskResultRequestIfNeeded();
if ((mLaunc缓存hFlags &操作系统期末考试试题及答案amp; FLAG_ACTIVITY_操作系统是一种NEW_DOCUMENT) != 0 && r.resultTo == null) {
mLaunchFlags |= FLAG_ACTIVITY_NEW_TAS缓存视频兼并app下载K;
}
// If we are actually going to launch in to a new task, there are s数据结构严蔚敏第二版课后答案ome cases where
// we further want to do multiple task.
if ((mLaunchFlags &amp数据结构c语言版; FLAG_ACTIVITY_NEW_TASK) != 0) {
if (mLaunchTaskBehind
|| r.info.documentLaunchMode == DOCUMENT_LAUNCH_A索引超出了数组边界什么意思LWAYS) {
mLaunchFlags |= FLAG_ACTIVITY_MULTIPLE_TASK;
}
}
// We'll invoke onUse数据结构题库rLeav面试毛遂自荐3分钟通用ing before onPaus操作系统e o操作系统nly if the launching
// activity did not explicitly sta操作系统的主要功用是te that this i缓存s an automated l面试毛遂自荐aunch.
mSupervisor.mUserLeaving = (mLaunchFlags & FLAG_ACTIVITY_NO_USER_ACTION) == 0;
if (DEBUG_USER_LEAVING面试必问10大问题答复) Slog.v(TAG_USER_LEAVING,
"startActivity() => mUserLeaving=" + mSupervisor.mUserLeaving);
// If the caller has asked not to res操作系统是一种ume at this point, we make note
/索引页是哪一页/ of this in the record so that we can skip it when trying to find
// the top running activity.
mDoResume = doResume;
if (!doResume || !r.okToSh面试技巧owLocked()) {
r.delayedResume = true缓存视频在手机哪里找;
mD操作系统的五大功用oResume = false;
}
i索引超出矩阵维度f (mOptions != null) {
if (mOp数据结构知识点总结tions.getLaunchTas数据结构c语言版kId() != -1 && mOptions.getTaskOverlay()) {
r.mTaskOverlay = true;
if (!mOptions.canTaskOverlayResume()) {
final TaskRecord task = mSupervisor.anyTaskForI面试问题dLocked(
mOptions.getLaunchTaskId());
final ActivityRecord top缓存 = task != null ? task.getTopActivity() : null;
if (top != null && !top.isState(RESUMED)) {
// The c面试毛遂自荐简略大方aller specifies that we'd like to be avoided to be moved to the
// front, so be it!
mDoResume = false;
mAvoidM数据结构严蔚敏oveToFro操作系统的主要功用是nt = true;
}
}
} else if (mOptions.getAvoidMoveToFront数据结构与算法())数据结构严蔚敏第二版课后答案 {
mDoResu操作系统m操作系统的主要功用是e =面试毛遂自荐 false;
mAvoidMo操作系统是一种什么软件veToFront = tru面试常见问题及答复技巧e;
}
}
mNotTop = (mLaunchFlags & FLAG_ACTIVITY_PREVIOUS_IS_TOP) != 0 ? r : null;
mInTas操作系统的基本特征k = inTask;
// In some flows in to this function, we retrieve th数据结构课程设计e面试毛遂自荐简略大方 task record and h索引失效的几种状况old on to it
// without a lock before calling back in to here...  so the task at this point may
// not索引贴 actually be in recents.  Check for that, and if it isn't in recents just
// consider it invalid.
i面试常见问题及答复技巧f (inTask != null && !inTask数据结构.inRecents) {
Slog.面试必问10大问题答复w(TAG, "Starting activity in task no索引超出了数组边界什么意思t in recents: " + inTask);
mInTask = null;
}
mStartFlags = startFlags;
// If the onlyIfNeeded flag is set, then we can do this if the activity being launched
//操作系统是什么的接口 is the same as the one making the call...  or, as a special case, if we d操作系统的主要功用是o not know
// the caller then we count the current top activit索引超出了数组边界什么意思y as the call操作系统是一种er.
if ((startFlags & STA数据结构与算法剖析RT_FLAG_ONLY_IF_NEEDED) != 0) {
ActivityRecord checkedCaller = sourceRecord;
if (checkedCaller == null) {
checkedCaller = mSupervisor.mFocusedStack.topRunningNonDelayedActivityLocked(
mNotTop);
}
if (!checkedCaller.realActivity.缓存视频兼并equal面试毛遂自荐简略大方s(r.realActivity)) {
// Caller is not th缓存视频在手机哪里找e same as launcher, s数据结构o always needed.
mStartFlags &= ~START_FLAG_ONLY_IF_NEEDED;
}
}
mNoAnimation =面试必问10大问题答复 (数据结构严蔚敏第二版课后答案mLaunchFlags & FLAG_ACTIVITY_NO_ANIMATION) != 0;
}

不难看到,在这个办法中,把整索引符号个参数赋值给Activity数据结构教程第5版李春葆答案Sta面试rter的全局变量,以供之后一切的流程运用。咱们能看到这儿能看到此刻会略微对一些Intent建议的fl操作系统当时的配备不能运转此应用程序ag进行处理。这儿略微翻开一些值得留神的细节聊聊。

  • 1.getPreferedDisplayId(mSourceRecord面试毛遂自荐3分钟通用, mStartActivity, options);操作系统期末考试试题及答案 该办法经过建议的ActivityRecor数据结构课程设计d来判别是否是VR办法。是则直接操作系统期末考试试题及答案回来一个主displayId,不然从AMS获取DisplayId。这个D数据结构严蔚敏isplayId操作系统是什么的接口简略的索引的效果及优缺点说便是一个索引,能够经过它从SurfaceFlinger的Binder长途方针,然后找到一个逻辑闪现器。

  • 2.mSupervisor面试问题大全及答案大全.getLaunchParams数据结构教程第5版李春葆答案Controller().calculate()该办法实践上获取注册在LaunchParamsController中LaunchParamsModifier进行缓存视频怎样转入相册核算其表现在屏幕上的区域。实践上最基础有两索引贴个LaunchParamsModifier

  • 1.TaskLaunchParamsModifier

  • 2.A数据结构ctivityLaun索引超出了数组边界什么意思chParamsModifi数据结构题库er

咱们检查源码能够看到真实缓存数据能够铲除吗操控窗口巨细改动(批改TaskRecord的Re操作系统ct值,方位)的是TaskLaunchPara数据结构msModifier。而ActivityLaunchParamsModifier缓存视频兼并将当时的区域巨细面试毛遂自荐记载到LaunchParam中。咱们平常或许很少这索引超出了数组边界什么意思么运用,实践上在ActivityOptions的setLaunchBounds中能够操控新缓存视频兼并app下载建的Activit面试y的窗体巨细和方位。

因而咱们能够猜想文档常常所说的使命(也便是TaskRecord)是不是指Activity的窗体在AMS中的方针

  • 3.adjustLaunchFlagsToDocumentMode
    在Activity建议数据结构与算法剖析的flag中有一个FLAG_索引的效果及优缺点ACTIVITY_NEW_DOCUMENT。 这个flag如操作系统是一种下:

缓存视频怎样转入相册建议的Activity开一个新的使命记载,当运用new_document或许android: documentLaunchMode的时分,相同的实例会在最近使命表中发生不同的记载。
直接从new_document回退,直接回退桌面,想要改动这个行为,添加FLAG

实践上new_docume操作系统是一种nt新建了一个新的前史记载以及一个新的栈。咱们看看adjustLaunchFlagsToDocumentMode这个办法是怎样开始处理new_document的。

private int adjustLaunchFlagsToDocumentMode(ActivityRecord r, boolean la缓存是什么意思unchSingleInstance,
boolean launchSingleTa数据结构严蔚敏第二版课后答案sk, int launchFlags) {
if ((launchFlags & Intent.FLAG_ACTIVITY_NEW_DOCUMENT) != 0 &&
(launchSingleInstance |数据结构与算法| launchSingleTask)) {
launc索引符号hFlags &=
~(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | FL缓存是什么意思AG_ACTIVITY_MULTIPLE_TASK);
} e缓存视频在手机哪里找lse {
switch (r.info.documentLaunchMode) {
case ActivityInfo.DOCUMENT_LAUNCH_NONE:
break;
case Activ索引失效的几种状况ityInfo.DOCUMENT_LAUNCH_INTO_EXISTING:
launchFlags |= Intent.FLAG_ACTIVITY_NEW_DOCUMENT;
break;
case ActivityInfo.DOCUMENT_LAUNCH_ALWAYS:
launchFlags |= Intent.FLAG_ACTIVITY_NEW_操作系统有哪些DOC面试技巧UMENT;
break;
case ActivityInfo.DOC面试问题UMENT_面试毛遂自荐简略大方LAUNCH_NEVER:
launchFlags &= ~FLAG_ACTIVITY_MULTIPLE_TASK;
break;
}
}
return laun索引超出矩阵维度chFlags;
}

这儿面做了两个处理:

1.当存在new_document的时分,可是l数据结构c语言版aunchMode是singleTask或许singleInstanceTask的时分,将会封闭new_document以及MULTIPLE_TASK。因而你会发现此刻运用了singleTask或许singleInstanceTask,将不会翻开新的前史记载以及Activity栈。

2.当判别到在AndroidManifest中设置了索引失效的几种状况documentLaunchMode,则为其添加flag到建议项中。
能够看到的是:

  • 假定读取到的是NONE不添加flag
  • 读取到I数据结构严蔚敏第二版课后答案NTO_缓存视频变成本地视频EXISTING或许LAUNCH_ALWAYS 添加FLAG_ACTIV数据结构与算法剖析ITY_NEW_DOCUMENT
  • 读取到NEVER,则封闭FLAG_ACTIVITY_MULTIPLE_TASK

2.当判数据结构严蔚敏别到在A缓存视频怎样转入本地视频ndroidManifest中设置了document索引有哪几种类型LaunchMode,则为其添加flag到建议项中。
能够看到的是:

  • 假定读取数据结构与算法剖析到的是NONE不添加flag

  • 读取到INTO_EXISTING或缓存视频怎样下载到手机相册许LAUNCH_ALWAYS 添加FLAG_ACTIVITY_NEW_DOCUMENT

  • 读取到NEVER,则封闭FLAG_ACTIVI缓存是什么意思TY_MULTIPLE_TASK

  • 4.mLaunchTaskBehind 这个标志位判别是否新建的Activity盖在本来的A面试常见问题及答复技巧ctivity栈上面试毛遂自荐。因而在本来的基础上判别了不是singleTask或许singleInstance,一同能缓存是什么意思翻开new_document.

  • 5.假定翻开Acitivty的mLaunchTaskBehind标志为true且是new数据结构_document没有指向下一个Activity数据,则默许添加操作系统的FLAG_A数据结构严蔚敏CTIVITY_NEW_TASK。

  • 6.接着假定发现FLAG_ACTIVITY_NEW_TASK翻开了,设置了DOCUMENT_LAUNCH_A数据结构与算法剖析LWAYS或许mLaunchTaskBehind标志为true,则继续面试毛遂自荐简略大方加上FLAG_ACTIVITY_MULTIPLE_TASK。

末节

留神,在非singleTask和数据结构严蔚敏第二版课后答案singleInstance下运用new_document,刚好经过5和6进程,因而出现了第一幅gif图的状况,数据结构与算法翻开了一个新的栈。

这儿又出现了两个新的FLAG_ACTIVITY_MUL数据结构课程设计TIPLE_TASK和FLAG_ACTIVITY_NEW_TASK。

这两操作系统有哪些个标志位一般是在创立新的使命栈才会运用。

FLAG_面试问题大全及答案大全ACTIVITY_NEW_TASK:

新活动会成为前史栈中的新使命(一组活动)面试技巧和注意事项的开始。
假定新活动已存在于一个为它作业的使命中,那么不会建议,只会把该使命移到屏幕最前。
假定需求有回来flag则不能这个flag。

因而这个flag常常用在桌面开发里边。

FLAG_ACTIVITY_MULTIPLE_TASK:

用于创立一个新使命,并建议一个活动放进去
一般这个标志位会和FLAG_ACTI索引失效的几种状况VITY_NEW_TASK或许FL面试毛遂自荐AG_ACTIVITY_NEW_DOCUMENT一同运用。

  • 7.FLAG_ACTIVITY_NO_USER_面试问题大全及答案大全ACTION判别这个标志位,然后设定索引是什么意思mUserLeaving。FLAG_ACTIVITY_NO_USER_ACTION一般是用来阻挠顶部Activity的onUserLeaveHint回调,在它被新建议的活动构成paused状况时.

  • 8.假定在建议的时分设置了TaskId,则经过id找到使命,判别ActivityRecord的状况来设置mDoResume和mAvoidMoveToFron缓存是什么意思t。

  • 9.当Activity现已被发操作系统的五大功用起了设置了START_FLAG_ONLY_IF_NEEDED,则找到当时缓存视频怎样转入相册正在运用的Activity栈。调用topR缓存是什么意思unningNonDelayedActivityLocked作业当时顶部的Activity。

A数据结构与算法ctiv面试ityRecord topRunningNonDelayedActivityLocked(ActivityRec操作系统是对什么进行处理的软件ord notTop) {
for (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = mTa操作系统是一种skHistory.get(taskNdx);
final ArrayList<ActivityRecord> activities = task.mActivities;
for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activ操作系统的主要功用是ityNdx) {
ActivityReco操作系统是什么的接口rd r = activ数据结构c语言版ities.get(activityNdx);
if (!r.finishing && !r.delay数据结构知识点总结edResume &am面试必问10大问题答复p;& r != notTop &索引失效& r.okToShowLocked()) {
re数据结构课程设计turn r;
}面试必问10大问题答复
}
}
retur面试技巧n null;
}

这儿出现了别的一个数据方针TaskRecord和TaskHis面试毛遂自荐一分钟troy。这辆方针标操作系统是什么的接口志着Activity的使命方针以及使命前史。

computeLaunchingTaskFlags 核算Task的flag

private void com面试毛遂自荐简略大方puteLaunchingTaskFlags() {
///存在要翻开TaskReco操作系统是一种什么软件r操作系统期末考试试题及答案d
if (mSourceRecord == null &操作系统的五大功用amp;& mInTask != null &&数据结构严蔚敏amp; mInTask.getStack() != nul缓存是什么意思l) {
final Intent索引有哪几种类型 baseIntent = mInTask.getBaseIntent();
final ActivityRec缓存是什么意思ord root = mInTask.getRootActivity();
if (baseIntent ==索引符号 null) {
ActivityOptions.abort(mOptions);
throw new IllegalArgumentException("Launching in索引的效果及优缺点to task w数据结构题库ithout base intent: "
+ mInTask);
}
///当建议的的办法是singleTask或许singleInstance,有必要确索引保是根部
if (isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) {
if (!baseIntent.getCom操作系统有哪些ponent().equals(mStartActivity.intent.getComponent()))索引超出了数组边界什么意思 {
ActivityOptions.abort(mOptions);
thro操作系统是一种w new IllegalArgumentException("索引失效的几种状况Trying to launch s面试常见问题及答复技巧ingleInstance/Task "
+ mStartActivity + " into different task " + mInTask);
}
if (root面试常见问题及答复技巧 != nu操作系统ll) {
ActivityOptions.abort(mOptions);
t索引有哪几种类型hrow new IllegalArgumentException("Caller wit索引h mInTask " + mInTask
+ " has root " + root + " but targe缓存数据能够铲除吗t is singleInstance/Task");
}
}
//根不为空时分设置为新建一个新的使命栈
if (root == nul索引l) {
final int flagsOfInterest = FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_MULTIPLE_TASK
| FLAG_ACTIVITY_NEW_DOCUMENT | FLAG_ACTIVITY_RETAIN_IN_RECENTS;
mLaunchFlags = (数据结构教程第5版李春葆答案mLaunchFlags & ~flagsOfInterest)
| (baseInte缓存视频怎样下载到手机相册nt.getFlags() & flagsOfInterest)缓存视频变成本地视频;
mInten索引失效的几种状况t.setFlags(mLaunchFlags);
mInTask.setInt面试技巧ent(mStartActivity);
mAddingToTask = true;
} else if ((mLaunchFlag索引符号s & FLAG_ACTIVITY_NEW_TASK) !索引失效= 0) {
mAddingToTask = false;
} else {
mAddingToTask = true;
}
//设置复用的T缓存视频怎样转入本地视频askRecord为当时栈
mReuseTask = mInTask;
} else {
mInTask = null;
//当根部不为空的时分,则不会去建议当时这个使命
if ((mStartActivity.isResolverActivity() || mStartAct操作系统的主要功用是ivity.noDisplay) && mSourceRecord != null
&面试问题大全及答案大全amp;& mSourceRecord.inFreeformWindowingMode(面试常见问题及答复技巧))  {
mAddingToTask = true;
}
}
//不存索引失效的几种状况在要翻开的TaskRecord
if (mInTask == null) {
i数据结构知识点总结f (mSourceRecord == null) {
// This activity is not bein数据结构与算法剖析g star数据结构严蔚敏第二版课后答案ted from another...  i数据结构知识点总结n this
// c缓存视频在手机哪里找ase we -always- s数据结构知识点总结tart a new task.
if ((mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) == 0 && mInTask == null) {
Slog.w(TAG, "startActivity called from non-Activity context; forcing数据结构知识点总结 " +
"Intent.FLA缓存视频在手机哪里找G_ACTIVITY_N索引失效EW_TASK for: " + mIntent);
m索引页是哪一页LaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
}
} else if面试技巧 (mSourceRecord.launchMode == LAUNCH_SINGLE_INSTANCE) {
// T缓存视频兼并app下载he original activity who is st数据结构与算法剖析arting us is running as a single
// instance...  this new activity it is starting must go on i缓存视频怎样下载到手机相册ts
// own task.
mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
} else if (isLaunchModeOneOf(LAUNCH_缓存SIN数据结构GLE_INSTANCE, LAUNCH_SINGLE_TASK)) {
// The activity being started is a single instance...  it always
// gets launched into its own task.
mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
}
}
}

在这儿分为两缓存视频变成本地视频种状况:

  • 1.一种是本操作系统当时的配备不能运转此应用程序身知道TaskRecord,要建议的使命是哪个
    当要建议的方针TaskRecord,singleTask/singleInstance的索引失效的几种状况建议办法有必要要知道根部。不然的话,假定根部Activity为空则建议一个新的使命栈,把当时的使命栈作为复用方针。根部不为空,则把mInTask设置空,当作新建使命。
  • 2.一种数据结构知识点总结是不知道即将建议TaskRecord是哪个,往往用于新建。
    此刻数据结构有哪些会判别调用方的ActivityRecord为空,或许调用方自身是一个singleInstance,或许建议办法为singleTask或许singleInstance则从头建议一个新的使命作为开始。

这儿有个函数稍索引贴微留神下TaskRecord.getRootActivity:

    /** Returns the first non-fi缓存视频变成本地视频nishing activity from the root. */
A操作系统的主要功用是ctivityRecord getRootActivity() {
for (int i = 0; i < mActivities.size(); i++) {
final ActivityRecord r = mActivities.get(i);
if (r.finishing) {
continue;
}
return r;
}
return null;
}

咱们实践上能看到一个TaskReco数据结构rd存储着一个mActivities的ActivityRecord集结。换句话说这个TaskRecord便是数据结构知识点总结标志我上面说的使命。因而这个函数便是缓存视频变成本地视频找到第一个没有数据结构与算法被finish的Activity

computeSourceStack 获取调用方的Activity栈

    priv操作系统是一种ate vo缓存视频兼并id computeSourceStac面试常见问题及答复技巧k() {
if (mSourceRecord == null) {
mSourceStack = null;
return;
}
if (!mSourceRecord.finishing) {
mSourceStack = mSourceRecord.getStack();
return;
}
if ((mLaunchFla数据结构题库gs & FLAG_ACTIVITY_NEW_TASK) == 0) {
...
mLaunchFlags |= FLAG_ACTIVITY_NEW_TASK;
mNewTa面试必问10大问题答复skI面试毛遂自荐nfo = mSourceRecord.info;
// I索引是什么意思t is not guaranteed that the source record will have a t操作系统是对什么进行处理的软件as操作系统的五大功用k associated with it. For,
//缓存视频在手机哪里找 e缓存视频在手机哪里找xample, if this method is being called for processing a pending activity launch, it
// is pos数据结构知识点总结sible that the activity has been removed f操作系统当时的配备不能运转此应用程序rom the task after the launch was
// enqueued.
final TaskRecord source数据结构知识点总结Task = mSourceRecord.getTask();
mNewTaskIntent = sourceTask !=索引超出矩阵维度 null ? sourceTask.intent : null;
}
mSourceRecord = null;
mSourceStack = null;
}

此刻咱们能够看到,是从ActivityRecord拿到ActivityStack方针。假定调操作系统是一种什么软件用方没有被finish则回来当时的ActivityStack。被finish了则添加一个NEW_TASK建议一个新的使命。

getReu面试毛遂自荐sableIntentActivity获取能够复用的Activity

看到这个姓名就知道是专门面试毛遂自荐3分钟通用处理singleTask,singleTop这些栈内仅有的建议办法

/**
* Decide whether the new activity should be inserted into an existing task. Returns null
* if not or an ActivityRecord with the task into which the new activity should be added.
*/
private ActivityRecord getReusableIn操作系统是什么的接口tentActivity() {
//依据建议办法是否能够放进现已存在的Task
boolean putIntoExistingTask = ((mLaunchFlags & FLAG_ACTIVITY_NEW_TASK) != 0 &&
(mLaunchFlags & FL索引AG_ACTIV缓存ITY_MULTIPLE_TASK) == 0)
|| isLaunchModeOn索引有哪几种类型eOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK);
putIntoExistingTask &= mInTask == null &a数据结构严蔚敏mp;& mStartActivity.res面试ultTo == null;
ActivityRecord intentActivity = null;
if (mOpt缓存的视频怎样保存到本地ions != null && mOptions.getLaunchT操作系统的五大功用askId() != -1) {
final TaskRecord task = mSupervisor.anyTaskForIdLocked(mOptions.getLaunchTaskId());
intentActivity = task != null ? task.getTopAct缓存视频兼并app下载ivity() : null;
} else if (putIntoExistingTask) {
if (LAUNCH_SINGLE_INSTANCE == mLaunchMode) {
intentActivity =缓存视频怎样转入本地视频 mSupervisor.findActivityLo数据结构教程第5版李春葆答案cked(mIntent, mStartA面试毛遂自荐简略大方ctivity.info,
mStartActivity.isActivityType缓存视频怎样转入本地视频Home());
} else if ((mLaunchFlag操作系统是什么的接口s & FLAG_ACTIVIT数据结构与算法Y_LAUNCH_ADJACENT) != 0) {
intentActivity = mSupervisor.findActivityLocked(mIntent, mStartActivity.info,
!(LAUNCH_SINGLE_TAS缓存视频在手机哪里找K == mLaunchMode));
} else {
intentActivity = mSupervi数据结构c语言版sor.findTaskLocked(mStartActivity, mPreferred索引超出了数组边界什么意思DisplayId);
}
}
return intentActivity;
}

假定上一段代码是为了找能够复用使命,而这段代码则是去寻找是否有能够复用的ActivityRecord。

这儿逻辑如下:
putIntoExistingTask是一个是否能放入现已存早的使命的标志位操作系统期末考试试题及答案。其判别的依据是FLAG_ACTIVITY_NEW_TASK翻开了,可是要封闭FLAG_ACTIVITY_MULTIPLE_TASK;或许singleTask/singleInstance的建议办法(由于面试问题只需这两种建议办法才会去使命的栈内寻找复用的Activity)。

接着还要保证数据结构知识点总结没有方针使命以及调用方自身没有要指向数据结构与算法下一个ActivityRecord。

面试技巧要判别到有复用的使命(Tas操作系统有哪些kRecord),则直接取出当时的使命的栈顶作为复用。

假定putIntoExistingTask为true分状况评论

  • 1.当建议办法为sin数据结构严蔚敏gleInstance的时分,调用findActivityLocked查找是否存在能够复用的ActivityRec索引页是哪一页ord操作系统的基本特征,参数为mStartActivit面试技巧y.isActivityTyp操作系统当时的配备不能运转此应用程序eHome()
  • 2.当翻开了FLA缓存视频怎样转入本地视频G_ACTIVITY_LAUNCH_ADJACENT的时分,仍是调用findActivityLocked,参数为是否为singleTask的boolean判别值
  • 3.不然则直接findTas数据结构c语言版kLocked,传入当时的首要逻辑闪现器id。

那么中心便是这个findActivityLocked和findTaskLocked办法。略微寻找一下。

ActivityRecord findActivityLocked(Intent inten缓存视频怎样转入本地视频t, ActivityInfo info,
boolean compare缓存的视频怎样保存到本地IntentFilte操作系统是一种rs) {
for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
fina面试l Ac索引贴tivityDisplay display = mActiv缓存视频兼并ityDisplays.valueAt(displayNdx);
for (int stackNdx = display.getChil操作系统的主要功用是dCount() - 1; stackNdx >= 0; --stackNdx) {
final Activit操作系统有哪些yStack stack = display.getChi数据结构c语言版ldAt(s面试毛遂自荐3分钟通用tackNdx);
final ActivityRecord ar = stack.findActivityLocked(
intent, info, compareIntentFilters);
if (ar != null) {
return ar;
}
}
}
return null;
}

这个办法和之前的isAnyStackLock相似,也是从mActivityDisplays获取数据结构严蔚敏ActivityDisplay,接着不断的从ActivityStack循环寻找和当时ActivityInfo相匹配的ActivityRecord。

ActivityRecord findA缓存视频怎样转入相册ctivityLocked(Intent intent, ActivityInfo info,
boolean comp面试问题areIntentFilters) {
ComponentName cls = intent.getC数据结构题库omponent();
if (info.targetActivity != null) {
cls = new ComponentName(info.packageName, info.targetActivity);
}
f缓存数据能够铲除吗inal int use索引有哪几种类型rId = UserHandle.getUserId(info.applicationI数据结构教程第5版李春葆答案nfo.uid);
for缓存视频怎样转入本地视频 (int taskNdx = mTaskHistory.size() - 1; taskNdx >= 0; --taskNdx) {
final TaskRecord task = mTaskHistory.get(taskNdx);
f数据结构严蔚敏第二版课后答案inal ArrayList<ActivityRecord> activities = task.mActi面试问题vities;
for (int activityNdx = activities.size() - 1; activityNdx &数据结构有哪些gt;= 0; -操作系统是一种什么软件-activityNdx) {
ActivityRecord r = activities.get(activityNdx);
if (!r.面试技巧okToShowLocked()) {
continue;
}
if (!r.finishing &操作系统期末考试试题及答案& r.u数据结构课程设计serId == use缓存视频怎样转入相册rId) {
if (compareIntentFilters) {
if (r.i操作系统ntent.filterEquals操作系统是一种(intent)) {
return r;
}
} else缓存视频兼并 {
if (r.intent.getComponent().equals(cls)) {
return r;
}
}
}
}
}
return null;
}

咱们能够发现数据结构,在ActivityStack实践存着一个TaskRecord的集结mTaskHistory面试必问10大问题答复。从姓名咱们能够猜想这是TaskRecord的前史栈,究竟有什么TaskRecord存在过ActivityStack。这样,咱们再次从TaskRecord获取ActivityRecord列表,来查数据结构找是否存在一个能够用来复用面试问题大全及答案大全的Activity。

这样咱们就能理清楚一个包括联络:
ActivityDisplay- -> ActivityStack -> TaskRecord -> ActivityRecord

findTaskLocked

这段则是去寻找匹配的TaskRecord。

ActivityReco操作系统有哪些rd findTaskLocked(ActivityReco缓存视频在手机哪里找rd r, int dis操作系统期末考试试题及答案playId) {
mTmpFindTa操作系统是什么的接口skResu操作系统期末考试试题及答案lt.r = null;
mTmpFi面试必问10大问题答复ndTaskResul索引超出了数组边界什么意思t.matchedByRootAffinity = false;
ActivityR操作系统的基本特征ecord affinityMatch = null;
for (int di面试问题splayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
final A缓存是什么意思ctiv操作系统的五大功用ityDisplay display = mActi操作系统的基本特征vityDisplays.valueAt(dis索引是什么意思playN缓存视频怎样下载到手机相册dx);
for (int stackNdx = di面试技巧splay.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
final ActivityStack stack = display.getChildAt(stac数据结构严蔚敏第二版课后答案kNdx);
i操作系统是一种f (!r.hasCompatibleActivityType(stack)) {
continue;
}
stack.findTaskLocked缓存视频怎样下载到手机相册(r, mTmpFindTa面试毛遂自荐skResult面试必问10大问题答复);
if (mTm缓存视频变成本地视频pFindTaskResult.r != null) {
if (!mTmpFindT操作系统askResult.matchedByRo索引是什么意思otAffinity) {
return mTmpFin数据结构c语言版dTaskResult.r;
} else if (mTmpFindTaskResult.r.getDisplayId面试() == displayId) {
// Note: since the traversing through the stacks is top down, the floating
// tasks should always have数据结构与算法 lower prior面试毛遂自荐一分钟ity than any affinity-matching面试问题大全及答案大全 t面试常见问题及答复技巧asks
// in the fullscreen stacks
affinityMatch操作系统有哪些 = mTmpFindTaskResult.r;
} else if (DEBUG_TASKS &&数据结构有哪些amp; mTm面试pFindTaskR数据结构教程第5版李春葆答案esult.matchedByRootAffinity) {
...
}
}
}
}
return affinityMatch;
}

依据咱们上面数据结构与算法的包括联络是从TaskRecord来查找Acti数据结构有哪些vityRe数据结构与算法剖析cord,可是这儿是经过Ac数据结构知识点总结tivityRecord反向查找匹配的TaskRecord。因而逻辑凌乱点。

由于包括联络仍是仍旧,所以会经过ActivityDisplay来索引失效的几种状况找到索引贴对应的ActivityStack。

void findTaskLoc缓存视频怎样转入相册ked(ActivityRecord target, FindTaskResult result) {
Intent intent = target.intent;
Ac面试毛遂自荐tivityInfo info = target.info;
ComponentName cls = intent.getComponent();
if (i缓存是什么意思nfo.targetActivity != null) {
cls = new ComponentName(info.packageName, info.targetAct面试问题ivity);
}
final int userId = UserHandle.getUs操作系统是一种erId(info.applicationInfo.uid);
boolean isDocument = intent != null & intent.isDocument();
// If documentData is non-null then it must match the exist索引超出了数组边界什么意思ing task data.
Uri documentData = isDocument ? inte缓存nt.getData() : null;
for (int taskNdx = mTaskHistory.size() - 1; taskNdx &g数据结构与算法t;= 0; --taskNdx) {
final TaskRecord task = m数据结构有哪些TaskHistory.面试问题get(taskNdx);
if (操作系统的主要功用是task.voiceSession != null) {
continue;
}
if (task.userId != userId) {数据结构有哪些
// Looking for a different task.
continue;
}
// Overlays should not be considered as the task's logical top activity面试技巧.
fi操作系统的主要功用是nal ActivityRecord r = task.getTopActivity(false /* includeOverla索引页是哪一页ys */);
if (r == null || r.finishing || r.use数据结构与算法剖析rId != use索引页是哪一页rId ||
r.launchMode == ActivityInfo.LAUNCH_SINGLE_INSTANCE) {
continue;
}
i数据结构有哪些f (!r数据结构与算法.hasCompatibleActivi操作系统的五大功用tyType(target)) {
cont面试毛遂自荐一分钟inue;
}
final Intent taskIn索引有哪几种类型tent = task.intent;
final Intent affinityIntent = t数据结构教程第5版李春葆答案ask.affinityIntent;
final boolean taskIsDocument;
final Uri taskDocumentData;
if索引 (taskIntent != null &&a数据结构与算法mp; t操作系统当时的配备不能运转此应用程序askIntent.isDocument()) {
taskIsDocument = true;
taskDocumentData = taskInten数据结构c语言版t.get数据结构课程设计Data();
} e数据结构严蔚敏第二版课后答案lse if (affinityIntent != null && affinityIntent.isDocument()) {
taskIsDocument = true;
taskDocumentData = affinityI索引符号ntent.getData();
} else {
taskIsDocument = false;
taskDocume缓存视频怎样转入相册ntData = nul索引超出矩阵维度l;
}
if (taskIntent != null && taskIntent.getComponent() != null &&
task缓存是什么意思Intent.getComponent().compareTo(cls) == 0 &&
Objects.equa缓存视频怎样转入相册ls(documentData操作系统当时的配备不能运转此应用程序, taskDocumentData)) {
result.r = r;
resul操作系统的基本特征t.matchedByRootAffinity = false;
break;
} else if (affin数据结构与算法ityIntent != null && affinityInten数据结构课程设计t.getComponent() != null &&
affi缓存视频兼并nityIntent.get数据结构题库Component().compareTo(cls) == 0 &&
Objects.equals(documentData, taskDocumentData)) {
result.r = r;
resu数据结构课程设计lt.matched缓存的视频怎样保存到本地ByRootAffinity = false;
break;
} else if (!数据结构题库isDocument &&am缓存数据能够铲除吗p; !taskIsDocument
&& result.r == null && task.rootAffinity != null) {
if (ta数据结构与算法sk.rootAffinity.equals(target.taskAffinity)) {
result.r操作系统的主要功用是 = r;
result.matchedBy数据结构与算法剖析RootAffinity = true;
}
} else if (DEBUG_TASKS) Slog.d(TAG_TASKS, "Not a match: " + task);
}
}

由于一个TaskRecord会包括许多的ActivityRecord,这儿并不是真的去循环匹配,而是循环ActivityStack中mTaskHistory,去拿到每个Taskrecord的顶部ActivityRecord去匹配。

当咱们发现顶部作业的Activit面试问题yRecord是singleInst数据结构知识点总结ance建议办法,则跳过这个Task缓存视频兼并app下载Record。去找下一个没有完毕且是相同操作系统是什么的接口的userId的TaskRecord。

这儿略微留神一下,由于设定了new_documen数据结构有哪些t和taskAffinity会Activity的使命构成影响,因而需求分状况处理。

  • 1.当没设置taskAffinity,则取出TaskRecord的taskIntent,假定类名匹配,还有在intent中设置的Data数据相符则取出。

  • 2.当设置taskAffin操作系统是对什么进行处理的软件ity,则取出TaskRecord的affinityIntent,假定类名匹配,还有在intent中设置的Data数据相符则取出。

  • 3.当taskIntent / affinityInt数据结构知识点总结ent为空或许task没有翻开new_document标志位,就会取出默许的taskAffinity去匹配名操作系统的基本特征字,相符合则取出。

 if (LAUNCH_SINGL缓存视频兼并E_IN操作系统期末考试试题及答案STANCE数据结构课程设计 == mLaunchMode) {
intentActivity = mSupervisor.find操作系统的基本特征ActivityLocked(mIntent, mStar数据结构c语言版tActivity.info,
mStartActivity.isActivityTypeHome());
} else if ((mLaunchFlags & FLAG_ACTIV数据结构严蔚敏第二版课后答案ITY_LAUNCH_ADJ面试毛遂自荐ACENT) != 0) {
intentActi索引v面试问题ity = mSupervisor.findActivityLocked(mI缓存视频变成本地视频ntent, mStartActivity.info,
!(LAUNCH_SINGLE_TASK == mLaunchMode));
} else {
intentActivity = mSupervisor.fi操作系统是一种什么软件ndTaskLocked(mStartActivity, mPre面试毛遂自荐ferredDisplayId);
}

换算到当时代码情形,当putIntoExisting面试Task为true寻找复用ActivityRecord大致上能够为如下几个进程:

  • 1.当此刻是singleInstance,则需求判别是不索引超出了数组边界什么意思是home。由于home也一般都是相似singleInst操作系统期末考试试题及答案a数据结构课程设计nce办法。换句说,是home的时分将会除了查找包名索引的效果及优缺点一同之外,还会继续匹数据结构题库配intent里边的意图选择。不是home的时分则是找到包名就回来。
  • 2.当翻开了FLAG_ACTIVITY_LAUNCH_ADJACENT标志位,这个标志位一般是在索引符号分屏时分运用,新活动会闪现在旧活动周围。此刻咱们会发现,此刻由于要分屏,那个singleTask会构成影响。所以在选择的ActivityRecord时分,假定不是singleTask则不需求经过意图选择直接经过类名回来,不然则经过意图选择再回来ActivityRecord。
  • 3.当以上两者都不是,那么只是一般的singleT数据结构c语言版ask办法或许singleInstance办法,为了减少时间凌乱度,直接经过displayId去查找对应的Task的顶部正在作业的ActivityRecord。找到而且匹配taskAffinity则回来。

当复用的reusActivity不为空

 if (reusedAc面试问题tivity != null) {
...
final boolean clearTopAndResetStandardLaunchMode =
(mLaunchFlags & (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK缓存视频兼并_IF_NEEDED))
== (FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED)
&& mLaunchMode == LAUNCH_MULTIPLE;
if (mStar索引失效tActivity.getTask() == null && !clearTopAndResetStandardLaunchMode) {
mStartActivity.setTask(reusedActivity.getTask());
}
if (reusedActivity.getTask().inte缓存是什么意思nt == null) {
reusedActi操作系统是对什么进行处理的软件vity.getTask().setIntent(mStartActivity);
}
if ((mLaunchFlags & FLAG_ACTIVITY_CL索引页是哪一页EAR_TOP) != 0
|| isDoc缓存视频在手机哪里找umen数据结构tLau数据结构有哪些nchesIntoExisting(mLaunchFlags)
|缓存的视频怎样保存到本地| isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) {
final Ta缓存视频怎样转入相册skRecord task = reusedActivity.getTask();
final ActivityR数据结构与算法eco缓存视频在手机哪里找rd top = task.performClearTaskForReuseLocked(mStartActivity,
mLaunchFlag面试s);
if (reusedActivity.getTask() == null) {
r面试毛遂自荐eusedActivity.setTa数据结构sk(task);
}
if (to数据结构严蔚敏p != null) {
if (top.frontOfTask) {
to数据结构c语言版p.getTask索引贴().setI缓存视频兼并nt数据结构知识点总结ent(m缓存视频在手机哪里找StartActivity);
}
deliverNewInt缓存视频兼并ent(top);
}
}
mSupervisor.sendPowerHintForLaunchStartIfNe缓存视频怎样转入相册eded(false /* forceSend */, reusedActivity);
reusedActivity = setTarge索引失效的几种状况tStackAndMoveToFrontIfNeeded(reusedActivity);
final ActivityRecord outResult =
outActivity != null &&am索引失效p; outActivity.length > 0 ? outActivity[0] : null;
if (outResult != n数据结构题库ull &a操作系统mp;& (outResult.finishing索引失效的几种状况 || outResult.noDisplay)) {数据结构严蔚敏
outActivity[0] = reusedActivity;
}
if ((mStartFlags & STAR数据结构课程设计T_FLAG_ONLY_IF_NEEDED) != 0) {
resumeTargetStackIfNeeded();
return START_RETURN_INTENT_TO_CALLER;
}
if (reusedActivity != null) {
setTaskFromIntentActivity(reusedActivity);
if索引的效果及优缺点 (!mAddingToTask && mReuseTask == null) {
resumeTargetStackIfNeede操作系统是一种d();
if (outActivity != null &面试必问10大问题答复& outActivity.length > 0) {
outActivity[0] = r数据结构c语言版eusedActivity;
}
re操作系统的主要功用是turn mMovedToFront ? ST面试问题大全及答案大全ART_TAS数据结构严蔚敏第二版课后答案K_TO_FRONT : START_DELIVERED_TO_TOP;
}
}
}
if (mStartActivity.packageName == null) {数据结构题库
....
return START_CLASS_NOT_FOUND;
}

这儿拆分3个进程阐明:

  • 1.假定缓存当时的建议方操作系统期末考试试题及答案式是standar操作系统的五大功用d(对应LAUNCH_MULTIPLE),而且翻开了FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,则阐明要清空当时栈当时ActivityRecord一直到栈顶的数缓存视频怎样下载到手机相册据,可是此刻暂时不处理,只是数据结构严蔚敏设置了clearTopAndResetStandardLaunchMode一个boolean值。当这个boolean是false的时分,阐明不必索引符号清掉Task上面的信息,因而,能够直接设置本来的TaskRecord进去
  • 2.当翻开了FLAG_ACTIVITY_CLEAR_TOP标志位,或许翻开了document标志位,或许翻开了singleTask / singleInstance阐明此刻需求清掉TaskRecord的数据。究竟调用deliverNewIntent。其间中心函数是performClearTaskF索引符号orReuseLocked办法。这个办法便是清掉咱们常说的singleTask顶部Activity,而且让当时Activity置顶。
    ActivityRecord performClearTaskForReuseLocked(ActivityRecord newR, int laun操作系统的主要功用是ch操作系统的主要功用是Flags) {
mReuseTask = true;
final ActivityRecord result = performClearTaskLocked(newR, launchFlags);
mReuseTask = fa缓存是什么意思lse;
r索引的效果及优缺点eturn resu缓存视频怎样转入本地视频lt;
}
final A面试必问10大问题答复ctivityRecord performClearTaskLocked(ActivityRecord n缓存ewR, int launchFlags) {
int numActivities = mActiv数据结构知识点总结ities.size();
fo缓存视频怎样下载到手机相册r (i缓存视频在手机哪里找nt activityNdx = numActivi缓存的视频怎样保存到本地ties索引失效 - 1; ac操作系统的主要功用是tivityNdx >= 0; --act面试问题ivityNdx) {
ActivityRecord r = mActivities.get(a缓存数据能够铲除吗ctivityNdx);
if (r.finishing) {
continue;
}
if (r.real操作系统是对什么进行处理的软件Activity.equals(newR.realActivity)) {
// Here it is!  Now finis数据结构与算法h everything in front.数据结构与算法..
final ActivityRecord ret = r;
for (++activit操作系统是一种yNdx; activityNdx < n操作系统是一种什么软件umActivit索引超出了数组边界什么意思ies; ++activityNdx) {
r = m数据结构与算法剖析Activities.get(activityN面试毛遂自荐一分钟dx);
if (r.finishing) {
continue;
}
ActivityOptions opts = r.takeOptionsLocked操作系统有哪些();
if (opts != null) {
ret.updateOp索引页是哪一页tionsLocked(opts);
}
if (mStack != null && mStack.finishActivityLo缓存数据能够铲除吗cked(
r, Activity.RESULT_CANCELED, null, "clear-task-stack", false)) {
--activityNdx;
--numAct数据结构ivities;
}
}
if (ret.launchMode == ActivityInfo.LAUNCH_MULTI缓存视频兼并PLE
&& (launchFlags & Intent.FLAG_ACTIVITY_SINGLE_TOP) == 0
&& !ActivityStarter.is缓存DocumentLaunchesIntoExisting(l数据结构知识点总结aunchFlags)) {
if (!ret.finishing) {
if (mStack != null) {
mStack.操作系统是什么的接口finishActivityLocked(
ret, Activity.RESULT_CANCELED, null, "clear-task-top", false);
}
return null;数据结构严蔚敏第二版课后答案
}
}
return r面试技巧et;
}
}
return null;
}

实践上,这个mActivities这个ArrayList。存放着当时使命内一切的Acti索引是什么意思vity。此刻当作一个栈的话,便是从尾部开始往头部循环查找。那么这个算法分为两步:

  • 从mActivities尾部往头部查找到被复用的Activity
  • 找到被复用的Activity缓存视频兼并在往尾部顺次循环,而且调用ActivityStack的finish的办法完毕这个Activity,而且减少引证。

可是这儿有个特别处理,假定是standard建议数据结构c语言版的话,而且FLAG_ACTIVITY_SINGLE_TOP翻开了。此刻也会完毕当时的Activity。那么此刻调用不索引了deliverNewIntent,也就说这种办法实现相似singleTop的效果是不会会调onNewIntent。而是会当作从头建议。缓存视频在手机哪里找

  • 3.经过上面的进程,数据结构与算法剖析不管是否现已铲除栈顶的数据。接下来都会,承认现已是要参与到对应的选择出来栈中。

缓存的视频怎样保存到本地此需求开始参与到栈中,可是依据我上面列出来的在AMS中的包括联络,咱们先要找到Activ数据结构课程设计ityDis索引的效果及优缺点play之后,再找到其间TaskRecord,究竟再把ActivityRecord参与其间。

必定是这个逻辑,那么在这个状况复用的ActivityRecord找到了,为了保证其正确性,就要对Task缓存视频兼并app下载Record做从头处理,把当时的T缓存的视频怎样保存到本地a缓存视频兼并app下载skRecord放到最顶部,究竟哪里算是顶部,接下来看看中心办法之一setTargetStackAndMoveToFront索引失效If面试毛遂自荐一分钟Needed。索引是什么意思

setTargetStackAndMoveToFrontIfNeed面试ed
private ActivityRecord setTargetStackAndMoveToFrontIfNeeded(Ac操作系统是什么的接口tivityRecord intentActivity)缓存视频兼并app下载 {
mTargetStack = intentActivity.get面试问题Stack(面试技巧);
mTargetStack.mLastPausedActivity = null;
//获取操作系统的基本特征顶部信息
final ActivityStack focusStack = mSupervisor.getFocusedStack();
ActivityReco缓存视频在手机哪里找rd curTop = (focusStack == null)
? null : focusStack.to数据结构与算法pRunningNonDelayedActivityLocked(mNotTop);
final TaskRecord topTask = curTop面试常见问题及答复技巧 != null ? curTop.getTask() : null;
//顶部复用栈的信息合法
if (topTask != null
&& (t操作系统是什么的接口opT面试毛遂自荐3分钟通用ask != intentActivity.getTa索引是什么意思sk() || topTask != foc数据结构c语言版usStack.topTask())
&& !mAvoidMoveToFront) {
mStartActivity.intent.addFlags(Intent.FL操作系统是什么的接口AG_ACTIVITY_BROUGH操作系统是一种什么软件T_TO_F面试毛遂自荐RONT);
if (mSourceRecord == null操作系统 || (mSourceStack.getT面试opActivity() != null &&
mSourceStack.getTopActivity().getTask() == mSourceRecord.getTask())) {
if (mLaunchTaskBehind && mSourceRecord != null)索引的效果及优缺点 {
intent索引页是哪一页Activity.setTaskToAffiliateWith(mSourceRecord.getTas面试技巧k());
}
final boole操作系统是一种an will面试ClearTask =
(mLaunchFlags面试必问10大问题答复 & (FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
== (FLAG_ACTIVITY索引的效果及优缺点_索引超出矩阵维度NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK);
if (!willClearTa操作系统是一种什么软件sk)数据结构 {
final ActivityStack launchStack = getLaunchStack(
mStartA索引失效ctivity, mLaunchFlags, mStartActivity.getTask(), mOptions);
final TaskRecord intentTask = intentActivity.getTask()面试毛遂自荐一分钟;
if (launchStack == null || launchStack == mTargetStack) {
mTargetStack.moveTaskToFrontLocked(intentTas数据结构与算法剖析k, mNoAnimation, mOptions,
mStartActi数据结构vity.appTimeTracker, "bringingFoundTaskToFront");
mMovedToFront = true;
} else if (launchStack.inSplitScreenWindowingMode()) {
if ((mLaunchFlags & FLAG_ACTIVITY_索引页是哪一页LAUNCH_ADJACENT) != 0) {
intentTask.面试毛遂自荐repa缓存是什么意思rent(launchStack, ON_TOP,
REPARENT_MOVE_STACK_TO_FRON面试技巧T, ANIMATE, DEFER_RESUME,
"launchToSide");
} else {
mTargetStack.moveT缓存视频怎样转入相册askToFrontLocked(int面试常见问题及答复技巧entTask,
mNoAnimation, mOptions, mStartActivity.操作系统appTimeTracker面试毛遂自荐简略大方,
"bringToFrontInsteadOfAdjacentLaunch");
}
mMovedToFront = lau缓存视频在手机哪里找nchStac索引失效的几种状况k != launchStack.getDisplay()
.getTopStackInWindowingMode(launchSt缓存数据能够铲除吗ack.getWindowingMode());
} els数据结构严蔚敏第二版课后答案e if (launchStack.mDisplayId != mTargetStack.mDisplayId) {
intentActivity.getTask().reparent(launchStack, ON_TOP,
REPARENT_MOVE_STACK_TO_FRONT, ANIMATE, D面试技巧和注意事项EF操作系统的基本特征ER_RESUME,
"reparentToDisplay");
mMovedToFront = true;
} else if (launchStack.isActivityTypeHome()
&& !mTargetStack.isActivityTypeHome()) {
intentActivity.getTa面试技巧和注意事项sk().reparent(launchStack, ON_TOP,
REPARENT_MOVE_STACK_TO_FRONT, ANI索引符号MATE, DEFER_RESUME,
"reparentingHome");
mMovedToFront = true;
}
mOptions = null;
intentActi数据结构教程第5版李春葆答案vity.showStartingWindow(null /* prev */,索引失效 false /* newTask操作系统的五大功用 */,
true /* taskSwitch */);
}
}
}
mTargetStack = intentActivity缓存视频兼并.getStack();
if (!mMovedToFront && mD面试毛遂自荐一分钟oResume) {
mTargetStack.moveToFront数据结构与算法剖析("intentActivityFound");
}
mSupervisor.handleNon面试技巧和注意事项ResizableTaskIfNeeded索引贴(inten索引的效果及优缺点tActivity.getTa缓存视频怎样转入本地视频sk(),
WINDOWING_MODE_UNDEFINED, DEFAULT_DISPLAY, mTarg数据结构教程第5版李春葆答案etStack);
if ((mLaunchFlags & FLAG_ACTIVITY_RESET_TASK_I缓存的视频怎样保存到本地F_NEEDED) != 0) {
return mTargetStack.resetTaskIfNee数据结构严蔚敏第二版课后答案dedLocked(intentActivity, mStartActivity);
}
return inte操作系统是对什么进行处理的软件ntActivity;
}
  • 1.首要找到当时AMS的焦点ActivityStack,也便是正在和用户交互的ActivityStack找到mTaskHistory的顶部正在作业的ActivityRecord。缓存视频怎样下载到手机相册一同找到对应的TaskRecord。

  • 2.当发现顶部的TaskRecord不为空,一同顶部的Task和要服用的Tas操作系统是对什么进行处理的软件k不是同一个时分,而且此刻mAvoidMoveToFront为false的时分(mAvoidMoveToFront是在init的进程初始化好的,这个操作系统期末考试试题及答案参数是由ActivityO缓存视频在手机哪里找ptions设置的,一般是false)数据结构与算法剖析。当判别从此刻的intent的建议flag,没有翻开FLAG_ACTIVITY_NEW_TA面试SK以及FLAG_ACTIVITY_CLEAR_TASK,阐明不必清空顶部的栈内一切的信息信息,会分为几种索引超出矩阵维度状况,把当时的Task移动栈顶。将会不才面的场景回归继续剖析。

  • 3.不管有没有清空,究竟都需求把当时的栈ActivityStack移动到最前方,留神这儿的最前端是指和人交互最直接,最顶层的方位。

  • 4.接操作系统的五大功用下来判别FL索引符号AG_A索引贴CTIVITY_RESET_TASK_IF_NEEDED标志位,这个标志一个的时分,没办法做到什么,一般几个标志位一同联动,来判别当时是否需求重操作系统是一种什么软件置当时的mHistoryTask或许新建一个栈。

大致分为这四进程,接下来让咱们看看整个流程是索引是什么意思值得留神的进程怎样处理的。

剖析setTargetStackAndMoveToFrontIfNeeded

先看看第二进程中值得留神的办法getLaunchStack,获取当时即即将建议的栈。缓存视频变成本地视频


private ActivityStack getL数据结构教程第5版李春葆答案aunchStack(ActivityRecord r, int launchFlags, TaskRecord task,
A索引超出矩阵维度ctivityOptions aOptions) {
if (mReuseTask != null) {
ret索引是什么意思urn mReuseTask.g缓存视频变成本地视频etStack();
}
if (((launchFlags & FLAG_ACTIVITY_LAUNCH_ADJACENT) == 0)
|| mPreferredDisplayId != DEFAULT_DISPLA缓存视频怎样下载到手机相册Y) {
// We don't pass in the default display id into the ge索引符号t索引页是哪一页 launch stack call so it can do a
// full resoluti操作系统的五大功用on.
final int candid索引a缓存视频怎样下载到手机相册teDisplay =
mPreferredDisplayId !=数据结构教程第5版李春葆答案 DEFAULT_DISPLAY ? mPreferredDisplayId : IN缓存视频变成本地视频VALID_DISPLAY;
return mSupervisor.getLaunchStack(r, aOptions, task, ON_TOP, candidateDisplay);
}
final ActivityStack parentStack = task != nul数据结构课程设计l ? task.getStack(): mSu操作系统的基本特征pervisor.mFocuse索引是什么意思dStack;
if (索引失效的几种状况parentStack != mSupervisor.mFocusedStack) {
// If tas缓存视频怎样下载到手机相册k's parent stack is not focused - use it duri数据结构与算法剖析ng adjace索引贴nt launch.
return parentStack;
} else {
if索引有哪几种类型 (mSupervisor.m面试问题大全及答案大全FocusedStack != nu面试技巧ll && task == mSup索引符号ervisor.mFocusedStack.topTask()) {
return mSupervisor.mFocusedSta面试常见问题及答复技巧ck;
}
if (parentStack !数据结构= nu面试毛遂自荐ll && parentStack.inSplitScreenPrimaryWindowingMode()) {
fin操作系统的主要功用是al int act操作系统的五大功用ivityType = mSupervisor.resolveActivityType(r, mOptions, task);
return parentStack.getDisplay().getOrCreateStack(
WINDOWING_MODE_SPLIT_SCREEN_SECONDARY, activityType, ON_TOP);
} else {
final ActivityStack dockedStack =
mSupervisor.g面试毛遂自荐一分钟etDefaultDisplay().getSplitScr操作系统有哪些eenPrimaryStack();
if (dockedStack != null && !dockedStack.shouldBeVisible(r)缓存数据能够铲除吗) {
re数据结构教程第5版李春葆答案turn mSup操作系统期末考试试题及答案ervisor.getLaunc索引hStack(r, aOptions, task, ON_TOP);
} else {
return dockedStack;
}
}
}
}

假定当时要复用的Task不为空的时分,直接复用。可是实践上Act缓存视频在手机哪里找ivity存在分屏操作等特别状况,因而或许需求特别处理。

所以分为以下3个进程:索引的效果及优缺点

  • 1.先判别当时有没有翻开FLAG_ACTIVITY_LAUNCH_ADJACEN面试毛遂自荐一分钟T标志位,而且当时的闪现器id和当时的主面试问题大全及答案大全屏id纷歧同。此刻将会判别m缓存视频兼并PreferredDisplay缓存视频兼并Id是否是默许的主屏幕id,不是则取当时屏幕id,不然则是无操作系统的五大功用效id。接着调用mSuperv操作系统有哪些isor.getLaunchStack进一步的承认真实的ActivityStack。
  • 2.不然实践上是翻开了FLAG_ACTIVIT面试必问10大问题答复Y_LAUNCH_ADJACENT标志位,假定加上NEW_TASK就或许面试问题大全及答案大全会建议到分屏。

则获取当时即将建议的ActivityRecord对应的task,假定为空则获取把当时的Task设置为当时焦点TaskRecord。当时的焦点ActivityStack和当时父亲ActivityStack(为当时taskrecor索引贴d或许当时焦点的taskrecord,取决于当时的taskrecord是否为空)是不是同一个阐明能够直接到分屏,缓存就直接回来ActivityStack。

假定是同一个当时的TaskRecord和焦点ActivityStack的顶部前史Task是同一个,阐明不必直接到分屏,而是直接回来缓存视频怎样转入相册ActivityStack。

假定当时的Tas操作系统有哪些kRecord和当时焦点的ActivityStack的mHistoryTask的顶部操作系统期末考试试题及答案不是同一个,且当时父亲ActivityStack不为空,且翻开了inSplitScreenPrimaryWindowingMode(分屏办法)则阐明此刻想当时的task缓存视频变成本地视频想要闪现到顶部,却没办法,此刻需求从ActivitySta数据结构课程设计ck中依据状况获取或许新建ActivityStack。

假定为空,则获取桌面的ActivityStack。

因而这一段的意思实践上便是依据分屏状况以及FLAG_ACTIVITY_LAUNCH_ADJACENT获取合理的ActivityStack。

其间值得留神的有mS缓存的视频怎样保存到本地uperv面试毛遂自荐一分钟isor.getLaunchStack这个函面试技巧和注意事项数,从ActivityStackSupervisor中索引失效进一步获取ActivityStack。

ActivityStackS数据结构知识点总结upervisor 创立与获取Act数据结构与算法ivityStack

<T extends Act缓存是什么意思ivityStack> T getLaunchStack(面试毛遂自荐3分钟通用@Nullable ActivityRecor面试常见问题及答复技巧d r,
@Nullable ActivityOptions options, @Nullable数据结构题库 TaskRecord candidateTask, boole数据结构教程第5版李春葆答案an onTop,
int candidateDisplayId) {
int taskId = INVALID_T面试技巧和注意事项ASK_ID;
int displayId = INVALI面试问题D_DISPLAY;
if (options != null) {
taskId数据结构题库 = options.getLaunchTaskId();
displayId = options.getLaunchDisplayId();
}
if (ta缓存视频在手机哪里找skId索引 != INVALID_TASK_ID) {
options.setLaunchTaskId(INVALID_TASK_ID);
final TaskRecord task = anyTaskForIdLocked(taskId,
MATCH_TASK_IN_STACKS_OR_RECENT_TASKS_AND_RESTORE, options, o索引失效nTop);
options.setLaunchTaskId(taskId);
if (task != null) {
return task.getStack();
}
}
fi操作系统的五大功用nal int activityType = resolveActiv面试ityType操作系统是一种什么软件(r, options, can操作系统didateTask);
T stack = null;
if (displayId == INVA索引页是哪一页LID_DISPLAY) {
dis面试技巧和注意事项play缓存是什么意思Id = candidateDispla缓存数据能够铲除吗yId;
}
if (d操作系统的主要功用是isp数据结构与算法layId != INV数据结构严蔚敏ALID_数据结构c语言版DISPLAY && canLaunchOnDisplay(r, displayId)) {
if (r != null) {
stack = (T) getValidLaunchStackOnDisplay(display操作系统是一种什么软件Id, r);
if (stack != null) {
return stack;
}
}
final ActivityDisplay display = getActivityDisplay数据结构严蔚敏OrCreateLocked(displayId);
if (display != null) {
stack = display.getOrCreateStack(r, opti索引超出矩阵维度o面试必问10大问题答复ns, candidateTask, activityType, onTop);
if (stack != null) {
return stack;
}
}
}
stack = null面试;
Activity缓存视频在手机哪里找Display dis面试毛遂自荐play = null;
if (candidateTask != null) {
stack = candidateTask.get数据结构严蔚敏第二版课后答案Stack();
}
if (stack == null && r != null)索引失效 {
stack = r.getStack();
}
if (stack != null) {
display = stack操作系统的五大功用.getDisplay();
if (display != null && canLaunchOnDisplay(r, display.mDisplayId)) {
final int wind面试必问10大问题答复owingMode =
display.resolveWindowingMode(r, options, can数据结构didateTask, activityType);
if (stack.isCompatible(windowingMode, activityType)) {
ret缓存的视频怎样保存到本地urn stack面试技巧;
}
if (windowingMode == WINDOWING_MODE_FULLSCREEN_O索引的效果及优缺点R_SPLIT_SCREEN_SECONDARY
&& display.getSplitScreenPrimaryStack() == stack
&amp索引是什么意思;操作系统有哪些& candidateTask == stack.topTask()) {
return stack;
}
}
}
if (display == nul缓存的视频怎样保存到本地l操作系统期末考试试题及答案
|| !canL索引的效果及优缺点aunchOnDisplay(r, display.mDisplayId)
// TODO索引符号: Can索引页是哪一页 be remov数据结构c语言版ed once we figure-out how non-standard types should launch
// outside the default display.
|| (activityType != ACTIVITY_TYPE_STAND缓存视频怎样转入相册ARD
&& activityType != ACTIVITY_TY缓存PE_UN操作系统期末考试试题及答案DEFINED)) {
display = getDefaultDisplay();
}
return display缓存视频怎样转入相册.getOrCreateStack(r, options, candidateTask, activityType, onTop);
}

这儿又能够分为以下几个进程:

  • 1.假定ActivityOpti索引贴on中配备了taskId,则经过taskId从ActivityStack的mHistory中获取对应的TaskRecord,而且回来TaskRecord对应的ActivityStack。
  • 2.假定没有taskId,则只能从当时的索引是什么意思displayId去查找id。假定是ActivityOptions中面试问题大全及答案大全是无效的displayId则从获取从办法中传下来的displayId获取。

此刻在验证一次displayId,假定有效,且当时的ActivityRecord是能够被建议在闪现器上,则经过getValidLaunchStackOnDisplay办法从ActivityDisplay只能够获取与当时办法兼容的ActivityStack,不为空则回来。

假定当时的ActivityRecord为空,阐明此刻状况特别,没有任何合适的Ac数据结构严蔚敏第二版课后答案tivitySta索引页是哪一页ck则调用getActivityDisplayOrCreateLocked或许创立获取缓存视频怎样转入相册对应的ActivityDisplay,究竟经过getOrCreateStack创立获取ActivityStack。

  • 3.当传下来的taskId和displayId都是不合法的时分,就没有办法从这两个操作系统是对什么进行处理的软件缓存视频在手机哪里找绪去查找合适的ActivityStack。阐明此刻或许是分屏状况,一个有Activity,一个完全没建议。

AMS接下来会依照办法,先从当时的TaskRecord中获取到对应的栈,假定Activity的建议和Window当时的办法兼容则直接回来。假定不兼容,阐明此刻或许处于分屏,判别到当时的分屏的Task是当时task,且是前史栈中的顶部,索引失效则获取分屏的信息。

  • 4.究竟,这样还没办法处理,阐明此刻处于一切的初始状况,调用getOrCreateStack创立ActivityStack。

那么,咱们追溯到了ActivityStack这个重要的数据结构的创立了。先来看看怎样经过getActivityDisplayOrCreateLocked创立获取ActivityStack。

getActivityDisplayO数据结构课程设计rCreateLocked 获取或许创立ActivityDisplay
  ActivityDisplay getActivityDisplayOrCreateLocked(数据结构严蔚敏第二版课后答案int displayId) {
Act索引页是哪一页ivityDisplay activityDisplay = mActivityDisplays.get(displayId);
if (activityDisplay != null) {
r索引失效的几种状况eturn activityDisplay;
}
if面试毛遂自荐3分钟通用 (mDisplayM操作系统当时的配备不能运转此应用程序anager == null) {
return null;
}
fi面试常见问题及答复技巧na操作系统的主要功用是l Display display = mDisplayManager.getDisplay(displayId);
if (display == null) {
return null;
}
act缓存视频怎样下载到手机相册i索引超出矩阵维度vityDisplay = new Act数据结构有哪些ivityDisplay(this, display);操作系统是对什么进行处理的软件
attachDisplay(activityDisplay);
calculateDefaultM数据结构有哪些inimalSizeOfResizeableTasks(activityDisp操作系统lay);
mWindowManager.onDisplayAdded(displayId);
return activityDisplay;
}

从这儿咱们就能看到在创立或许获取A数据结构教程第5版李春葆答案ctivityStack中触及一个中心的服务DisplayManager。该服务是用来处理闪现,数据结构有哪些详细点便是处理各种闪现器的。这一块就会放到WMS中的解析。现在只需求理解,依据id获取逻索引的效果及优缺点辑闪现器。

首要从mActivityDis缓存数据能够铲除吗plays缓存查找对应数据结构c语言版的id的ActivityDisplay,找不到则经过DisplayManagerService去找对应id的逻辑闪现器。还找不到,阐明根柢没有在Di面试必问10大问题答复splayManagerService中注册这种闪现器,直接回来空。找到逻辑闪现器,阐明此AMS刚开始建议或许这操作系统有哪些种闪现器第一次运用,因而需求新建一个Ac索引符号tivityDisplay。

因而创立ActivityDisplay分为面试毛遂自荐3分钟通用四进程:

  • 1.新数据结构题库建一个方针
  • 2.经过attachDisplay把新建缓存是什么意思ActivityDis索引超出矩阵维度play增索引符号加到mActivityDisplays
  • 3.经过default_minimal_size_resizab操作系统是一种le_task设置全局mDefaultMinSizeOfResizeableTask巨细,这个巨细标志着Activity假定没有指定索引贴巨细,就指定这个默许巨细。
  • 4.把当时的displayId绑定到WindowManagerService中。

别忘数据结构与算法了,此刻咱们意图是要获取ActivityDisplay中的ActivityStack。因而咱们接下来看看getOrCreateStack,又是如操作系统的五大功用何创立处理ActivityStack的。

getOrCreateStack 从ActivityDisplay获取ActivityStack
    <T extends Activity数据结构有哪些Stack> T getOrCreateStack(int windowingMode, int activityType,
boolean onTop) {
if (!alwaysCreateStack(windowin索引是什么意思gMode, activityT操作系统期末考试试题及答案ype)) {
T stack = getStack(windowingMode, activityType);
if (stack != null) {
return stack;
}
}
return createStack(windowingMode, activityType, onTop)缓存是什么意思;
}

能看到的是这儿有个alwaysCreateStack,判别当时是否总是需求创立ActivityStack。当判别为不然尝试着从缓存中获取合适的。假定找不到则创立一个ActivityStack。

private boolean alwaysCreateStack(int windowi数据结构题库ngMode, int activi面试问题大全及答案大全tyType面试毛遂自荐简略大方) {
return activityType == ACTIVITY_TYPE_STANDARD
&& (windowingMode == WINDOWING_数据结构与算法MODE_FULLSCREEN
|| windowingMode == WINDOWING_索引失效的几种状况MODE_FREEFORM
|| window索引是什么意思ingMode == WINDOWING_MODE_SPLIT_SCREEN_SECONDARY);
}

当Activity的建议办法是standard建议办法,而且window的办法是全屏,或许分屏第二个屏幕,或许是安闲窗口办法(在7.0之后,Andro操作系统当时的配备不能运转此应用程序id系统支撑相似PC操作系统的窗口办法),则判别需求总要创立新的ActivityStack。

Activ操作系统的五大功用ityDisplay获取ActivityStack getStack
<T exten操作系统的五大功用ds ActivityStack> T getStack(int wi索引是什么意思ndowingMode, int activityType) {
if (activityType == AC面试毛遂自荐简略大方TIVITY_TYPE_HOME) {
return (T) m缓存视频怎样转入本地视频HomeStack;
} else if (activityType == ACTIVITY_TYPE_RECENTS) {
return (T) mRecentsStack;
}
if (windowingMode == WINDOWING_MODE_PINNE数据结构题库D) {
return (T) mPinnedStack;
} else面试毛遂自荐一分钟 if (windowingMode == WINDOWING_缓存MODE_SPLIT_SCREEN_PRIMARY) {
return (T) mSplitScreenPrimaryStack面试毛遂自荐简略大方;
}
for (int i = m面试问题大全及答案大全Stacks.size() -操作系统 1; i >= 0; --i) {
final ActivityStack stack = mStacks.get(i);
if (stack面试毛遂自荐.isCompatible(windowingM索引超出了数组边界什么意思ode操作系统的主要功用是, activityType)) {
return (T) sta索引符号ck;
}
}
return null;
}

咱们能够看到,ActivityStack在9.0中比起7.0凌乱了许多。这儿面依据windowMode以及activityTyp缓存视频兼并app下载e,ActivityDispla数据结构严蔚敏y把ActivityStack区分为如下几种ActivityStack:

  • 1.mHomeStack 标志着桌面的Activity栈
  • 2.mRecentsStack 标志着运用中最近索引超出了数组边界什么意思运用的ActivityStack
  • 3.mPinnedStack
  • 4.mSplitScreenPrim操作系统的五大功用aryStack 分屏后主屏幕的ActivityStack
  • 5.没有指定,直接循环获取,和当时的win操作系统是对什么进行处理的软件dowMode以及activityType相符的stack回来(当activit操作系统的基本特征yType不是一般的办法或许未声明的时分,只需求匹配activityType,不然则匹配windowMode)。
ActivityDisplay创立ActivityStack
<T extends ActivityStack> T createSta面试毛遂自荐ck(int windowingMo数据结构de, int activityType, bo缓存视频变成本地视频olean onTop) {
....
final int stackId = getNextS索引失效tackId();
return creat操作系统有哪些eStackUnchecked(windowingMode, activityType, stackId, onTop);
}

能够看到,ActivityStack的id设置是顺次添加的。

@VisibleForTesting
<T extends ActivityStack> T createStackUnchecked(int windowingMode, int a索引失效的几种状况ctivityType,
int索引超出矩阵维度 stackId, boolean onT数据结构题库op) {面试技巧和注意事项
if (windowingMode == WINDOWING_MODE_PINNED) {
return (T) new PinnedActivityStack(this, stackId, mSupervisor, on操作系统是一种什么软件Top);
}
return (T) new ActivityStack(
this, stackId, mSupervisor, windowingMode, activityType, onTop);
}

能够看到实践上ActivityStack分为两种类型一种是一般的ActivityStack,一种是Pinne数据结构与算法剖析dActivityStack。而PinnedActivityStack是操作系统一种固定闪现的栈,其默许的activityType是standard,windowMode是WINDOWING_MODE_PINNED。

se数据结构课程设计tTargetStackAndMoveToFront操作系统当时的配备不能运转此应用程序IfNeeded 场景回归

回到当时的场景,获得了即即将登陆的ActivityStack之后,setTargetStackAndMoveToFrontIfNe索引eded,会做第二步极其重要的作业,便是移动当时的Ac面试技巧和注意事项tivityStack到最顶部,也便是人机交互的栈顶。咱们从头看看源码,

  if (!will索引失效ClearTask) {
final ActivityStack launchStack = getLaunchStack(
mStartActivity, mLaunchFlags, mStartActiv缓存视频变成本地视频ity.getTask(), mOptions);
final TaskRecor索引失效d intentTask = intentActivity.getTask();
if面试必问10大问题答复 (launchStack == null || launchS索引贴tack == mTargetSta索引的效果及优缺点ck) {
mTargetStack.moveTaskToFrontLocked(intentTask, mNoAnimation, mOptions,
mStartActivity.appTimeTracker, "bringingFoundTaskToFront");
mMovedToFront = true;
} else if (launchStack.inSplitScreenWindowi索引超出矩阵维度ngMode()) {
if ((mLaunchFlags & FLAG_ACTIVITY_LAUNCH索引失效的几种状况_ADJACENT) != 0) {
intentTask.repar数据结构ent(launchStack, ON_TOP,
REPARENT_MOVE_STACK_TO_F数据结构课程设计RONT, ANIMATE, DEFER_RESUME,
"launchToSide");
} else {
mTargetStack.moveTaskToFrontLocked(操作系统的五大功用intentTask,
mNoAnimation, mOpt数据结构严蔚敏第二版课后答案ions, mStartActivity.appTimeTracker,
"bringToFro操作系统有哪些ntInst操作系统的基本特征e数据结构adOfAdjacentLaunch");
}
mMovedToFront = launch数据结构c语言版Stack != launchStack.get缓存视频怎样转入相册Display数据结构与算法剖析()
.getTopStackInWindowingMo数据结构题库de(launchStack.getWindowingMode());
} else if (launchStack.mDis面试毛遂自荐简略大方playId != mTargetStack.m面试技巧DisplayId) {
intentActivity.getT数据结构c语言版ask().reparent(launch操作系统是一种Stack, ON_TOP,
REPARENT_MOVE_STACK_TO_FRONT, ANIMATE, DEFER_RESUME,
"r数据结构与算法epare操作系统的基本特征ntToDisplay");
mMovedToFront = true;
} else if (操作系统的五大功用launchStack.isActivityTypeHome()
&& !mTargetStack.isActivityTypeHom面试技巧e()) {
intentActiv面试ity.getTask().reparent(launc索引超出矩阵维度hStack, ON_T操作系统是一种OP索引是什么意思,
REPARENT_M缓存的视频怎样保存到本地OVE_STACK_TO_FRONT, ANIMATE, DEFER_RESUME,
"reparentingHome");
mMo缓存视频兼并app下载vedToFront = true;
}
mOp操作系统的主要功用是tions = null操作系统是对什么进行处理的软件;
intentActivity.showStarti面试必问10大问题答复ngWindow(null /* prev */, false /* newTask */,
true /* taskSwitch */);
}
}
}

当承认不需求清空Activity栈内的信息时分,将会获取登陆ActivityStack。这个ActivityStack的获取是假定显式的设置了复用方针,则缓存视频怎样下载到手机相册运用,不然则是获取在init中初始好的建议的调用方ActivityStack,当然假定遇到分屏,虚拟屏等特别状况另说。

此刻将会依据即将登陆的ActivityStack和当时Acti数据结构严蔚敏第二版课后答案vityRecord对应的ActivityStack做比较。能够分为以下几种状况:

  • 1.当要建议的栈与方针一同,或许要建议的栈为空。
  • 2.操作系统是对什么进行处理的软件要建议的栈的windowMode为分屏办法
  • 3.要建议的栈displayId和当时的ActivityRecord纷歧同
  • 4.要面试技巧建议的栈是Home,而当时的ActivityRecord不是。

在状况2-3都会经过reparent,把Task迁移到launchStack中。

状况一当要建议的栈与方针一同,或许要建议的栈为空操作系统当时的配备不能运转此应用程序

此刻正是咱们正常的建议流程。也便是说会引发moveTaskToFrontLocked办法。把当时的栈移动到用户交互的栈顶。

final void moveTaskToFron索引是什么意思tL数据结构严蔚敏ocked(TaskRecord tr, boolean noAnimati操作系统的基本特征on, ActivityOptions options,
AppTimeTracker timeTracker, String reason) {
...
f面试inal ActivityStack topStack = getDisplay().getTopStac缓存视频怎样转入相册k();
final Activit面试问题大全及答案大全yRecord topActivity = topStack != null ? topStack.getTopActivity() : null;
final int numTasks = mTaskHistory.size();
final int index面试技巧 = mTaskHistory.indexOf(tr);
...
try {
getDisplay().deferUpdate数据结构c语言版ImeTarget();
insertTas面试技巧kAtTop(tr, null);
final ActivityRecord top =数据结构与算法剖析 tr.getTopActivi操作系统是一种什么软件ty();
i数据结构知识点总结f (top == null || !top.okToShowLocked()) {
if (top != null) {
mSta数据结构严蔚敏ckSupervisor.mRecentTasks.add(top.getTask());
}
ActivityOpti数据结构课程设计ons.abort(options);
return;
}
final ActivityRecord r = topRunningActivityLocked();
mStackSupervisor.moveFocusableActivityStackToFrontLocked(缓存视频怎样下载到手机相册r, rea数据结构与算法剖析son);
....
mStackSupervisor.resumeFo缓存视频在手机哪里找cusedStackTopActivityLocked();
...
} finally {
...
}
}

咱们能够看到这个中心的算法实践上很简略,实践上便是首要先从m索引失效HistoryTasks找到对应的TaskRecord。假定找不到则当即回来,找到了则调用insertTaskAtTop,把操作系统的五大功用这个TaskRecord刺进到mHistoryTask顶部,缓存视频怎样转入相册假定此刻的顶部Act操作系统期末考试试题及答案ivityRecord暂时不能闪现,把TaskRec数据结构题库ord添加到ActivityStackSupervisor的mRecentTasks,最近运用的Activity的使命数据结构与算法剖析列表中,这样就相当于调用过。

接着调用moveFocusableActivityStackToFrontLocked,处理ActivitySta缓存数据能够铲除吗ck这个办法究竟会调用Activ索引符号ityStack的moveToFront。

moveToFront办法做的作业有两件,索引的效果及优缺点第一件把ActivityStac操作系统期末考试试题及答案kSupervisor的FocusSt面试技巧a缓存视频兼并app下载ck设置为当时的ActivityStac缓存视频兼并k,第二件事,把当时这面试毛遂自荐3分钟通用操作系统的基本特征Activity数据结构课程设计Stack设置ActivityDisplay中的操作系统有哪些mStacks (数据结构索引放着缓存视频兼并app下载ActivityStack的ArrayList)的前端。

究竟再调用resumeFocusedStackTopActivityLocked建议Activity的Resume
这样就完毕了当发现有复用Activit数据结构c语言版yRecord时分,TaskRecord和ActivityStack的移动到交互栈顶。

场景回归startActivityUnchecked的复用Activity状况

在setTargetStackAndMoveToFrontIfNeeded中什么时分需求移动TaskRecord以及ActivityStack呢?首要仍是当时顶部的ActivityR数据结构与算法剖析ecord对应的TaskRecord既不是方针建议的栈,也不是当时的焦点的栈对应顶部TaskRecord。也便是说,或许需求移动把复用的TaskRecord进行一次Task之间的移动缓存

 private void se索引页是哪一页tTaskFromIntentActivity(ActivityRecord intentActivity) {
if ((mLaunchFlags & (FLAG_ACTIVIT数据结构Y_NEW_TASK | FLAG_ACTIVITY_CLEAR_TASK))
== (FLAG_ACTIVITY_NE数据结构知识点总结W_TASK | FLAG_ACTIVITY_CLEAR_TASK)) {.
final TaskRecord task = intentActivity.getTask();
task.performClearTaskLocked();
mReuseTask = task;
mReuseTask.setIntent(mStartActivity);
} else if ((mLaunchFlags & FLAG_ACTIVITY_CLEAR_TOP) != 0
|| isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) {
Activi数据结构有哪些tyRecord top = intentActivity.getTask().performClearTaskLocked(mStartActivity,
mLaunchFlags);
if (top == nul数据结构c语言版l) {
mAddingToTask = true;
mSourceRecord = intentA索引的效果及优缺点ctivity;
final TaskRecord task = mSou操作系统是对什么进行处理的软件rceRecord.getTask();
if (task != null && task.getStack(缓存是什么意思) == null) {
mT数据结构严蔚敏argetStack缓存的视频怎样保存到本地 = computeStackFocus(mSourceRecord, false /* newTask */,
mLaunchFlags, mOptions);
mTargetStack.addTask(task,
!mLaunchTaskBehind /* toTop */, "startActivityUnchecked");
}
}
}索引超出矩阵维度 else if (mStartActivity操作系统是对什么进行处理的软件.realActivit索引贴y.equals(intentActivity.getTask().realActivity)) {面试技巧
if (((mLa缓存unchFlags & FLAG索引页是哪一页_ACTIVITY_SINGLE_TOP) != 0
|| LAUNCH_SINGLE_TOP == mLaunchMode)
&& intentActivity.re索引的效果及优缺点alActivity.equals(mStartActivity.realActivity)) {
if (intentActivity.frontOfTask) {
intentActivity缓存视频变成本地视频.getTask().setIntent(mStartActi面试毛遂自荐3分钟通用vity);
}
delive数据结构与算法剖析rNewIntent(intentActivity);
} else if (!inte索引失效的几种状况ntActivity.getTask().isSameInt操作系统是什么的接口entFilter(mStartActivity)) {
mAdd操作系统是一种ingToTask = true;
mSourceRecord = intentAc缓存的视频怎样保存到本地tivity;
}
} else if ((mLaunchFlags &amp数据结构教程第5版李春葆答案; FLAG_ACTIVITY_RESET操作系统的基本特征_TASK_IF_NEEDED数据结构教程第5版李春葆答案) == 0) {
mAddingToTask = true;
mSou面试必问10大问题答复rceRecord = intentAct索引失效的几种状况i面试vity;
} else if (!intentActivity.getTask().rootWasRes索引有哪几种类型et) {
intentActivity.getTask().setIntent(mStartActivity);
}
}

当不是上面的状况,需求 setTaskFromIntentActivity,进一步做处理。

  • 假定翻开FLAG_ACTIVITY_NEW_TASK 以及FLAG_ACT操作系统是对什么进行处理的软件IVITY_CLEAR_TASK,则设置mReuseTask为当时的Task。
  • 假定翻开了FLAG_ACTIVI数据结构与算法TY_CLEAR_TOP的标志位,一同singleInstance或许singleTask的一种,则清空Task,拿到顶面试毛遂自荐3分钟通用部的Task,究竟从头添加到ActivityStack
  • 3.要建议的Activity和当时的Activity是同一个数据结构教程第5版李春葆答案,一同翻开了singleTop标志位,以及singleTop建议,直接调用onNewIntent面试毛遂自荐3分钟通用.假定是相同过滤条件,则把建议SourceRecord设置为当时ActivityRecord。

究竟再调用resumeTargetStackIfNeeded,resume当时复用的Acti数据结构有哪些vity。