Android 面试总结 - Activity的启动流程,阿里、百度、美团、携程、蚂蚁面经分享

if (ar != null) {

mMainThread.sendActivityResult(

mToken, mEmbeddedID, requestCode, ar.getResultCode(),

ar.getResultData());

}

if (requestCode >= 0) {

// If this start is requesting a result, we can avoid making

// the activity visible until the result is received. Setting

// this code during onCreate(Bundle savedInstanceState) or onResume() will keep the

// activity hidden during this time, to avoid flickering.

// This can only be done when a result is requested because

// that guarantees we will get information back when the

// activity is finished, no matter what happens to it.

mStartedActivity = true;

}

cancelInputsAndStartExitTransition(options);

// TODO Consider clearing/flushing other event sources and events for child windows.

} else {

if (options != null) {

mParent.startActivityFromChild(this, intent, requestCode, options);

} else {

// Note we want to go through this method for compatibility with

// existing applications that may have overridden it.

mParent.startActivityFromChild(this, intent, requestCode);

}

}

}

关键调用 mInstrumentation.execStartActivity

app 进程到 ATMS 进程

Instrumentation#execStartActivity

@UnsupportedAppUsage

public ActivityResult execStartActivity(

Context who, IBinder contextThread, IBinder token, Activity target,

Intent intent, int requestCode, Bundle options) {

IApplicationThread whoThread = (IApplicationThread) contextThread;

Uri referrer = target != null ? target.onProvideReferrer() : null;

if (referrer != null) {

intent.putExtra(Intent.EXTRA_REFERRER, referrer);

}

if (mActivityMonitors != null) {

synchronized (mSync) {

final int N = mActivityMonitors.size();

for (int i=0; i<N; i++) {

final ActivityMonitor am = mActivityMonitors.get(i);

ActivityResult result = null;

if (am.ignoreMatchingSpecificIntents()) {

result = am.onStartActivity(intent);

}

if (result != null) {

am.mHits++;

return result;

} else if (am.match(who, null, intent)) {

am.mHits++;

if (am.isBlocking()) {

return requestCode >= 0 ? am.getResult() : null;

}

break;

}

}

}

}

try {

intent.migrateExtraStreamToClipData(who);

intent.prepareToLeaveProcess(who);

int result = ActivityTaskManager.getService().startActivity(whoThread,

who.getBasePackageName(), who.getAttributionTag(), intent,

intent.resolveTypeIfNeeded(who.getContentResolver()), token,

target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);

checkStartActivityResult(result, intent);

} catch (RemoteException e) {

throw new RuntimeException(“Failure from system”, e);

}

return null;

}

最终通过 ActivityTaskManager.getService() 获取ATMS的服务代理并调用 ATMS.startActivity 方法,这时从 app 的进程进入到 SystemServer 进程,发生了一次跨进程!

ATMS 到 ActivityThread

ActivityTaskManagerService#startActivity

@Override

public final int startActivity(IApplicationThread caller, String callingPackage,

String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,

String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,

Bundle bOptions) {

return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,

resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions,

UserHandle.getCallingUserId());

}

ActivityTaskManagerService#startActivityAsUser

@Override

public int startActivityAsUser(IApplicationThread caller, String callingPackage,

String callingFeatureId, Intent intent, String resolvedType, IBinder resultTo,

String resultWho, int requestCode, int startFlags, ProfilerInfo profilerInfo,

Bundle bOptions, int userId) {

return startActivityAsUser(caller, callingPackage, callingFeatureId, intent, resolvedType,

resultTo, resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,

true /validateIncomingUser/);

}

ActivityTaskManagerService#startActivityAsUser

