安卓第四夜 概念漫游(下)

简介: 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   在安卓第三夜 概念漫游(上)中,我介绍了安卓最基本的功能单元和Intent的连接方式。

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

安卓第三夜 概念漫游(上)中,我介绍了安卓最基本的功能单元和Intent的连接方式。在这个骨架之上,我们可以进一步增加一些与开发密切相关的重要概念。

 

Context

一个应用是由多个Activity和Service这样的功能单元组成。一个应用共享有一个Application Context对象。在功能单元内部,可以用特定的方法来调用该对象。正如名字所表示的,Context对象记录了应用所处的环境。如同新生儿的功能单元,可以通过查询Context对象,了解当前的周边状况,比如屏幕的尺寸。这个Context对象还中包含了许多应用级别的功能,比如加载应用资源。一个Context对象与对应应用共存。它在应用运行之初即创立,直到应用结束运行。整个过程中,应用的功能单元就好像共同沐浴在Application Context这个温水池中,随时享受着沐浴带来的舒适。

Context

 

除了一个应用中唯一的Application Context对象,应用运行过程中还可能创建其他的Context对象。Activity类和Service类都继承自Context类,所以Activity对象和Service对象也都是Context对象,我把它们称为Activity ContextService Context。这两种Context对象与对应的Activity对象和Service对象有相同的生命周期。它们为内部的对象,提供了周边信息和功能。比如在创建一个UI元素View的时候,就需要把Activity Context对象作为参数传给该View。在Activity结束时,对应的Activity Context对象也会销毁。在Activity和Service内部,可以通过this来调用对应的Activity Context和Service Context对象。Activity Context对象提供了启动一个新的Activity的功能,而Service Context对象则没有UI相关的功能。

 

不同类型的Context对象在功能上有许多重叠的地方,比如都可以启动一个Service。但要注意它们生命周期的不同。Application Context对象有最长的生命周期。过度依赖Application Context对象,可能导致内存泄露。所以,原则上要尽可能的使用Activity Context和Service Context对象来实现Context类的功能。

Life Cycles 

 

View

Activity是一个屏幕界面。界面上总是有各种各样的视图元素,比如一个按钮,一行文字和一个输入栏。每一种视图元素在安卓中表示为一个View类,比如Button类,TextView类和EditText类。安卓的视图元素很多样,就连图片和网页也都有对应的视图元素。除了具体的视图元素,View类还有一个ViewGroup的子类。多个View对象可以归属于一个ViewGroup对象,而ViewGroup对象往往定义了下属视图元素的布局关系,比如自上而下线性排列,或者格点式排列。通过这样的归属关系,一个Activity的所有视图元素和抽象布局构成一个视图树。这棵树就包含了整个屏幕的视图信息。

 

视图树

 

在安卓设计中,我们往往要给View元素增加各种属性,以控制它们的文字、尺寸、大小、颜色等信息。对于ViewGroup来说,它有多个子类,代表了不同的布局方式。比较常见的有线性布局LinearLayout和相对布局RelativeLayout。线性布局是沿着一个方向线性排列视图元素,而相对布局则定义了视图元素和母View对象或兄弟View对象的相对位置关系。通过嵌套使用多种布局,我们可以创造出复杂的界面布局方式。

 

在一个Activity中,我们可以通过新建View对象的方式,用编程的手段来创建视图树。视图元素的属性可以通过View对象的方法来调整。但更常用的方法是定义一个XML文件。利用XML天然的树形结构来表示一个视图树。一个XML节点对应一个View对象,View对象的属性可以记录在节点的属性中。 安卓可以理解这样的XML定义,并把XML节点实例化为内存中的对象,也就是Layout Inflate的过程。比如下面的XML记录:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical" >
    <TextView android:id="@+id/text"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="Hello, I am a TextView" />
    <Button android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello, I am a Button" />
</LinearLayout>

它表示了一个线性布局,包含了一个文字视图和一个按钮。

 

从3.0之后,安卓引入了Fragment。Fragment与Activity一样,包含了一个视图树。由于一个Activity可以包含多个Fragment,也就是多个视图树,这就增加了界面设计的灵活性。毕竟,在Fragment以前,Activity只能包含一个视图树,比较死板。有了Fragment之后,程序员可以根据Activity的当前状况,来选择所包含的视图树,比如在手机屏幕显示一个Fragment,而在平板上显示两个Fragment。这样,视图的设计也可以重复利用不用不同的设备了。

Fragment的运行方式与Activity类似,也是在状态转换中调用onStart()等方法。

 

Resource

在安卓开发中,有可能需要一些静态资源,比如图片、字符串、XML文件等等。这些资源被存储在安卓项目res/下不同的文件夹中。

 

不同资源分类存放。我们上面提到用XML来定义布局,它们就保存在layout下。drawable*的文件夹中包含不同清晰度的图片,而字符串存放在values下的strings.xml中。在安卓项目中,我们可以用ID或文件名,来引用对应的资源。

 

总结

Context: 环境信息和功能

View: 视图

Resource: 静态资源

 

欢迎继续阅读“Java快速教程”系列文章

目录
相关文章
|
Java Android开发
Android中Callable、Future、FutureTask的概念以及几种线程池的使用
在开始介绍线程池之前,先来介绍下`Callable`和`Future`的概念,众所周知,`Android`中实现多线程的方式有两种,实现`Runnable`接口或者继承一个`Thread`,但是这两种方式都有一个缺点:在任务执行完成之后没有返回结果,所以在`Java 1.5`之后,出现了`Callable`和`Future`,通过他们构建的线程,可以在线程执行完成之后得到返回结果。
212 0
|
Java 开发工具 Android开发
安卓逆向系列篇:Dalvik概念&破解实例(二)
安卓逆向系列篇:Dalvik概念&破解实例
148 0
|
Java API Android开发
安卓逆向系列篇:Dalvik概念&破解实例(一)
安卓逆向系列篇:Dalvik概念&破解实例
127 0
|
存储 缓存 Java
Android OpenGL 显示基本图形及相关概念解读
Android OpenGL 显示基本图形及相关概念解读
Android OpenGL 显示基本图形及相关概念解读
|
数据采集 传感器 编解码
【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )
【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )
257 0
|
编解码 算法 Android开发
Android音视频——相关概念
Android音视频——相关概念
171 0
Android音视频——相关概念
|
Android开发
Android中最详细的焦点问题,从概念出发带你一点点分享(1)
版权声明:本文为sydMobile原创文章,转载请务必注明出处! https://blog.csdn.net/sydMobile/article/details/79530561 文章最早发布于我的微信公众号 Android_De_Home 中,欢迎大家扫描下面二维码关注微信公众获取更多知识内容。
1176 0
|
Java 开发工具 Android开发
Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
<div class="markdown_views"> <h1 id="android-for-jni一jni的概念以及c语言开发工具dev-c编写你的第一个c语言程序">Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序</h1> <hr> <blockquote> <p>当你的Android之旅一步步的深入
1609 0