Android之ActivityThread

ActivityThread

我们都知道android应用程序有一个主activity作为应用的页面启动入口,通常这个activity在manifest我们声明为launcher,但是这是整个apk的启动入口吗,其实不然,类似于java的main方法,android中也有一个main方法,它才是应用的最开始入口,而这个main方法就在ActivityThread类中。

关于ActivityThread的几个理解点

1.它是一个final类所以不能被继承。

2.(1)它不是一个线程,但是它管理着应用程序主线程的执行,也就是相当于java中的main方法,并且根据AMS的要求(通过IApplication Threada接口,AMS为client,ActivityThread.ApplicationThread为server,复制调度Activities,broadcasts和其他的操作。

(2)在android系统中默认的所有activity,service,broadCast都运行在一个进程当中,并由此进程的[主进程]负责执行。

3.android应用程序的载体是apk文件,本质上是一个资源和组件的容器,apk和其他可执行文件的区别就是每个可执行的文件是运行在一个进程中,但是apk文件可能运行在一个单独的进程也可以和其他的apk运行在一个进程中,可以理解为android系统的设计理念就是弱化进程,而用组件的思想来替代。

public final class ActivityThread{

......

public static void main(String [] args){

  ......

  Looper.prepareMainLooper;//创建MessageQueue的消息队列

  ActivityThread thread = new ActivityThread();

  thread.attach(false);

  if(sMainThreadHandler == null){

      sMainThreadHandler = thread.getHandler();
  }

 ......

 }


 final ApplicationThread mAppThread = new ApplicationThread();

 final Looper  mLooper = Looper.myLooper();

 final H mH = new H();

}

程序首先在main()函数执行,调用prepareMainLooper在主线程中创建一个消息队列(MessageQueue)。

然后创建ActivityThread对象,ApplicationThread对象,Handler对象。

ApplicationThread:它是Binder对象,负责接收远程的AMS的IPC调用。

Hander:复制发送消息到消息队列,UI线程会异步的从消息队列中取消息并做相应的操作。

当有了这两个对象之后我们可以接收AMS发送来的远程消息,(start,stop,pause)并且可以毁掉到ActivityThread,当ApplicationThread对象接收到AMSf发送start某个activity,就通过handler异步发送消息,ActivityThread.handleMessage取出相应的消息,就会创建指定的activity。

public void handleMessage(Message msg)
{
     switch(msg.what)
     {
        case LAUNCH_ACTIVITY:

     ......
         handleLaunchActivity(r,null);

     ......

     break;
   }
 }

进入到handleLaunchActivity中:

Activity  a = performLaunchActivity(r,cumstomIntent);

if(a != null){
 ......

 handleResumeActivity();
 }

进入到performLaunchActivity返回了Activity对象,看看Activity是怎么被创建的:

private Activity performLuanchActivity(ActivityClientRecord r,Intent customIntent){

  ......

  Activity activity = null;

  ......

   java.lang.ClassLoader cl = r.packageInfo.getClassLoader();

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

   return activity;

   }


当activty被创建了之后,又会创建相关的类:

contextImlp---->phoneWindow--->WindowManageImpl---->DecorView---->相应的View,ViewGroup(xml布局文件);

创建完毕之后需要把它显示在屏幕上:

WindowManager------>ViewRoot------>WMS远程接口这样一个窗口就被加到屏幕上

因此我们可以得到android应用程序的窗口模型:

Android应用程序窗口=Activity+PhoneWindow+DecorView;
DecorView = TitleView + contentView;(View的绘制)

####至此我们可以得出的结论android应用程序的运行主要包括:

1.View的绘制

2.用户消息事件的分发