private int startActivityAsUser(IApplicationThread caller, String callingPackage,

@Nullable String callingFeatureId, Intent intent, String resolvedType,

IBinder resultTo, String resultWho, int requestCode, int startFlags,

ProfilerInfo profilerInfo, Bundle bOptions, int userId, boolean validateIncomingUser) {

assertPackageMatchesCallingUid(callingPackage);

enforceNotIsolatedCaller(“startActivityAsUser”);

userId = getActivityStartController().checkTargetUser(userId, validateIncomingUser,

Binder.getCallingPid(), Binder.getCallingUid(), “startActivityAsUser”);

// TODO: Switch to user app stacks here.

return getActivityStartController().obtainStarter(intent, “startActivityAsUser”)

.setCaller(caller)

.setCallingPackage(callingPackage)

.setCallingFeatureId(callingFeatureId)

.setResolvedType(resolvedType)

.setResultTo(resultTo)

.setResultWho(resultWho)

.setRequestCode(requestCode)

.setStartFlags(startFlags)

.setProfilerInfo(profilerInfo)

.setActivityOptions(bOptions)

.setUserId(userId)

.execute();

}

最后 return 的对象设置了那么多属性并在最后调用 excute() 执行。

return getActivityStartController().obtainStarter(intent, “startActivityAsUser”)

.setCaller(caller)

.setCallingPackage(callingPackage)

.setCallingFeatureId(callingFeatureId)

.setResolvedType(resolvedType)

.setResultTo(resultTo)

.setResultWho(resultWho)

.setRequestCode(requestCode)

.setStartFlags(startFlags)

.setProfilerInfo(profilerInfo)

.setActivityOptions(bOptions)

.setUserId(userId)

.execute();

先看看 getActivityStartController() 是个啥

ActivityStartController getActivityStartController() {

return mActivityStartController;

}

getActivityStartController().obtainStarter(intent, “startActivityAsUser”)

ActivityStarter obtainStarter(Intent intent, String reason) {

return mFactory.obtain().setIntent(intent).setReason(reason);

}

mFactory.obtain() 使用工厂模式从 DefaultFactory 类的缓存池(最大缓存数量为3) 中取出 ActivityStarter 对象

getActivityStartController().obtainStarter(intent, “startActivityAsUser”)

.setCaller(caller)

setCaller(caller) caller 是 IApplicationThread 类型的对象,等于 ActivityStarter 里缓存了与 app 进程连接的桥梁,之后可以进行跨进程调用 app 进程。

ApplicationThread是ActivityThread内部类,继承自IApplicationThread.Stub,作为服务端接受AMS发出的请求并执行,ApplicationThread是ActivityThread与AMS连接的桥梁。

再看最后的 execute()

return getActivityStartController().obtainStarter(intent, “startActivityAsUser”)

.setCaller(caller)

.execute();

ActivityStarter#execute

int execute() {

try {

res = executeRequest(mRequest);

return getExternalResult(mRequest.waitResult == null ? res
waitForResult(res, mLastStartActivityRecord));

} finally {

onExecutionComplete();

}

}

ActivityStarter#executeRequest

/**

*执行活动启动请求,开始启动活动的旅程。在这里

*首先执行几个初步检查。正常的活动启动流程将

*通过{@link#startActivityUnchecked}到{@link#startactivitynner}。

*/

private int executeRequest(Request request) {

// 在这里创建 ActivityRecord 对象,用于描述 Activity 信息

final ActivityRecord r = new ActivityRecord(mService, callerApp, callingPid, callingUid,

callingPackage, callingFeatureId, intent, resolvedType, aInfo,

mService.getGlobalConfiguration(), resultRecord, resultWho, requestCode,

request.componentSpecified, voiceSession != null, mSupervisor, checkedOptions,

sourceRecord);

mLastStartActivityResult = startActivityUnchecked(r, sourceRecord, voiceSession,

request.voiceInteractor, startFlags, true /* doResume */, checkedOptions, inTask,

restrictedBgActivity, intentGrants);

return mLastStartActivityResult;

}

ActivityStarter#startActivityUnchecked

private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,

IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,

int startFlags, boolean doResume, ActivityOptions options, Task inTask,

