Chinaunix首页 | 论坛 | 博客
  • 博客访问: 840600
  • 博文数量: 190
  • 博客积分: 2991
  • 博客等级: 少校
  • 技术积分: 2400
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-24 18:11
文章分类

全部博文(190)

文章存档

2015年(3)

2014年(1)

2013年(65)

2012年(121)

我的朋友

分类: Android平台

2013-03-01 12:25:07

1. 入口 
以前一直都说Activity的人口是onCreate方法。其实android上一个应用的入口,应该是ActivityThread。和普通的java类一样,入口是一个main方法。 
public static final void main(String[] args) { 
        SamplingProfilerIntegration.start(); 
       …… 
        Looper.prepareMainLooper(); 
        if (sMainThreadHandler == null) { 
            sMainThreadHandler = new Handler(); 
        } 
        ActivityThread thread = new ActivityThread(); 
        thread.attach(false); 
       …… 
        Looper.loop(); 
       …… 
        thread.detach(); 
        …… 
        Slog.i(TAG, "Main thread of " + name + " is now exiting"); 
    } 
下面仔细分析一下这个main方法。 

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

3. sMainThreadHandler = new Handler(); 
创建一个Handler。 

4. ActivityThread thread = new ActivityThread(); 
创建ActivityThread 对象。 
ActivityThread 有几个比较重要的成员变量,会在创建ActivityThread对象时初始化。 
(1)final ApplicationThread mAppThread = new ApplicationThread(); 

ApplicationThread继承自ApplicationThreadNative, 而ApplicationThreadNative又继承自Binder并实现了IApplicationThread接口。IApplicationThread继承自IInterface。这是一个很明显的binder结构,用于于Ams通信。IApplicationThread接口定义了对一个程序(linux的进程)操作的接口。ApplicationThread通过binder与Ams通信,并将Ams的调用,通过下面的H类(也就是Hnalder)将消息发送到消息队列,然后进行相应的操作,入activity的start, stop。
(2)final H mH = new H(); 

          private final class H extends Handler 
mH负责处理ApplicationThread发送到消息队列的消息,例如: 
public void handleMessage(Message msg) { 
            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + msg.what); 
            switch (msg.what) { 
                case LAUNCH_ACTIVITY: { 
                    ActivityClientRecord r = (ActivityClientRecord)msg.obj; 

                    r.packageInfo = getPackageInfoNoCheck( 
                            r.activityInfo.applicationInfo); 
                    handleLaunchActivity(r, null); 
                } break; 

5. handleLaunchActivity(r, null); 
从名字中就可以看出,这里就将进行启动activity的工作了。 
方法中主要调用了这一句: 
Activity a = performLaunchActivity(r, customIntent); 

6. performLaunchActivity() 
进行了一些初始化和赋值操作后,创建activity。 
activity = mInstrumentation.newActivity( 
                    cl, component.getClassName(), r.intent); 
然后调用: 
mInstrumentation.callActivityOnCreate(activity, r.state); 

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

原文链接:

阅读(1041) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~