首先我们应该知道2个概念;
- 我们应该知道在Android中一个app就是一个进程;
- 我们在普通的Java程序中一个程序的入口是main方法,其实就是启动一个Java进程,然后这个Java进程就会启动一个主线程。
- Android 系统间有很多进程, AMS, PMS 等都是独立进程,app 都要和这些进程进行通信;
同理在 Android 中也是启动一个进程,然后执行 main 方法,这个启动类就是 ActivityThread.java; 所以首先执行的应该是 ActivityThread 的 main 方法;
public static void main(String[] args) {
SamplingProfilerIntegration.start();
........
// 初始化一个 Loop
Looper.prepareMainLooper();
// 创建 当前进程中最主要的对象
ActivityThread thread = new ActivityThread();
// 初始化 application, Instrumentation
thread.attach(false);
......
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
// 主线程 循环; 应用第一个线程就不会停止了
Looper.loop();
}
应用的进程启动的时候,首先调用的是 ActivityThread 的 main 方法, 在 main 方法中初始化一个 ActivityThread; 然后执行 ActivityThread 实例的 attach 方法, attach 中把 ApplicationThread 和 IActivityManager 关联起来(可以进行通信了), 并且和 ViewRootImpl 做了一些关联(以后再研究);
ActivityThread 有个内部 ApplicationThread 类;这个主要用于和 Android 系统的 AMS 进行系统进程通信;
Activity 被 ActivityThread 启动的过程
查看方法名 android.app.ActivityThread#performLaunchActivity
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
// System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");
// 创建 activity
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
try {
// 获得 Application
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
// 创建 context
Context appContext = createBaseContextForActivity(r, activity);
CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());
Configuration config = new Configuration(mCompatConfiguration);
if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "
+ r.activityInfo.name + " with config " + config);
// activity 中把 context 放进去,把 appliaction也放进去, 且在 attach 的时候,把activity 的windown 创建好了
activity.attach(appContext, this, getInstrumentation(), r.token,
r.ident, app, r.intent, r.activityInfo, title, r.parent,
r.embeddedID, r.lastNonConfigurationInstances, config);
// 把一些样式放进去
activity.mCalled = false;
// 调用 activity 的 onCreate方法
mInstrumentation.callActivityOnCreate(activity, r.state);
mActivities.put(r.token, r);
//....................
return activity;
}
从上面的代码中可以看出来,activity 的创建和 context, application 的赋值过程都是在 ActivityThread 中进行的。 且流程是
new Activity --> 设置 application ---> 设置 ContextImpl --> attach() --> attachBaseContext() --> onCreate()
为什么我要把这个过程列出来,主要是为了了解 applicationContext 和 Activity 的 context 的创建过程;
以上所有的都是正常使用 Java 创建类的思路去理解,对应 activity 的一些生命周期的管理也是从这里开始的;