1. 入口。

以前一直都说Activity的人口是onCreate方法。其实android上一个应用的入口,应该是ActivityThread。和普通的java类一样,入口是一个main方法。

public static final void main(String[] args) {
SamplingProfilerIntegration.start();
……
Looper.prepareMainLooper();
if (sMainThreadHandler == null) {
sMainThreadHandler = new Handler();
}
ActivityThread thread = new ActivityThread();
thread.attach(false);
……
Looper.loop();
……
thread.detach();
……
Slog.i(TAG, "Main thread of " + name + " is now exiting");
}

下面仔细分析一下这个main方法。


2.Looper.prepareMainLooper();

ActivityThread其实就是我们经常说的UI thread,也就是主线程。我们都知道主线程可以使用Handler进行异步通信,因为主线程中已经创建了Looper,而这个Looper就是在这里创建的。如果其他线程需要使用Handler通信,就要自己去创建Looper。


3. sMainThreadHandler = new Handler();

创建一个Handler。


4. ActivityThread thread = new ActivityThread();

创建ActivityThread 对象。

ActivityThread 有几个比较重要的成员变量,会在创建ActivityThread对象时初始化。

(1)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。

(2)final H mH = new H();

private final class H extends Handler

mH负责处理ApplicationThread发送到消息队列的消息,例如:

public void handleMessage(Message msg) {
if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + msg.what);
switch (msg.what) {
case LAUNCH_ACTIVITY: {
ActivityClientRecord r = (ActivityClientRecord)msg.obj;

r.packageInfo = getPackageInfoNoCheck(
r.activityInfo.applicationInfo);
handleLaunchActivity(r, null);
} break;


5. handleLaunchActivity(r, null);

从名字中就可以看出,这里就将进行启动activity的工作了。

方法中主要调用了这一句:

Activity a = performLaunchActivity(r, customIntent);


6. performLaunchActivity()

进行了一些初始化和赋值操作后,创建activity。

activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);

然后调用:

mInstrumentation.callActivityOnCreate(activity, r.state);

这一句就会调用到acitivity的onCreate方法了,就进入了大多数应用开发的入口了。


更多相关文章

  1. Android(安卓)SDK无法更新
  2. Android(安卓)ImageLoader 本地缓存
  3. Android之MTP框架和流程分析
  4. Android(安卓)Service 服务(三)—— bindService与remoteService
  5. Android的frameworks层音量控制原理分析
  6. Android(安卓)跨应用调用Activity及Service - 叶园 - 博客频道 -
  7. 解决ScrollView与ListView的冲突的方法
  8. android intent.setDate方法
  9. Android(安卓)开源框架

随机推荐

  1. 毕业5年,3度转岗,阿里学姐教你如何一举跳槽
  2. QianBase数据存储和传输加密
  3. 你没有看错,爬网页数据,C# 也可以像 Jquery
  4. 以下7种硬件测试的种类,不知道的赶紧收藏
  5. C# 中居然也有切片语法糖,太厉害了
  6. 主备机房出口切换 python脚本
  7. 描述类成员的重载、全局成员以及命名空间
  8. 命名空间类名三种引用-命名冲突解决-自动
  9. 第7章 0202-面向对象编程基础,学习心得、
  10. 命名空间类三种引用、类导入命名冲突解决