Activity
实例化:
// 0.activity 对象被创建了。通过反射的方式创建的
android.app.Instrumentation#newActivity(java.lang.ClassLoader,
java.lang.String, android.content.Intent)
// 1. call
android.app.ActivityThread#performLaunchActivity(ActivityClientRecord r,
Intent customIntent)
// 2.
// -->
android.app.ActivityThread#handleResumeActivity(IBinder token,
boolean clearHide,
boolean reallyResume,
int seq,
String reason)
handleResumeActivity()
里面看到了什么?看到了,Activity
虽说是用于显示界面的,但是实际上Activity
并不具备这个能力,实际上显示界面还是通过WindowManager.addView()/updateView()
来显示界面的。
android.app.ActivityThread#handleDestroyActivity(..)
这里会通过WindowManager
去移除view
.
ActivityThread
里面提供了很多public void scheduleXXX()
的方法,肯定是给外部调用的,比如scheduleLaunchActivity()
,scheduleResumeActivity()
,但是这些方法并没有去执行真正的逻辑,这些方法都发送了一个handler
消息,不过msg.waht
有区分。然后这些方法,对应的执行逻辑在handleXXX()
方法里面,比如handleLaunchActivity()
这样的方法里面。大部分 handlerXXX
方法里面都会去调用一个performXXXX()
方法比如performLaunchActivity()
这样的方法。
从调用链上看是:
外部方法 –> scheduleXXX() –>[内部handler调用] handlerXXX() –> [handlerXXX内部] performXXX() –>[内部调用]mInstrumentation.callXXXX();。
比如 activity#onCreate()
生命周期方法,就是在android.app.ActivityThread#performLaunchActivity()
中被android.app.Instrumentation#callActivityOnCreate(android.app.Activity, android.os.Bundle)
调用到的。这个方法里面调用了android.app.Activity#performCreate(android.os.Bundle)
,这个方法源码很短。但是代码很明确。
// Activity.java
final void performCreate(Bundle icicle) {
restoreHasCurrentPermissionRequest(icicle);
onCreate(icicle); // 生命周期的回调方法。
mActivityTransitionState.readState(icicle);
performCreateCommon();
}
由此可知,Activity
的生命周期方法全部是在ActivityThread
里面被调用。至于ActivityThread
是在哪被调用的,这个得继续分析了。
– 未完待续 –
然后,看到ActivityThread
里面有一个main()
方法,这个是不是就很激动了。每个java
程序的入口。
看看这个main
里面都有什么?
public static void main(String[] args) {
Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
SamplingProfilerIntegration.start();
// 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 对象
Looper.prepareMainLooper();
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler(); // 创建了一个 handler
}
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
// End of event ActivityThreadMain.
Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
Looper.loop(); // 调用 looper.loop() 方法
throw new RuntimeException("Main thread loop unexpectedly exited");
}
所有在这里也能看到为什么说UI
线程的handler
对象的创建,不需要手动设置looper
了。因为已经存在了。UI
线程到底是什么线程?就是main()
所在的线程了,也就是通常意义上面的主线程。
但是,这里面并没有做上面其他的逻辑,仅仅是创建了一个looper
和一个handler
对象。
那么之前的分析,ActivityThread#scheduleXXX
是被外部调用就是正确的。那么,到底是谁在调用这些方法呢?通过 grep
命令很快找到了,是在com.android.server.am.ActivityStackSupervisor#realStartActivityLocked(...)
里面调用的。
小结:
好了,先不看ActivityStackSupervisor
,单单看ActivityThread
,可以大致知道:
ActivityThread
里面启动了一个handler
,然后等到外部调用activity
相关的方法,等有人调用这些方法之后,就在handlerMessage()
方法里面去执行对应的逻辑。比如启动一个Activity
。Activity
实例是通过反射来创建,而不是通常的new
操作符。Activity
启动的时候会去关联到wm
,然后通过wm.addView/updateView
这样的方法去显示界面的。- 结合
Looper
,Handler
,Message
,MessageQueue
可知,主线程的Handler
可以直接创建并使用,而子线程的Handler
,必须手动在创建handler
的前后调用looper.prepare()
以及looper.loop()
方法。 Activity
的生命周期方法,是被自己的performXXX()
调用的,比如:performCreate()
,而performCreate
又是被android.app.Instrumentation#callActivityOnCreate(android.app.Activity, android.os.Bundle, android.os.PersistableBundle)
所调用的。Instrumentation#callActivityOnCreate
是被android.app.ActivityThread#performLaunchActivity
调用的,at.preformXXX
是被自己的at.handlerXXX
调用的,at.handlerXXX()
被调用,是因为外部(ActivityStackSupervisor
)调用了at.scheduleXXX
方法。[这里的at
,指的是ActivityThread
对象]
以上。 —未完待续—