1. 写文章之前的声明:首先,文章写上原创标签是有点牵强的,本质上是读书笔记。上周周六的时候参加了博文视点的一个作者交流会,编辑送我了一本android内核方面的书《Android内核剖析》,拿回来读了一下,非常的棒。首先作者知识丰富,对android认识很到位,水平比很多其他Android编者高不少。其次,水平高正常,写书的吗,都有点水平,但是作者写书的时候,非常用心,语言通俗易懂,干脆。这点就非常的难了。自己写书的时候就有感觉,知道是一回事,表达出来,表达的清楚,又是另外一回事。最后,系列文章适合对android有一定认识的朋友,没有android基础的,不要看,浪费时间。
2.写这些文章的意义:书中有大量的内核分析,其实对于应用层开发人员来说,这些东西用不上,我仅仅是把做应用程序开发用的上的东西抽出来,然后加一些自己的东西。
Android框架可以大致分为三块:服务端,客户端,linux驱动,下面一一解释。
服务端:
罗嗦两句,服务端是相对于客户端来说的,就是给客户端提供服务的模块,不是什么真正意义上的服务器。举个简单的例子,现在的J2EE项目都在讲分层,那么下一层可以看到上一层的服务端,而上一层可以看到下一层的客户端。服务端有两个重要的类:WindowManagerService和ActivityManagerService,通过名字,我们就知道它们是干什么的了,一个是为窗口调度服务,另一个是管理所有的Activity。
除此之外,服务端还包括两个消息处理类,KeyQ和InputDispatcherThread,keyQ主要工作是接受用户输入,并把输入存放在一个消息队列中。显而易见的,InputDispatcherThread的作用就是不断消费消息队列中的用户事件,然后经过过滤,发送给当前活动的客户端。
客户端:
客户端的情况就更复杂一些,大家都是做“客户端”的,应该明白哇,嘿嘿。下面就介绍一些平时用得上的或者可以了解的。
ActivityThread:该类是应用程序的主线程类,也就是UI线程类,所有的APK程序都有且仅有一个ActivityThread类,程序的入口为该类的static main()。
Activity:这个就不解释了,ActivityThread会根据用户操作选择运行合适的Activity对象。
Windows:该类提供了一组通用的窗口操作API。
WindowManager:当创建窗口的时候,由它和服务端的WindowManagerService完成。
linux驱动:
这个就和我们应用程序员不搭嘎了,就不写了。
几个常见的问题:
1.UI线程和普通线程最大的区别是什么:UI线程是系统创建的,在创建的时候,设计成了异步消息处理线程。具备处理消息的能力,可以直接使用Handler给UI线程发送消息。而普通线程,如果自己不添加Looper对象,并启动消息处理循环,那么,不具备处理消息的能力,也就是不能使用Handler给该线程发送消息。
2.Activity之间如何传递消息:
A.一般情况下,设备上只会有一个Activity在运行,因此,多个Activity之间传递数据不是必需的。如果某个Activity需要在停止后还能处理数据,那么这个Activity设计成为Service或者Thread更加合适。
B.在一般的应用程序架构下,不同组件传递数据的通用方式有两种:可以先实例化某个类,获得该类的引用,当其他类需要该类对象的内部数据时,就可以直接通过该引用完成。也可以通过第三方,比如全局变量,或者一个单独的类来完成。
C.然而,在创建Activity的时候,是系统完成的,我们不可能获得它的引用。所以第一种解决办法不可行。
D.当然,第二种是肯定可以完成的,android为了规范,特别给我们提供了一个全局的对象Application,我们可以通过它来完成多个Activity之间的数据传递。
E.其实,在android中,Activity之间传递数据,最常用的是Intent
F.另外,从设计理念上,Android认为,Preference,文件,数据库都是理想的传递数据的工具