boolean restrictedBgActivity, NeededUriGrants intentGrants) {

int result = START_CANCELED;

final ActivityStack startedActivityStack;

try {

mService.deferWindowLayout();

Trace.traceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, “startActivityInner”);

// 关键

result = startActivityInner(r, sourceRecord, voiceSession, voiceInteractor,

startFlags, doResume, options, inTask, restrictedBgActivity, intentGrants);

} finally {

Trace.traceEnd(Trace.TRACE_TAG_WINDOW_MANAGER);

startedActivityStack = handleStartResult(r, result);

mService.continueWindowLayout();

}

postStartActivityProcessing(r, result, startedActivityStack);

return result;

}

ActivityStarter#startActivityInner

int startActivityInner(final ActivityRecord r, ActivityRecord sourceRecord,

IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,

int startFlags, boolean doResume, ActivityOptions options, Task inTask,

boolean restrictedBgActivity, NeededUriGrants intentGrants) {

mRootWindowContainer.resumeFocusedStacksTopActivities(

mTargetStack, mStartActivity, mOptions);

return START_SUCCESS;

}

调用了RootWindowContainer#resumeFocusedStacksTopActivities

boolean resumeFocusedStacksTopActivities(

ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {

result |= focusedStack.resumeTopActivityUncheckedLocked(target, targetOptions);

return result;

}

调用 ActivityStack#resumeTopActivityUncheckedLocked

boolean resumeTopActivityUncheckedLocked(ActivityRecord prev, ActivityOptions options) {

result = resumeTopActivityInnerLocked(prev, options);

return result;

}

private boolean resumeTopActivityInnerLocked(ActivityRecord prev, ActivityOptions options) {

//关键关键!!! 传入了 next.app.getThread() 返回的是 IApplication

final ClientTransaction transaction =

ClientTransaction.obtain(next.app.getThread(), next.appToken);

transaction.setLifecycleStateRequest(

ResumeActivityItem.obtain(next.app.getReportedProcState(),

dc.isNextTransitionForward()));

mAtmService.getLifecycleManager().scheduleTransaction(transaction);

return true;

}

mStackSupervisor.startSpecificActivity(next, true, true);

ActivityStackSupervisor#startSpecificActivity

void startSpecificActivity(ActivityRecord r, boolean andResume, boolean checkConfig) {

realStartActivityLocked(r, wpc, andResume, checkConfig);

}

ActivityStackSupervisor#realStartActivityLocked

boolean realStartActivityLocked(ActivityRecord r, WindowProcessController proc,

boolean andResume, boolean checkConfig) throws RemoteException {

// Create activity launch transaction.

// 关键关键!!! 传入了 proc.getThread() 返回的是 IApplication

// 赋值给 ClientTransaction 的 mClient 对象

final ClientTransaction clientTransaction = ClientTransaction.obtain(

proc.getThread(), r.appToken);

final DisplayContent dc = r.getDisplay().mDisplayContent;

clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),

System.identityHashCode®, r.info,

// TODO: Have this take the merged configuration instead of separate global

// and override configs.

mergedConfiguration.getGlobalConfiguration(),

mergedConfiguration.getOverrideConfiguration(), r.compat,

r.launchedFromPackage, task.voiceInteractor, proc.getReportedProcState(),

r.getSavedState(), r.getPersistentSavedState(), results, newIntents,

dc.isNextTransitionForward(), proc.createProfilerInfoIfNeeded(),

r.assistToken, r.createFixedRotationAdjustmentsIfNeeded()));

// Set desired final state.

final ActivityLifecycleItem lifecycleItem;

if (andResume) {

lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());

} else {

lifecycleItem = PauseActivityItem.obtain();

}

clientTransaction.setLifecycleStateRequest(lifecycleItem);

// Schedule transaction.

mService.getLifecycleManager().scheduleTransaction(clientTransaction);

}

通过缓存池获取 ClientTransaction 类型的对象,并通过 mService.getLifecycleManager()调用 scheduleTransaction 方法开始执行任务

mService 是 ActivityTaskManagerService 类型的对象

ActivityTaskManagerService#getLifecycleManager

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!

Android架构师之路很漫长,一起共勉吧!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-9iGfNHxL-1712102560086)]

最后

现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!

为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!

Android架构师之路很漫长,一起共勉吧!

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值