Android中Activity启动过程探究

首先追溯到Activity的启动,随便启动一个自己写的demo项目,使用DDMS进行debug标记,然后在Debug中把主线程暂停,可以看到调用栈。如下图所示:

于是我们先看android.app.ActivityThreadmain()方法。

android.app.ActivityThread.main()

main()方法中对一个Looper对象进行初始化,形成一个消息循环,那么任何主线程的操作都会发送到这个Looper对应的Handler中去。通过源码,辗转反侧找到Handler的定义,它是ActivityThread中定义的一个内部类名为H继承自Handler

观察它的handleMessage()方法,发现了其中有一个what值为LAUNCH_ACTIVITY的switch分支,其中调用了handleLaunchActivity()方法。

接下来看android.app.ActivityThread.handleLaunchActivity()方法。

 

android.app.ActivityThread.handleLaunchActivity()

如上图所示,该方法中执行了两个比较关键的步骤,一个是performLaunchActivity(),另一个是handleResumeActivity()

先来看performLaunchActivity()做了什么。

 

android.app.ActivityThread.performLaunchActivity()

以下是部分源码,我做了一些省略。

 1 private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
 2     
 3     ...
 4     Activity activity = null;
 5     try {
 6         java.lang.ClassLoader cl = r.packageInfo.getClassLoader();
 7         activity = mInstrumentation.newActivity(
 8                 cl, component.getClassName(), r.intent);
 9         StrictMode.incrementExpectedActivityCount(activity.getClass());
10         r.intent.setExtrasClassLoader(cl);
11         if (r.state != null) {
12             r.state.setClassLoader(cl);
13         }
14     } catch (Exception e) {
15         if (!mInstrumentation.onException(activity, e)) {
16             throw new RuntimeException(
17                 "Unable to instantiate activity " + component
18                 + ": " + e.toString(), e);
19         }
20     }
21 
22     try {
23         ...
24         if (activity != null) {
25             ...
26             
27             activity.attach(appContext, this, getInstrumentation(), r.token,
28                     r.ident, app, r.intent, r.activityInfo, title, r.parent,
29                     r.embeddedID, r.lastNonConfigurationInstances, config);
30             ...
31             activity.mCalled = false;
32             mInstrumentation.callActivityOnCreate(activity, r.state);
33             ...
34         }
35         ...
36     }
37     ...
38 }

重点关注红色加粗的部分:

7, 8行:通过Activity的类名构建一个Activity对象。

27行:调用了Activity.attach()方法。

32行:通过Instrumentation对象执行Activity的onCreate

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值