apk程序的运行过程

想必知道framework框架的都知道它的三个主要部分(服务端,客服端,linux驱动)

下面就 结合这三大框架解释一下apk程序的运行过程


     首先,ActivityThread从main()函数开始执行,调用prepareMainLooper()为UI线程创建一个

消息队列(MessageQueue)。


     然后创建一个ActivityThread对象,在ActivityThread的初始化代码中会创建一个H(Handler)

对象和一个ApplicationThread(Binder)对象。其中Binder负责接收远程AmS的IPC调用,接收到调

用后,则通过Handler把消息发送到消息队列中,UI主线程会异步的从消息队列中取出消息并执行相应的

操作,比如start  stop pause等。接着UI主线程调用Looper.loop()方法进入消息循环体,进入后就会不断

的从消息队列中读取并处理消息。


     当ActivityThread接收到AmS发送start某个Activity后,就会创建指定的Activity对象,Activity又

会创建PhoneWindow类——>DecorView类——>创建相应的View或者ViewGroup。创建完成后,Activity

需要把创建好的界面显示到屏幕上,于是调用WindowManager类,后者于是创建一个ViewRoot对象,该对

象实际上创建了ViewRoot类和W类,创建ViewRoot对象以后,WindowManager再调用WmS提供的远程调

用接口完成添加一个窗口并显示到屏幕上。

     接下来,用户开始在程序界面上操作,KeyQ线程不多把用户消息存储到QueueEvent队列中,

InputDispatcherThread线程逐个取出消息,然后调用WmS中的相关函数处理该消息,当WmS发现该消息

属于客户端某个窗口时,就会调用相应的窗口W接口。W类是一个Binder,负责接收WmS的IPC调用,并把调

用消息传递给ViewRoot,ViewRoot再把消息传递给UI主线程ActivityThread,ActivityThread解析该消息并作相

应的处理,在客户端程序中,首先处理消息的是DecorView,如果DecorView不想处理该消息,则可以把该消息

传递给其内部包含的子View或者ViewGroup,如果还没有处理,则传递给PhoneWindow,最后在传递给Activity。




客户端中的线程
包含有Activity的客户端程序至少包含3个线程,(每个Binder对应一个线程)
1、UI主线程
2、ApplicationThread对象 (继承自Binder) (负责AmS的IPC调用)
3、ViewRoot.W对象 (继承自Binder)           (负责WmS的IPC调用)

自定义Thread和UI线程的区别

UI线程是从ActivityThread运行的,已经为该线程创建了消息队列(MessageQueue),因此程序员可以

在Activity中定义Handler对象(在声明Handler对象时,所在线程必须已经创建了MessageQueue),而普通

定义的Thread是一个裸线程,因此不能在Thread中定义Handler对象,从使用场景的角度来看,即不能直接给

Thread对象发消息,但是可以给UI线程发消息。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值