- 浏览: 3558651 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (1491)
- Hibernate (28)
- spring (37)
- struts2 (19)
- jsp (12)
- servlet (2)
- mysql (24)
- tomcat (3)
- weblogic (1)
- ajax (36)
- jquery (47)
- html (43)
- JS (32)
- ibatis (0)
- DWR (3)
- EXTJS (43)
- Linux (15)
- Maven (3)
- python (8)
- 其他 (8)
- JAVASE (6)
- java javase string (0)
- JAVA 语法 (3)
- juddiv3 (15)
- Mule (1)
- jquery easyui (2)
- mule esb (1)
- java (644)
- log4j (4)
- weka (12)
- android (257)
- web services (4)
- PHP (1)
- 算法 (18)
- 数据结构 算法 (7)
- 数据挖掘 (4)
- 期刊 (6)
- 面试 (5)
- C++ (1)
- 论文 (10)
- 工作 (1)
- 数据结构 (6)
- JAVA配置 (1)
- JAVA垃圾回收 (2)
- SVM (13)
- web st (1)
- jvm (7)
- weka libsvm (1)
- weka屈伟 (1)
- job (2)
- 排序 算法 面试 (3)
- spss (2)
- 搜索引擎 (6)
- java 爬虫 (6)
- 分布式 (1)
- data ming (1)
- eclipse (6)
- 正则表达式 (1)
- 分词器 (2)
- 张孝祥 (1)
- solr (3)
- nutch (1)
- 爬虫 (4)
- lucene (3)
- 狗日的腾讯 (1)
- 我的收藏网址 (13)
- 网络 (1)
- java 数据结构 (22)
- ACM (7)
- jboss (0)
- 大纸 (10)
- maven2 (0)
- elipse (0)
- SVN使用 (2)
- office (1)
- .net (14)
- extjs4 (2)
- zhaopin (0)
- C (2)
- spring mvc (5)
- JPA (9)
- iphone (3)
- css (3)
- 前端框架 (2)
- jui (1)
- dwz (1)
- joomla (1)
- im (1)
- web (2)
- 1 (0)
- 移动UI (1)
- java (1)
- jsoup (1)
- 管理模板 (2)
- javajava (1)
- kali (7)
- 单片机 (1)
- 嵌入式 (1)
- mybatis (2)
- layui (7)
- asp (12)
- asp.net (1)
- sql (1)
- c# (4)
- andorid (1)
- 地价 (1)
- yihuo (1)
- oracle (1)
最新评论
-
endual:
https://blog.csdn.net/chenxbxh2 ...
IE6 bug -
ice86rain:
你好,ES跑起来了吗?我的在tomcat启动时卡在这里Hibe ...
ES架构技术介绍 -
TopLongMan:
...
java public ,protect,friendly,private的方法权限(转) -
贝塔ZQ:
java实现操作word中的表格内容,用插件实现的话,可以试试 ...
java 读取 doc poi读取word中的表格(转) -
ysj570440569:
Maven多模块spring + springMVC + JP ...
Spring+SpringMVC+JPA
Android Framework内核之旅
6.1 Framework框架
Framework定义了客户端组件和服务端组件功能及接口。以下阐述中,“应用程序”一般是指“.apk”程序。
框架中包含三个主要部分,分别为服务端、客户端和Linux驱动。
6.1.1 服务端
服务端主要包含两个重要类,分别是WindowManagerService(WmS)和ActivityManagerService
(AmS)。WmS的作用是为所有的应用程序分配窗口,并管理这些窗口。包括分配窗口的大小,调节各窗口的叠放次序,隐藏或者显示窗口。AmS的作用是管理所有应用程序中的Activity。
除此之外,在服务端还包括两个消息处理类。
— KeyQ类:该类为WmS的内部类,继承于KeyInputQueue类,KeyQ对象一旦创建,就立即启动一个线程,该线程会不断地读取用户的UI操作消息,比如按键、触摸屏、trackball、鼠标等,并把这些消息放到一个消息队列QueueEvent类中。
— InputDispatcherThread类:该类的对象一旦创建,也会立即启动一个线程,该线程会不断地从QueueEvent中取出用户消息,并进行一定的过滤,过滤后,再将这些消息发送给当前活动的客户端程序中。
6.1.2 客户端
客户端主要包括以下重要类。
— ActivityThread类:该类为应用程序的主线程类,所有的APK程序都有且仅有一个ActivityThread类,程序的入口为该类中的static main()函数。
— Activity类:该类为APK程序的一个最小运行单元,一个APK程序中可以包含多个Activity对象,ActivityThread主类会根据用户操作选择运行哪个Activity对象。
— PhoneWindow类:该类继承于Window类,同时,PhoneWindow类内部包含了一个DecorView对象。简而言之,PhoneWindow是把一个FrameLayout进行了一定的包装,并提供了一组通用的窗口操作接口。
— Window类:该类提供了一组通用的窗口(Window)操作API,这里的窗口仅仅是程序层面上的,WmS所管理的窗口并不是Window类,而是一个View或者ViewGroup类,一般就是指DecorView类,即一个DecorView就是WmS所管理的一个窗口。Window是一个abstract类型。
— DecorView类:该类是一个FrameLayout的子类,并且是PhoneWindow中的一个内部类。Decor的英文是Decoration,即“修饰”的意思,DecorView就是对普通的FrameLayout进行了一定的修饰,比如添加一个通用的Title bar,并响应特定的按键消息等。
— ViewRoot类:WmS管理客户端窗口时,需要通知客户端进行某种操作,这些都是通过异步消息完成的,实现的方式就是使用Handler,ViewRoot就是继承于Handler,其作用主要是接收WmS的通知。
— W类:该类继承于Binder,并且是ViewRoot的一个内部类。
— WindowManager类:客户端要申请创建一个窗口,而具体创建窗口的任务是由WmS完成的,WindowManager类就像是一个部门经理,谁有什么需求就告诉它,由它和WmS进行交互,客户端不能直接和WmS进行交互。
6.1.3 Linux驱动
Linux驱动和Framework相关的主要包含两部分,分别是SurfaceFlingger(SF)和Binder。每一个窗口都对应一个Surface,SF驱动的作用是把各个Surface显示在同一个屏幕上。
Binder驱动的作用是提供跨进程的消息传递。
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。
6.3 客户端中的线程
在多任务操作系统中,任何程序都运行在线程之中。系统首先会为客户端程序分配一个线程,然后该线程从程序的入口处开始执行。那么,请思考以下问题。
— Android APK程序中都有哪些线程?
— 什么是UI线程?
— 程序中自定义Thread和UI线程的区别是什么?
首先,很明确地讲,包含有Activity的客户端程序至少包含三个线程,如图6-1所示。每个Binder对象都对应一个线程,Activity启动后会创建一个ViewRoot.W对象,同时ActivityThread会创建一个ApplicationThread对象,这两个对象都继承于Binder,因此会启动两个线程,负责接收Linux Binder驱动发送IPC调用。最后一个主要线程也就是程序本身所在的线程,也叫做用户交互(UI)线程,因为所有的处理用户消息,以及绘制界面的工作都在该线程中完成。
为了验证这一点,可以在Eclipse中新建一个Hello Android的程序,然后以debug的方式运行,在debug窗口中会看到如图6-1所示的界面。
自定义Thread和UI线程的区别在于,UI线程是从ActivityThread运行的,在该类中的main()方法中,已经使用Looper.prepareMainLooper()为该线程添加了Looper对象,即已经为该线程创建了消息队列(MessageQueue),因此,程序员才可以在Activity中定义Handler对象(因为声明Handler对象时,所在的线程必须已经创建了MessageQueue)。而普通的自定义Thread是一个裸线程,因此,不能直接在Thread中定义Handler对象,从使用场景的角度讲,即不能直接给Thread对象发消息,但是却可以给UI线程发消息。
发表评论
-
android离线
2019-11-04 21:25 292https://www.jianshu.com/p/fdfc4 ... -
android 异步更新
2015-07-11 22:42 1495http://www.apkbus.com/forum.php ... -
仿微米
2015-06-26 10:22 0http://www.javaapk.com/source/4 ... -
仿微信
2015-06-26 10:21 1913http://www.javaapk.com/source/1 ... -
网易客户端
2015-06-26 10:20 1597http://www.javaapk.com/source/4 ... -
仿朋友圈
2015-06-26 10:18 1696http://www.javaapk.com/source/8 ... -
仿朋友圈
2015-06-26 10:13 1830http://www.eoeandroid.com/threa ... -
全国ABC查询
2015-06-26 10:07 1359IM 功能 环信云 信息统计 Umeng 分享Umeng 更新 ... -
android 判断网络
2015-06-25 16:00 1258http://www.cnblogs.com/renqingp ... -
android 多彩表格
2015-05-31 16:06 1467http://blog.csdn.net/conowen/ar ... -
android socket
2015-05-31 16:01 1638http://blog.csdn.net/conowen/ar ... -
微信播放语音3
2015-02-25 12:00 1421http://download.csdn.net/detail ... -
微信语音播放2
2015-02-25 11:57 1345http://download.csdn.net/detail ... -
微信语音播放
2015-02-25 11:56 1693http://www.apkbus.com/android-1 ... -
超强的资料整合
2015-01-05 11:04 1217http://zz563143188.iteye.com/bl ... -
最强开发资源平台大合集
2015-01-04 14:50 1880程序员代码应用开发平 ... -
Android-Universal-Image-Loader 图片异步加载类库的使用(超详细配置)
2014-09-04 15:45 1370http://blog.csdn.net/vipzjyno1/ ... -
android应用推广
2014-09-03 23:25 1307应用推广不必愁,有米 ... -
android 图片异步加载
2014-09-03 16:47 1126http://www.csdn.net/article/201 ... -
android hander的使用
2014-09-02 23:46 1355http://www.cnblogs.com/xiaoran1 ...
相关推荐
根据提供的标题、描述和部分上下文内容,“Android平台开发之旅(第2版)”这本书主要聚焦于Android平台的应用程序开发。虽然提供的部分内容并没有直接涉及到具体的Android开发知识点,但我们可以基于书名和主题,来...
在Android开发之旅中,深入理解Android系统的架构是至关重要的。本篇主要探讨Android系统架构的五个核心组成部分:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。 1. **Linux ...
【Android开发之旅(2): Android架构】 Android架构是理解Android操作系统基础的重要环节,它由五个主要部分构成:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。在深入探讨每个...
Android开发之旅的第二篇章主要探讨的是Android系统的架构,这一部分对于初学者来说至关重要,因为它提供了对Android系统全貌的理解,避免在学习过程中迷失方向。Android架构由五个主要部分构成: 1. **Linux ...
Android系统架构主要分为五个部分:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。本文将逐一解析这些组成部分。 1. Linux Kernel: Android系统的基础是Linux内核,它提供了...
在本篇中,我们将深入探讨Android系统的五个主要组成部分:Linux Kernel、Android Runtime、Libraries、Application Framework和Applications。 首先,Linux Kernel是Android的基础,它提供了核心系统服务,如安全...
罗升阳,2007年毕业于浙江大学计算机系,2010年毕业于上海交通大学计算机系,在国内知名IT技术社区CSDN上发表了数十篇高质量的Android系统原创性文章,并且开设博客专栏--《老罗的Android之旅。 在内容上,本书结合...
总结,Android 4.4源码的学习是一次深入操作系统底层的探索之旅,它涵盖了操作系统、软件工程、硬件交互等多个领域。通过解析和理解源码,开发者不仅可以提升技术水平,还能为优化应用性能、开发定制系统提供有力...
ndroid系统源代码情景分析的评论 ...在国内知名IT技术社区CSDN上发表了数十篇高质量的Android系统原创性文章,并且开设博客专栏--《老罗的Android之旅》,积极与网友互动,深受大家喜爱,访问量一直居于前茅。
Android 2.2,也称为Froyo(冻酸奶),是Android操作系统的一个重要版本,它在2010年发布,带来了许多性能提升和新功能。...这是一次宝贵的探索之旅,可以为Android开发者的技能树添加重要的分支。
在Android开发领域,`framework_intermediates`是一个关键的概念,它涉及到Android系统的内核框架以及开发者如何通过系统内部机制来扩展功能。这个概念通常与构建过程、系统库和反射技术密切相关。下面将详细阐述`...
深入研究Android 4.0源码对于开发者来说是一次宝贵的探索之旅,不仅可以提升对Android操作系统的理解,也有助于进行系统级别的优化和定制,以及开发更加高效、稳定的Android应用。同时,对于想要从事Android系统开发...
Android系统源代码情景分析的评论 ...在国内知名IT技术社区CSDN上发表了数十篇高质量的Android系统原创性文章,并且开设博客专栏--《老罗的Android之旅》,积极与网友互动,深受大家喜爱,访问量一直居于前茅。
Android开发环境搭建是每个想...遵循这些步骤,开发者可以快速地建立起一个完整的Android开发环境,开始他们的Android编程之旅。对于初学者来说,这是一份非常实用的指南,有助于避免在环境搭建过程中遇到的常见问题。
在Windows操作系统中搭建Android应用程序开发环境是一项至关重要的任务,尤其对于初学...这个过程虽然可能稍显复杂,但是一旦完成,就可以开启Android应用开发之旅,利用强大的Android框架和库创造无限可能的应用程序。
通过这些基础知识,你就可以开始你的Android开发之旅了。从创建第一个“Hello Android”项目开始,逐步掌握Android应用程序的基本结构、布局设计、用户界面创建、数据存储、网络通信、多媒体处理以及传感器应用等...