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

作者: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 Context和Service 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快速教程”系列文章

时间: 2024-10-03 00:17:11

安卓第四夜 概念漫游(下)的相关文章

安卓第三夜 概念漫游(上)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!    拿起一个手机,总是满屏的应用图标.点击图标,选择应用,玩一把游戏,刷一下微博,写一篇日记."叮咚"一声,邮件应用提醒有一封新来的邮件.在安卓里,眼花缭乱的应用承载着各种有趣的功能.欢迎来到安卓应用的世界. 每一个应用都是存储在手机中的一段小程序.编写这段小程序,是每个安卓开发者的主要工作.程序运行后成为一个进程后,在进程的内存空间中新建一个Dalvik虚拟机.程序

安卓第五夜 维纳斯的诞生

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢!   之前各讲中,分别讲解了安卓的开发环境.架构和基本概念.从这一讲开始,我将制作一个简单的应用,并通过逐步升级它的功能,连带出安卓开发的多个情境. <维纳斯的诞生>是文艺复兴早期名画.相传美神维纳斯从海的泡沫中诞生,波提切利用大胆的笔触描绘这一古典神话.画面洋溢着对人体和美的热爱.如果在中世纪或者西班牙宗教审判时期,这幅画足够波提切利上火刑架了.    任务描述 我将制作一个简

android-安装新的安卓程序但是在 Androiddata目录下没有生成程序的包文件

问题描述 安装新的安卓程序但是在 Androiddata目录下没有生成程序的包文件 10C 我把拍照头像的缓存文件放在了Android/data/+包名文件里面.突然头像设置就不能使用了,查看了一下,我的应用程序包名文件没有生成.,百度了好久也没有头绪啊 12-23 13:31:36.196 5425-5425/? E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/

android-请问这些应该写在安卓工程结构的那个文件夹下,谢谢

问题描述 请问这些应该写在安卓工程结构的那个文件夹下,谢谢 第一步就是**ApiClient**里面编写获取验证码的方法 第二步编写**AppContent**里面的接口方法 第三步,在**StringUtils**里面编写验证号码是否是手机号的正则表达式 解决方案 不太清楚什么意思,就应该写在java文件中啊 解决方案二: 我的意思是写在工程结构的哪个文件夹下, 解决方案三: 其实放到哪里都可以,你的问题无非是项目目录接口分层的问题. 工具类建议放到util包下 接口放到inter包下 bea

10天学安卓-第四天

原文:10天学安卓-第四天 继续昨天的学习. 昨天我们根据取得的天气数据新建了一个视图用来显示各项内容,那么今天我们就把数据显示出来吧!!! 这里我们要把数据和视图联系起来,那么就用到了适配器-Adapter,Android给我们提供了很多Adapter,这里我们用到了BaseAdapter.   BaseAdapter(1) 右键点击src/com.demo.weather,选择 New > Class,按照下图填写: 选择[Finish]后,我们就新建了一个BaseAdapter的子类,打开

出国必备天翼四款全球漫游手机重磅出击

还在为境外出游,出差在外,无网随行的而苦闷吗?身在他国,关键时刻,手机无法即时联网而错过重要商务信息,的确是件让人愁痛万分的事.近日,由"与Discovery一起免费游世界"活动奖品设置的四款天翼全球漫游手机,强大的功能,为出国在外的朋友们带来了福音.自从"与Discovery一起免费游世界" 活动新鲜出炉后,引来无数网民疯狂关注与参与,大有风雨欲来的架势.活动如此备受瞩目,固然是独具匠心的人气团设置和Discovery探索频道的魅力所在,但令人艳羡的丰厚的奖品才是

按时起床不迟到 安卓手机四款闹钟横评

安卓手机四款闹钟横评一日常生活工作中,时常会有一些重要事情或 日程安排,而闹钟作为一种提醒人们的工具,成为很多人 生活中不可或缺的一部分.近年来,谷歌android手机系统日趋流行,针对Android系统的闹钟软件越来越多.今天,我们就增强闹钟.正点闹钟.超 级闹钟.AlarmDroid闹钟等四款较常用的闹钟软件作一番评比,看看 它们在android平台上的表现.参评软件增强闹钟(Alarm Clock Plus)是一款时钟增强软件,包含静音闹钟.数字闹钟.音乐闹钟.报时.延时闹铃.数学解题闹铃

政府安全资讯精选 2017年第十六期 工信部发布关于规范互联网信息服务使用域名的通知;俄罗斯拟建立备用DNS;Google打击安卓应用在未经同意情况下收集个人信息

  [国内政策动态]工信部发布关于规范互联网信息服务使用域名的通知 点击查看原文 概要:<规范互联网信息服务使用域名的通知>要求互联网接入服务提供者按照<网安法>要求落实实名制,并要求域名注册管理.服务机构按照<互联网域名管理办法>和电信主管要求,与"ICP/ICP地址/域名信息备案管理系统"进行对接.互联网接入服务提供者应当定期通过备案系统核查互联网信息服务提供者使用域名的状态,对于域名不存在.域名过期且未提供真实身份信息等情形的,互联网接入服务提

移动行业第四波浪潮:下一个万亿美元的演变

移动行业第四波浪潮:下一个万亿美元的演变我们正进入移动的黄金时代.移动已经成为提升生产率.推动人类创新和技术发展最重要的工具.全球移动市场规模今年将达到1.65万亿美元.未来十年,该数字将翻一番多.巨大变化该营收数字的来源和分布未来十年将会出现巨大变化.在上一个十年里,语音占移动行业总营收的55%多, 数据访问占17%,OTT和数字服务仅占3%.未来十年,预计移动数字服务将会成为该行业收入最高的类别,占比接近30%:语音的占比则将降至不到21%.很多公司的营收结构已经出现显著的变化.传统的语音和