public final class ActivityThread {
https://www.devp.com/forum.php?mod=viewthread&tid=38129
主线程中会构造这两个类的对象。
但是他们不是线程,你看看继承关系就可以知道ApplicationThread是binder, ActivityThread是一个final类也不是真正的线程。
如果你用ddms查看某一个进程的所有线程,你会发现它只有一个main thread,当然它可能还有binder thread, jdwp, signal catcher等。
一个应用程序对应一个ActivityThread实例,应用程序由activityThread打开消息循环, 同时,一个应用程序也对应一个ApplicationThread对象,此对象是ActivityThread 与 ActivityManagerService连接的桥梁
应该不是一个应用程序对应一个ActivityThread实例,而是一个进程对应一个ActivityThread实例,这个进程里面所有的activity对应这一个ActivityThread实例,你可以看看ActivityThread类包含了mActivities。
Step 3. Activity.startActivityForResult
这个函数也是实现在frameworks/base/core/java/android/app/Activity.java文件中:
[java]- public class Activity extends ContextThemeWrapper implements LayoutInflater.Factory,
- Window.Callback, KeyEvent.Callback, OnCreateContextMenuListener, ComponentCallbacks {
- ......
- public void startActivityForResult(Intent intent, int requestCode) {
- if (mParent == null) { Instrumentation.ActivityResult ar =
- mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, this,
- intent, requestCode); ......
- } else { ......
- }
- ......
- } 这里的mInstrumentation是Activity类的成员变量,它的类型是Intrumentation,定义在frameworks/base/core/java/android/app/Instrumentation.java文件中,它用来监控应用程序和系统的交互。
这里的mMainThread也是Activity类的成员变量,它的类型是ActivityThread,它代表的是应用程序的主线程,我们在Android系统在新进程中启动自定义服务过程(startService)的原理分析一文中已经介绍过了。这里通过mMainThread.getApplicationThread获得它里面的ApplicationThread成员变量,它是一个Binder对象,后面我们会看到,ActivityManagerService会使用它来和ActivityThread来进行进程间通信。这里我们需注意的是,这里的mMainThread代表的是Launcher应用程序运行的进程。
这里的mToken也是Activity类的成员变量,它是一个Binder对象的远程接口。