当前位置:首页 > 开发 > 移动开发 > 正文

(1)ActivityThread分析

发表于: 2015-11-13   作者:互联网   来源:转载   浏览次数:
摘要: 1. 入口。 曾经一直都说Activity的人口是onCreate方法。事实上android上一个应用的入口,应该是ActivityThread。和普通的java类一样,入口是一个main方法。 public static final void main(String[] args) {         SamplingPr

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方法了,就进入了大多数应用开发的入口了。


(1)ActivityThread分析

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
ActivityThead,ActivityManagerService,Activity <<Android内核剖析>>中有一章节专门
一、检查点 1、自动变量检查: 返回自动变量(局部变量)指针 2、越界检查: 数组越界返回自动变量
1.多元线性回归 1 %数据的输入 2 x = [143 145 146 147 149 150 153 154 155 156 157 158 159 160 1
将zookeeper启动; bin/zkServer.sh start 图1 打开jdk:bin\jconsole.exe 图2 在Mbean中查看多了两
对于Java程序来说,JVM是一台完整的机器,可是对于真正的机器或OS来说,JVM只是其中一个进程而已。作
这是本人对于Dubbo源码分析的系列一,没有说明Dubbo是什么,不清楚请先了解,此处只是为了给自己做个
趁着最近比较闲,,花了几天时间粗略看了下Mina的源代码,把最近的心得写出来。一来,怕自己以后忘了
对于Java程序来说,JVM是一台完整的机器,可是对于真正的机器或OS来说,JVM只是其中一个进程而已。作
水平有限,如有不足请留言交流,互相提高,谢谢!转载请提供出处,http://treblesoftware.iteye.com/
package irdc.ex03_20; import android.app.Activity; import android.app.AlertDialog; import and
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号