Android系统启动流程之-----activity启动流程

前言

对于从事最上层的应用开发者来说,很多人只知道activity的启动是从ActivityThread开始的,并不知道frameworks具体的调用流程。今天我们就从点击launcher图标开始具体讲解下。
在这里插入图片描述
activity:
startActivity–> startActivityForResult–>mParent.startActivityFromChild–>
(来到Instrumentation)mInstrumentation.execStartActivity–>ActivityManager.getService().startActivity–>(来到windowmanagerService)
windowmanagerService.startActivity–>

1.frameworks/base/core/java/android/app/Activity.java

从luancher点击应用图标,最终会来到activity的startActivity,经过一系列的方法调用:startActivity–> startActivityForResult–>mParent.startActivityFromChild–>mInstrumentation.execStartActivity

2.frameworks/base/core/java/android/app/Instrumentation.java

Instrumentation.execStartActivity中会从ServiceManager中取获取到binder的代理类ServiceManagerProxy,此代理类最终会调用到ActivityManagerService中的startActivity,至此就从launcher进程来到了system_Server进程
try {
intent.migrateExtraStreamToClipData();
intent.prepareToLeaveProcess(who);
int result = ActivityManager.getService()
.startActivity(whoThread, who.getBasePackageName(), 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);
}

3.frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

ActivityManagerService中首先会去检验用户的权限,以及activity所在的进程是否创建,如果没创建就会创建socket消息,通知zygote进程进行fork进程。
fork成功后,通过发射去启动新进程的activityThread–>main方法

4.frameworks/base/core/java/android/app/ActivityThread.java

activityThread的main方法中通过attachApplication把ApplicationThread的绑定给ActivityManagerService
final IActivityManager mgr = ActivityManager.getService();
try {
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}

5.frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

public final void attachApplication(IApplicationThread thread) {
synchronized (this) {
int callingPid = Binder.getCallingPid();
final long origId = Binder.clearCallingIdentity();
attachApplicationLocked(thread, callingPid);
Binder.restoreCallingIdentity(origId);
}
}
ActivityManagerService会调用attachApplicationLocked,改方法会通过thread.bindApplication初始化应用
if (app.instr != null) {
thread.bindApplication(processName, appInfo, providers,
app.instr.mClass,
profilerInfo, app.instr.mArguments,
app.instr.mWatcher,
app.instr.mUiAutomationConnection, testMode,
mBinderTransactionTrackingEnabled, enableTrackAllocation,
isRestrictedBackupMode || !normalMode, app.persistent,
new Configuration(getGlobalConfiguration()), app.compat,
getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
buildSerial);
} else {
thread.bindApplication(processName, appInfo, providers, null, profilerInfo,
null, null, null, testMode,
mBinderTransactionTrackingEnabled, enableTrackAllocation,
isRestrictedBackupMode || !normalMode, app.persistent,
new Configuration(getGlobalConfiguration()), app.compat,
getCommonServicesLocked(app.isolated),
mCoreSettingsObserver.getCoreSettingsLocked(),
buildSerial);
}
if (normalMode) {
try {
if (mStackSupervisor.attachApplicationLocked(app)) {
didSomething = true;
}
} catch (Exception e) {
Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
badApp = true;
}
}
并且通过一系列的方法调用mStackSupervisor.attachApplicationLocked–>
realStartActivityLocked–>app.thread.scheduleLaunchActivity
scheduleLaunchActivity就是去启动activity了,至此完成了应用的启动

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值