您的位置:首页 > 移动开发 > Android开发

深入理解Activity——Activity是如何启动的

2015-12-20 13:50 447 查看

Read TheFucking Source Code!

Framework层对Activity进行统一的控制,例如Activity栈的管理、生命周期方法的回调、进程间通信等

ActivityThread

ActivityThread是线程吗?

本质上它不是一个线程,通过查看源码发现他只是一个普通java类,没有继承任何的Thread类,ActivityThread控制Activity生命周期方法的回调,具体的操作都是由远程的ActivityManagerService跨进程间通信调用的

ActivityThread是如何被启动的?

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

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

public static final void main(String[]args) {

       SamplingProfilerIntegration.start();

                     ……

//1.创建消息轮询对象

       Looper.prepareMainLooper();

        if (sMainThreadHandler== null) {

            sMainThreadHandler = newHandler();

        }

//2.创建自身的对象

        ActivityThread thread =new ActivityThread();

//做一些相关处理

        thread.attach(false);

       ……

//3.轮询消息队列

        Looper.loop();

                    ……

        thread.detach();

                       ……

        Slog.i(TAG, "Mainthread of " + name + " is now exiting");

}

1.    Looper.prepareMainLooper();

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



2.    创建ActivityThread 对象。

ActivityThread thread = new ActivityThread();

attach() :ActivityManagerNative.getDefault():它是ActivityManagerService的远程代理对象,(简称)AMS是运行在单独的进程中,在另外的进程中通过ActivityManagerNative.getDefault()就可以与AMS进行通信



如果再具体看mgr.attachApplication(mAppThread);源码,会发现其实就是调用远程binder去传输一个具体的数据而已

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

1)     finalApplicationThread mAppThread = new ApplicationThread();

它会通过binder与 AMS通信,并将AMS的调用,通过下面的H类(也就是Hnalder)将消息发送到消息队列,然后进行相应的操作,如activity的start, stop。

2)     finalH mH = new H();

 private final class H extends Handler

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

publicvoid handleMessage(Message msg) {

            if(DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + msg.what);

            switch(msg.what) {

               case LAUNCH_ACTIVITY: {

                   ActivityClientRecordr = (ActivityClientRecord)msg.obj;

                   r.packageInfo = getPackageInfoNoCheck(

                           r.activityInfo.applicationInfo);

                   handleLaunchActivity(r, null);

               } break;

………

3.    handleLaunchActivity(r, null);

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

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

Activity a = performLaunchActivity(r, customIntent);

4.    performLaunchActivity()

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



通过此方法将上下文与activity进行关联:createBaseContextForActivity

创建一个contextImpl类,每一个context中又有一个关联的activity






而后调用attach方法与WindowManager进行关联

 




然后通过Instrumentation回调:
Instrumentation.callActivityOnCreate(activity, r.state);

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

ApplicationThread

ApplicationThread继承自ApplicationThreadNative,

而ApplicationThreadNative又继承自Binder并实现了IApplicationThread接口。 IApplicationThread继承自IInterface。这是一个很明显的binder结构,

(Android虽然构建在Linux上面,但是在IPC机制方面,没有利用Linux提供IPC机制,而是自己实现了一套轻量级的IPC机制,就是 binder 。)

 

用于和远程端(AMS)进行通信。 IApplicationThread接口定义了对一个程序(linux的进程)操作的接口

具体通信的处理逻辑:onTransact()



ActivityClientRecord是什么

定义在ActivityThread中,客户端Activity的描述类,与Activity息息相关,包含Activity的配置信息



 

ActivityRecord

代表了一个Client端的Activity,记录了Activity的各种属性和管理状态,

ActivityManagerService中做存储Activity记录的类

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android activity