栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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了,至此完成了应用的启动

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/918799.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号