startActivity启动过程分析 - Gityuan博客 | 袁辉辉的技术博客
Android Activity启动流程(Android 13)_android13 app启动过程-CSDN博客
- Android 6.0源碼
ActivityThread和ApplicationThrad通过Handler通信 handleLaunchActivity>>new Activity>>activity.attach()>>Instrumention.callAcitivityOnCreate>>Activity.onCreate
- Android 13.0源碼
1.当我们点击app桌面图标的时候,桌面Launcher应用会调用
startActivity----> startActivityForActivityResult-----> Insrumention(execStartActivity)---> ActivityManagerProxy(startActivity)---> Binder通信---->通知ActivityManagerService.
2.ActivityManagerService在收到AMP启动Activity的请求后,会做以下事情:
-
检查Activity的合法性,是否在AndroidManifest.xml清单文件中注册。
-
如果合法,会暂存Activity的信息,通过ActivityStack获取栈顶的Activity,并通知Launcher应用,pause 该Activity 。
-
检查Activity所在的进程是否存在。
2.1.检查Activity所在的进程是否存在
(1)进程不存在(冷启动)
会调用Process.start() ,通过Socket通信的方式,通知zygote进程,fork一个新进程, 载入ActivityThread ,会调用main()方法初始化,在main()方法内部会调用 thread.attach(false, startSeq)--->actachApplication()--->AMS会通过Binder IPC机制给App进程发送一个BindApplication的消息--->App进程收到这个消息后,会通过Handler发送一个Bind_APPLICATION的消息给到ActivityThread--->handleBindApplication...
(2)进程存在(热启动)
AMS会通过Binder IPC机制给App进程发送一个scheduleLaunchActivity的消息...
public static void main(String[] args) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
// CloseGuard defaults to true and can be quite spammy. We
// disable it here, but selectively enable it later (via
// StrictMode) on debug builds, but using DropBox, not logs.
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
// Set the reporter for event logging in libcore
EventLogger.setReporter(new EventLoggingReporter());
// Make sure TrustedCertificateStore looks in the right place for CA certificates
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
// Find the value for {@link #PROC_START_SEQ_IDENT} if provided on the command line.
// It will be in the format "seq=114"
long startSeq = 0;
if (args != null) {
for (int i = args.length - 1; i >= 0; --i) {
if (args[i] != null && args[i].startsWith(PROC_START_SEQ_IDENT)) {
startSeq = Long.parseLong(
args[i].substring(PROC_START_SEQ_IDENT.length()));
}
}
}
ActivityThread thread = new ActivityThread();
thread.attach(false, startSeq);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
// End of event ActivityThreadMain.
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
2.2.然后AMS服务端这边,会通过Binder Ipc机制给App进程发送一个bindApplication的消息,App进程收到bindApplication的消息后,会通过Handler发送一个BIND_APPLICATION的消息给到ActivityThread线程,调用
handleBindApplication方法,在这个方法中,会通过Instrumination.newApplication创建应用,并调用Instrumination.callApplicaionOnCreate回调applicaion的onCreate方法.
2.3.然后AMS服务端这边,会通过Binder Ipc机制给App进程发送一个schduleLaunchActivity的消息,App进程收到schduleLaunchActivity的消息后,会通过Handler发送一个LAUNCH_ACTIVITY的消息给到ActivityThread线程,调用handleLaunchActivity-->pefromLaunchActivity方法,在这个方法中,会通过Instrumination.newActivity创建应用,并调用Instrumination.callActivityOnCreate回调applicaion的onCreate方法.
---->bindApplication--->handleLaunchActivity--->performLaunchActivity---->Instrumentation.newActivity---->Instrumention.callActivityOnCreate---->Activity.performCreate--->Activity.onCreate()
schduleLaunchActivity--->handleLaunchActivity--->performLaunchActivity---->Instrumentation.newActivity---->Instrumention.callActivityOnCreate---->Activity.performCreate--->Activity.onCreate()
schduleResumeActivity--->handleResumeActivity->performResumeActivity-Activity.performResume>>>Instrumentation.callActivityOnResume>>>Activity.onResume()
2.4.接下来就会走View的绘制 View的绘制原理 - 简书 (jianshu.com)