我们学习 Android 过程中会发现,我们的文件都是 .java
文件,也就是说 Android 开发还是用的 Java 语言来编写的。也正是这样,所以你们来学 Android ,也会让你们先学习一段时间 Java 。掌握好了 Java 的相关知识,学起 Android 来可谓是事半功倍。好了,你们是不是感觉有点扯远了啊,不是说好讲 ActivityThread
类的么,其实并不如此。
你们在刚开始从 Java 学习转到 Android 学习的过程中,有一个重大的改变不知道你们又没有发现。那就是 Java 中的 main()
方法,程序的入口不见了,取而代之的是 onCreate()
方法。你们没有一点疑惑么?初学阶段直接无脑接受是对的,但是作为一个工作几年了的人来说,就有必要去深入研究一下了。明明 Android 也就是 Java 语言也编写的,差别咋就这么大呢?
其实呢, Android 中还是有 main() 方法的,只是隐藏的比较深而已。今天,就由我 AIqingfeng 来带你们一探究竟~!
我们先找到 ActivityThread 这个类,看一下注释(较少,值得一看):
This manages the execution of the main thread in an
application process, scheduling and executing activities,
broadcasts, and other operations on it as the activity
manager requests.
翻译一下就是:在 Application 进程中管理执行主线程,调度和执行 活动和广播,和活动管理请求的其它操作。
一、入口
Android 上一个应用的入口,应该是 ActivityThread 类,和普通的Java 类一样,入口是一个 main() 方法。
public static void main(String[] args) {
// 看源码很重要的一个能力就是‘眼中只有你’,认不到的都忽略,看认得到的
···
// 创建主线程的Looper对象,发现和工作线程创建Looper对象调用的方法不一样,这里先记下,以后在详解。
// 主线程原来也有Looper对象啊
Looper.prepareMainLooper();
// 这里创建了一个活动线程,也就是我们的主线程。
ActivityThread thread = new ActivityThread();
thread.attach(false);
// 如果主线程的Handler为空(可以看出,一个好的命名可读性是多么高),那就为主线程创建一个Handler。
// 然后我们还可以在主线程创建Handler,说明一个线程对应多个Handler。多读源码,很多问题都得到了解决啊。
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
Looper.loop();
// 这里抛了个异常,主线程loop异常退出。说明主线程loop不能退出,这里和前面建立Looper对象的调用方法有关
throw new RuntimeException("Main thread loop unexpectedly exited");
}
二、变量
好了,现在我们解决了我们开始的疑惑后,再来深度学习一下这个类的一些知识吧。
ActivityThread 有几个比较重要的成员变量,会在创建ActivityThread对象时初始化。
final ApplicationThread mAppThread = new ApplicationThread();
ApplicationThread继承自ApplicationThreadNative, 而ApplicationThreadNative又继承自Binder并实现了IApplicationThread接口。IApplicationThread继承自IInterface。这是一个很明显的binder结构,用于与Ams通信。IApplicationThread接口定义了对一个程序(Linux的进程)操作的接口。ApplicationThread通过binder与Ams通信,并将Ams的调用,通过下面的H类(也就是Hnalder)将消息发送到消息队列,然后进行相应的操作,入activity的start, stop。
final H mH = new H();
这个 H
大家首先会想到什么啊,不要开车哈。看到 H
想到了 Handler
。发现 H
是 ActivityThread
内部类,继承自 Handler
,果然没错。所以大家遇到不清楚的,不要怕,大胆的猜测一下。Handler
最重要的的也就是 handleMessage()
方法了。查看一下其方法:
ActivityThread.java
public void handleMessage(Message ms ) {
switch (msg.what) {
// 呀哈,这些看着和 onCreate() 、onResume() 、onStop() 方法有很大关系啊。
case LAUNCH_ACTIVITY: {
// 处理加载活动,这里进去就可以得到答案啦。
handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
} break;
case RESUME_ACTIVITY:
case STOP_ACTIVITY:
}
}
点进来咯。 ActivityThread.java
private void handleLaunchActivity(···) {
// 执行加载活动,返回一个活动对象。有兴趣可以在进去看看。
Activity a = performLaunchActivity(r, custonIntent);
}
兴趣是最好的老师。ActivityThread.java
private Activity performLaunchActivity(···) {
Activity activity = null;
try {
// 活动在这里被创建,还可以进去看看。认不到的单词google一下,Instrumentation : 仪器。
activity = mInstrumentation.newActivity(···);
}
if (r.isPersistable()) {
// 看名字就感觉调用了 Activity 的 onCreate() 方法
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
}
先探索一下 Activity 创建这条路吧。最底层啦。Instrumentation.java
public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, illegalAccessException, ClassNotFoundException {
// 类加载器根据类名创建了一个实例。再下去就是native方法了。
return (Activity) cl.loadClass(className).newInstance();
}
Native方法,C语言啦,活动创建之路结束了。Class.java
public native T newInstance() throws InstantiationException, IllegalAccessException;
再来看看 Activity 中 onCreate() 方法执行之路吧。 Instrumentation.java
public void callActivityOnCreate(Activity activity, Bundle icicle,
PersistableBundle persistentState) {
// pre: 前,执行 Create 操作之前
prePerformCreate(activity);
// 执行 Create 操作
activity.performCreate(icicle, persistentState);
postPerformCreate(activity);
}
到了 Activity 了,哪里我们自己 Activity 还远么~! Activity.java
final void performCreate(Bundle icicle) {
restoreHasCurrentPermissionRequest(icicle);
// 哼哼,终于找到你了,onCreate() 方法。
onCreate(icicle);
mActivityTransitionState.readState(icicle);
performCreateCommon();
}
来,仔细瞅瞅~! Activity.java
@MainThread // 主线程
@CallSuper // 必须调用super.onCreate(bundle);
protected void onCreate(@Nullable Bundle savedInstanceState) {
// 看这里,是不是我们恢复数据那些操作啊,看看源码怎么写的~!
if (savedInstanceState != null) {
Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
// Activity 中管理的 Fragment
mFragments.restoreAllState(p, mLastNonConfigurationInstances != null
? mLastNonConfigurationInstances.fragments : null);
}
// 分发 Create 操作
mFragments.dispatchCreate();
}