在上一篇中我们查看了QQ的apk源文件中的布局结构,并仿照QQ完成了我们第一个应用的界面,详细请看《Android菜鸟的成长笔记》专栏。这一篇中我们来具体看看这个界面到底是怎么呈现出来的,具体的原理是什么等问题,下面我们将一步一步的解开留在我们心中的谜团。
有的朋友可能会产生这样的疑问为什么几句代码就能显示这样好看的界面?
其实能让这个界面显示的如此丰富多彩,一半功劳在我们编写的那几句代码,还有一半功劳在我们尊敬的google工程师和伟大的linux之父Linus Torvalds。下面我们进到google为我们提供的Android开发人员的官网。http://developer.android.com/index.html
主要菜单如上图所示:
Design(设计):关于Android界面设计的标准和文档。
Develop(开发):Android开发人员相关的API、工具、例子等。
Distribute(分类):分类的目录
下面来重点看一下Develop菜单下的子菜单:
Training(培训):入门指导
API Guide(API指南):API文档
Reference(参考):所有版本API对比
Tools(工具):工具及下载
Google Services(Google服务):Google的公共服务,比如Google地图
Samples(例子):一些Android开发例子及源代码
在该网站上有关于Android体系架构图,如下图所示:
从上图可以看出Android整个系统的架构分为四层:
(1)Linux Kernel (Linux 内核)
Android是基于Linux2.6内核,其核心系统服务如安全性、内存管理、进程管理、网路协议以及驱动模型都依赖于Linux内核。感谢Linus Torvalds创造出如此伟大的系统
(2)Libraries(系统运行库层)
从图中可以看出来,系统运行库层可分为两部分,分别是系统库和Android运行时。
【1】系统库:
系统库是应用程序框架的骨骼,支撑这整个应用程序的运行,是连接应用程序框架与Linux内核层的重要纽带。主要包括以下几个
Surface Manager: 执行多个应用程序的时候,负责管理显示与存取操作间的互动,另外也负责2D绘图与3D绘图进行显示合成。
Media Framework:多媒体库。
SQLite:小型关系型数据库引擎。
OpenGL|ES:3D绘图函数库。
FreeType:提供点阵字与向量字的描绘与显示。
WebKit:网页浏览器的引擎。
SGL:底层2D图形渲染引擎。
SSL:通信相关引擎。
Libc:标准c系统函数库。
【2】Android运行时
Android运行时和JRE有点类似。JRE包括JVM和其他功能函数库;而这里的Android运行时则包括Dalvik虚拟机和核心库集。
每个Android应用程序都运行在单独的Dalvik虚拟机内,也就是说Android应用程序对应一条Dalvik进程,不就是虚拟机吗?这个我在Java中学过。要注意的是:这个和Java中的虚拟机不同,不同点如下:
JVM运行的是java字节码文件,而Dalvik运行的是专有的dex文件。
JVM基于寄存器实现,Dalvik基于栈实现,所以Dalvik的速度是很快的。
(3)应用程序框架层
应用程序框架层是我们从事Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能的,该层简化了组件的重用,开发人员可以直接使用其提 供的组件来进行快速的应用程序开发,也可以通过继承而实现个性化的拓展。下面介绍一下常用的应用程序框架。
Activity Manager(活动管理器):管理各个应用程序生命周期以及通常的导航回退功能。
Window Manager(窗口管理器):管理所有窗口程序。
Content Provider(内容提供者):使不同应用程序之间可以存取或者分享数据。
View System(视图系统):构建应用程序的基本组件。
Notification Manager(通告管理器):使得应用程序可以在状态栏中显示自定义的提示信息。
Package Manager(包管理器):Android系统内的程序管理。
Telephony Manager(电话管理器):管理所有的移动设备功能。
Resource Manager(资源管理器):提供应用程序使用的各种非代码资源,如本地化字符串、图片、布局文件、颜色文件等。
Location Manager(位置管理器):提供位置服务。
XMPP Service(XMPP服务):提供Google Talk服务。
(4)应用程序层:
Android平台不仅仅是个操作系统,也包含了许多应用程序,诸如SMS短信客户端程序、电话拨号程序、图片浏览器、Web浏览器等应用程序。这些应用程序都是用Java语言编写的,并且并且这些应用程序都是可以被开发人员开发的其他应用程序所替换,这点不同于其他手机操作系统固化在系统内部的系统软件,更加灵活和个 性化。
通过上面的介绍这个问题的答案就很明显了,其实android系统为我们在底层做了很多工作。下面我们再来看看我们前面写的代码:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
MainActivity是我们程序的入口,继承与Activity并重写了Activity的onCreate(Bundle saveInstanceState)方法,下面我们来看看Activity中的setContentView方法和onCreate方法。
打开Android系统的源代码(后期将会专门写关于Android源代码下载方法的博客)
public void setContentView(int layoutResID) {
getWindow().setContentView(layoutResID);
}
可以看到Activity的setContentView方法中调用了getWindow()方法返回对象的setContentView方法,下面再看看getWindow()方法返回的对象是什么
public Window getWindow() {
return mWindow;
}
private Window mWindow;
实际上我们底层调用的是Window对象的setContentView()方法,下面我们先来看看Activity的另一个方法onCreate()
protected void onCreate(Bundle savedInstanceState) {
mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
com.android.internal.R.styleable.Window_windowNoDisplay, false);
mCalled = true;
}
我们看到这个调用了Window对象的getWindowStyle()方法
那么这个Window到底是个什么东西呢?
其实Window对象就是描述我们Android手机具体窗体的对象,由此可见,Activity不只是一个高度抽象的UI组件,他的具体UI实现是由一系列对象来实现的。
我们可以到官方的API文档中进行查看:http://developer.android.com/reference/android/view/Window.html#setContentView(android.view.View)
Abstract base class for a top-level window look and behavior policy. An instance of this class should be used as the top-level view added to the window manager. It provides standard UI policies such as a background, title area, default key processing, etc.
The only existing implementation of this abstract class is android.policy.PhoneWindow, which you should instantiate when needing a Window. Eventually that class will be refactored and a factory method added for creating Window instances without knowing about
a particular implementation.
这个是官网上对这个类的介绍,大意如下:
该类是最顶层外观和行为策略的抽象类。这个类的实现类的实例应该添加到窗口管理器的最顶层,该类提供了标准的UI组件接口,这个接口的唯一实现类是PhoneWindow类,好的我们先来看看PhoneWindow类的源代码。
@Override
public void setContentView(int layoutResID) {
if (mContentParent == null) {
installDecor();
} else {
mContentParent.removeAllViews();
}
mLayoutInflater.inflate(layoutResID, mContentParent);
final Callback cb = getCallback();
if (cb != null) {
cb.onContentChanged();
}
}
private ViewGroup mContentParent;
private LayoutInflater mLayoutInflater;
可以看到实际底层是一个ViewGroup对象,传给setContentView()方法的资源ID通过资源加载器LayoutInflater装载成View对象添加到ViewGroup组件中。
再看看getWindowStyle方法
从官方API上我们可以看到getWindowStyle()方法实际上是返回一个主题。
好了,我们先暂且记下PhoneWindow这个类和上面的分析,后面将会详细介绍。
分享到:
相关推荐
菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华菜鸟成长手册2009——CPU-内存-硬盘篇 - 硬件知识精华...
Android菜鸟成长笔记(十三)——碎片(一)一篇完整源码 地址:http://blog.csdn.net/zenail501129/article/details/25473829 保证代码正确。
Android菜鸟的成长笔记——Spinner 省市县三级地址选择-附件资源
php程序员菜鸟成长手记——php入门教程
菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(一)——数据 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(二)—— 介绍及分词 菜鸟笔记-DuReader阅读理解基线模型代码阅读笔记(三)—— 预处理 菜鸟笔记-...
菜鸟也玩LINUX——brk()漏洞重提.pdf
菜鸟构建个人网站——“纯真年代”建站全过程(五).pdf
嵌入式系统开发之道菜鸟成长日志与项目经理的私房菜pdf文件,非扫描版哦, 对开发者还是有些帮助的。
菜鸟先飞笔记——金融生学神经网络keras一、下载Anaconda二、安装三 、准备工作四、安装keras五、试运行 一、下载Anaconda 下载链接:清华镜像。按照自己系统选择最新版的anaconda3。 二、安装 默认安装,可以自己...
CCNA菜鸟笔记2006修正版.pdf CCNA菜鸟笔记2006修正版.pdf CCNA菜鸟笔记2006修正版.pdf
这个菜鸟的笔记里面没有谈到JavaScript中的对象,比如说时间对象和字符串对象,这些内容可以在“菜鸟的JavaScript对象笔记”中找到。不过因为小菜鸟个人认为HTML DOM比其它的JavaScript对象更常用一些(不过这可不...
小艾是一位新入职的菜鸟测试工作者,他面对着测试这一未知的领域,在导师的悉心栽培和指导下走进了测试工作。在这个过程中,他经历了测试的各个方面和阶段,积攒下丰富的理论和实践经验,经过各种学习和历练,终于...
电子版的Python GUI设计之Tkinter菜鸟编程,一般是扫描图片组成的PDF或网页版 ,不支持查找操作,特整理成Word版并分享。
这个编程规范很不错,让你知道书上的程序和网上的程序的那些编排,变量的定义为什么是这样定义,因为你不知道在程序界有他们共同的规定,当你了解了这篇文章你的程序会突飞猛进,会让别人一看就是专业人员写出来的...
菜鸟也能玩硬件——CPU篇.pdf
菜鸟成长手册2009,共包括主板篇,硬盘篇,显卡篇,内存篇,CPU篇5个独立篇章,非常精彩,含大量图片讲解。
菜鸟学习ARM——安装交叉编译链记录,及编译jpeg
一个菜鸟的STM32寄存器学习笔记4_外部中断收集.pdf
菜鸟的SAP自学学习笔记.pdf