Activity启动分析

来源:互联网 发布:js 禁用input select 编辑:程序博客网 时间:2024/05/01 21:41
今天我们来分析一下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();    }

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