今天我们来分析一下Activity的启动流程:
当用户手指触摸到我们手机屏幕上的icon的时候,这时候我们的程序会进入到我们的入口类中
ActivityThread,当然也像大多数程序一样,比如C、C++,Java都会有一个main方法,我们的Activity中也有一个main方法

1.首先Activity会调用该类中的main方法,来做一些前期的启动分析工作,比如

Looper.prepareMainLooper()


Looper.loop()

我们一般在主线程中使用handler的时候是下面这样的


Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
           //处理消息
        }
    };

然而我们在子线程中,假如我们要和主线程去传递消息我们必须这样:

//开启一个子线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                Looper.prepare();
                Handler handler = new Handler(){
                    @Override
                    public void handleMessage(Message msg) {
                        //处理消息
                    }
                };
                Looper.loop();
            }
        }).start();



我们在这里看到我们在子线程中调用了Looper.prepare()和Looper.loop()去创建一个消息循环去不断地循环,


这也就解释了我们,为什么在主线程中我们就不用去Looper.prepare()和Looper.loop(),因为我们在ActivityThread中的main方法中已经


开启了一个消息循环。




2.我们在main方法中创建了消息循环后,会去执行该类的attach方法,


ActivityThread thread = new ActivityThread();
thread.attach(false);

3.我们看一下attach方法,我在这里只挑比较重要的代码

final IActivityManager mgr = ActivityManagerNative.getDefault();



去调用ActivityManageNative的getDefault()方法


我们的getDefault()方法干了些什么呢?


IBinder b = ServiceManager.getService("activity");



原来我们从ServiceManager取出getService("activity");


既然我们有getService,那么有没有setService,或者addService呢?带着猎奇的态度我们去看一下,果然我们在ActivityManagerService中找到了



ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
            ServiceManager.addService(ProcessStats.SERVICE_NAME, mProcessStats);
            ServiceManager.addService("meminfo", new MemBinder(this));
            ServiceManager.addService("gfxinfo", new GraphicsBinder(this));
            ServiceManager.addService("dbinfo", new DbBinder(this));
            //其中 Context.ACTIVITY_SERVICE
            public static final String ACTIVITY_SERVICE = "activity";


4.我们的getDefault方法反回了一个ActivityManagerService,并且将ActivityManagerService对象返回到我们的ActivityThread,
紧接着我们调用了ActivityManagerService的attachApplication
    mgr.attachApplication(mAppThread);
 并且传过去一个Thread,在 attachApplication中我们调用了ActivityManagerService的attachApplicationLocked,并且将刚才传过来的thread传下去   
 attachApplicationLocked(thread, callingPid); 
 做一些基础的检测,比如pid的检查,是否有多个应用程序运行
 然后回去调用ActivityStackSupervisor的attachApplicationLocked,
 拿到最上面的一个Activity,

 ActivityRecord hr = stack.topRunningActivityLocked(null);


该类相当于一个Activity的任务栈


 mStackSupervisor.attachApplicationLocked-->realStartActivityLocked(hr, app, true, true)


5. 接着又回到我们的ActivityThread中的scheduleLaunchActivity方法,通过scheduleLaunchActivity进行一些配置

ActivityClientRecord r = new ActivityClientRecord();
            r.token = token;
            r.ident = ident;
            r.intent = intent;
            r.referrer = referrer;
            r.voiceInteractor = voiceInteractor;
            r.activityInfo = info;
            r.compatInfo = compatInfo;
            r.state = state;
            r.persistentState = persistentState;

            r.pendingResults = pendingResults;
            r.pendingIntents = pendingNewIntents;

            r.startsNotResumed = notResumed;
            r.isForward = isForward;

            r.profilerInfo = profilerInfo;

            updatePendingConfiguration(curConfig);

            sendMessage(H.LAUNCH_ACTIVITY, r);



并且发送了message,接下来就是处理这些消息了handleLaunchActivity


 这里面配置一些window信息,初始化之类的,比较重要的代码



6.Activity a = performLaunchActivity(r, customIntent);



在performLaunchActivity中会调用Instrumentation类的


 mInstrumentation.newActivity();


 在Instrumentation中会通过反射拿到一个Activity对象并且返回给ActivityThread


 然后在ActivityThread中调用Instrumentation对象的callActivityOnCreate(将activity传递过去)


  mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);


 在callActivityOnCreate中会去调用




public void callActivityOnCreate(Activity activity, Bundle icicle,
            PersistableBundle persistentState) {
        prePerformCreate(activity);
        activity.performCreate(icicle, persistentState);
        postPerformCreate(activity);
    }

//最终调用我们的activity的performCreate方法


final void performCreate(Bundle icicle) {
        onCreate(icicle);
        mActivityTransitionState.readState(icicle);
        performCreateCommon();
    }



结合下面的流程图应该更好理解

android 在子线程startActivity 子线程启动activity_Activity启动流程