android app入口函数,Android App程序运行过程 ActivityThread.main()------>详解系列(一)...

本文详细探讨了Android程序的入口ActivityThread类的main()函数,包括如何创建消息队列、ActivityThread对象、ApplicationThread及Handler。通过分析ActivityThread的handleMessage方法,展示了Activity的创建过程。此外,还概述了窗口创建和事件分发的流程,强调了关键类如AMS、WMS、WM、ViewRoot、Activity和ActivityThread在其中的角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android程序的入口到底在哪里呢?任何的控制类程序都有一个入口,而Android基于java语言的,因此java程序的入口必须在某一个类的静态成员函数main();而在Android程序main函数在类ActivityThread中,看看ActivityThread.main()做了什么?

public final class ActivityThread {

......

public static void main(String[] args) {

.....

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

ActivityThread thread = new ActivityThread();//创建ActivityThread对象

thread.attach(false);

if (sMainThreadHandler == null) {

sMainThreadHandler = thread.getHandler();//获取Handler对象

}

......

}

final ApplicationThread mAppThread = new ApplicationThread();

final Looper mLooper = Looper.myLooper();

final H mH = new H()

}

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

然后创建ActivityThread对象,在ActivityThread对象创建的同时,创建ApplicationThread对象,和Handler对象。

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

Handler对象作用: 负责发送消息到消息队列。UI线程会异步的从消息队列取出消息并做相应的操作。

当有了这两个对象后,就可以接收AMS发送来的远程消息(start,stop,pause)。并且可以回调回ActivityThread

当ApplicationThread对象接收到AMS发送start某个 Activity,通过Handler发送消息到消息队列,ActivityThread.handleMessage取出相应的消息,就会创建指定的Activity。Activity是怎样被创建出来的?去看看ActivityThread.handleMessage做了什么?

public final class ActivityThread {

......

public void handleMessage(Message msg) {

switch (msg.what) {

case LAUNCH_ACTIVITY: {

......

handleLaunchActivity(r, null);

......

break;

}

}

}

}

当AMS要start某个Activity,回调到ActivityThread.handleMessage中,调用handleLaunchActivity函数。进入handleLaunchActivity函数看看。

public final class ActivityThread {

......

Activity a = performLaunchActivity(r, customIntent);

......

if (a != null) {

......

handleResumeActivity(r.token, false, r.isForward,

!r.activity.mFinished && !r.startsNotResumed);

......

}

.......

}

}

进去一看调用了performLaunchActivity函数返回Activity,想必在这个函数中创建Activity的,再去看看performLaunchActivity函数。

public final class ActivityThread {

......

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

......

Activity activity = null;

......

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

activity = mInstrumentation.newActivity(

cl, component.getClassName(), r.intent);

......

return activity;

}

}

在performLaunchActivity函数可以看出,通过类加载器在mInstrumentation.newActivity函数中创建出Activity。就这样Activity就创建出来了。

(1)当Activity被创建出来后,又会创建相关的类,创建的流程为:

contextImpl类–>PhoneWindow类——->WindowManagerImpl类—->DecorView类—->相应的VIew后ViewGroup(layout.xml布局文件)。

创建完后,Activity需要把创建好的界面显示到屏幕上,调用的流程为:

WindowManager类—->ViewRoot类—->WMS远程接口,这样就完成一个窗口添加到屏幕上。

由(1)可以得出Android应用程序窗口的大概模型:

0818b9ca8b590ca3270a3433284dd417.png

当窗口添加到屏幕上后接下来,用户开始在程序界面上操作,KeyQ线程把这些消息保存到消息队列中,而InputDipatchThread线程逐个的取出消息,然后调用WMS的相应消息处理函数,WMS判断该消息是属于哪一个窗口的,然后封装好,发送给相应的ViewRoot中的W接口。

事件分发的过程:

WMS—–>ViewRoot.W接口—->ViewRoot类—>ActivityThread —->PhoneWindon.DecorView—->Activity—–>PhoneWindow—->PhoneWIndow.Decorview—>ViewGroup—->子view。

由上面流程可知,app程序运行的大概的整体流程可总结为两点:

创建窗口(UI)显示在屏幕上。—–>a

接收用户消息(按键,触摸) 发给相应的窗口做相应的处理。—->b

对于a:创建Activity对象之后会继续创建ContextImpl类,PhoneWindow类,DecorView类,WindowManagerImpl类,ViewRoot类,layout.xml(布局文件),接下来的文章会根据源码分析这些对象的产生和这些类的继承关系,类的作用,这些类之间的关系。

由(1)得出Android应用程序窗口模型,换种理解:

Android应用程序窗口 = Activity + PhoneWindow + DecorView;—->c

DecorView = TitleView + contentView(layout.xml布局文件);—–>d

这里的等于号并不是真正意思的等于,这里描述的是一种大概的意思,对于c而言,Android应用程序窗口模型 描述为,大概 由Activity + PhoneWindow +DecorView组成,而DecorView 大概由TitleView + ContentView(layout.xml布局文件)组成。只是大概的由这些组成。Android应用程序窗口的组成 还可以 包括 Dialog, PopupWIndow。

而d 就是我们要学习的重点,简称Android应用程序窗口视图;添加窗口到屏幕上,其实最重要的就是把我们的布局文件绘制上去,而这就是我们常说的View的绘制。

经过这样分析,又可以把app程序运行过程的两个重要点可以总结为:

View的绘制;

用户消息事件的分发:

这里出现了几个很重要的类,AMS,WMS,WM,ViewRoot,Activity,ActivityThread,它们之间的关系:

0818b9ca8b590ca3270a3433284dd417.png

整个流程可以总结为:

0818b9ca8b590ca3270a3433284dd417.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值