首页 第03章 创建应用程序和活动

第03章 创建应用程序和活动

举报
开通vip

第03章 创建应用程序和活动 Android 学习笔记 独 孤 九 剑 2 0 1 2 年 0 1 月 版本历史说明 版本 作者 日期 备注 V1.0.1 独孤九剑 根据 Android 高级编程整理 第1章 Android简介 第2章 开始入手 第3章 创建应用程序和活动 在开始编写 Android 应用程序之前,需要理解 Android 应用程序的生命周 期以及它们是如何构建的。本章将简要介绍组成 Android应用程序的...

第03章 创建应用程序和活动
Android 学习笔记 独 孤 九 剑 2 0 1 2 年 0 1 月 版本历史 说明 关于失联党员情况说明岗位说明总经理岗位说明书会计岗位说明书行政主管岗位说明书 版本 作者 日期 备注 V1.0.1 独孤九剑 根据 Android 高级编程整理 第1章 Android简介 第2章 开始入手 第3章 创建应用程序和活动 在开始编写 Android 应用程序之前,需要理解 Android 应用程序的生命周 期以及它们是如何构建的。本章将简要介绍组成 Android应用程序的松耦合组件 (以及它们是如何使用 Android 清单组合到一起的)。然后讨论怎样以及为什 么要使用外部资源,再后会介绍 Activity (活动)组件。 近年来,开发框架有趋向于托管代码的趋势,例如, Java 虚拟机和.NET 的 公共语言运行时。 在第 l 章中,己经知道了 Android 使用了这种模型,它的每一个运行的应 用程序都拥有自己的 Dalvik 虚拟机实例的独立进程。在本章中,将会学习更多 关于应用程序生命周期的内容,以及 Android 运行时是如何管理它们的,之后, 又引出了对进程状态的介绍,进程状态描述了进程的优先级。而在系统需要更多 的资源的时候,进程的优先级的高低将决定一个应用程序被终止的可能性的大小。 现在,移动设备具有许多种不同的形状和大小,并在全球范围使用。在本章 中,通过分离资源,将学习如何让应用程序具有这样的灵活性,即它们可以用多 种语言编写并能在不同的硬件、不同的国家之中无差别地运行。 接着本章将会仔细地研究 Activity (活动)组件。Activity 类可以说是 Android 结构模块中最重要的成员,它形成了所有用户界面屏幕的基础,还将会 学习怎样创建新的 Activity , 并理解它们的生命周期以及它们的生存期是如 何影响应用程序的生命周期的。 最后,我们将介绍一些能够为常见的用户界面组件(如地图和列表)加入资 源管理的Activity 子类。 3.1. Android 应用程序的组成部分 Android应用程序由松藕合组件组成,并使用项目清单绑定到一起:项目清 单描述了每一个组件以及它们之间是如何交互的,应用程序由 6 个组件提供了 基本的结构模块: Activity (活动) 应用程序的表示层,应用程序中的每个屏幕都是 Activity 类的扩展。 Activity 使用 View 来形成显示信息和响应用户动作的 图形界面。在桌面开发环境中, Activity 就相当于 Form 。本章后面的部分将 学习更多关于 Activity 的内容。 服务( Service ) 应用程序中不可见的工作者。服务组件在后台运行,它 们可以更新数据源和可见的 Activity ,并触发 Notification 。它们被用来执 行一些常规处理,而这些常规处理需要持续执行,即使当应用程序的 Activity 不是活动的或者可见的时候也是如此,在第 8 章将会学习如何创建服务。 内容提供器( Content Provider ) 一个可共享的数据仓库。 Content Provider用来管理和共享应用程序数据库。 Content Provider是在应用程序之 间共享数据的首选方法。也就是说,可以通过配置自己的 Content Provider 来 允许其他应用程序访问存储的数据,也可以使用其他应用程序提供的 Content Provider 来访问它们存储的数据。 Android 设备包含了多个本地 Content Provider 来提供有用的数据库,如联系人信息等。在第 6 章中将学习如何创建 和使用 Content Provider 。 Intent (意向) 一个简单的消息传递框架。使用 Intent ,可以在系统范 围内向目标活动或者服务传播消息,以说明希望执行某个动作的意图。之后系统 就会确定那些最适合执行动作的目标。 广播接收器( Broadcast Receiver ) Intent广播的消费者。通过创建和 注册广播接收器,应用程序可以监听到那些匹配特定的过滤 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 的 Intent 广播。 广播接收器会自动地启动应用程序来响应某个到来的 Intent ,这个特点使它们 成为了事件驱动的程序的最佳选择。 通知( Notification ) 一种用户通知框架。通知允许向用户发送信号, 而不会过分吸引他们的注意力或者打断他们当前的活动。它们是服务或者广播接 收器吸引用户注意的首选方法。例如,当设备接收到一个文本消息或者来电的时 候,它可以通过闪灯、发出声音、显示图标或者显示对话框信息的方式来提醒你。 也可以在自己的应用程序中使用 Notification 来触发相同的事件,如第 8 章 所示。 通过分离这些应用程序组件之间的依赖性,可以和其他应用程序共享或者互 换单独的某些部分,如 Content Provider 或者服务-不论是你自己的应用程序, 还是其他第三方的应用程序都可以。 3.2. 程序清单简介 每 一 个 Android 项 目 都 包 含 一 个 清 单 ( Manifest ) 文 件 AndroidManifest.xml ,它存储在项目层次中的最底层。清单可以定义应用程序 及其组件的结构和元数据。 它包含了组成应用程序的每一个组件(活动、服务、内容提供器和广播接收 器)的节点,并使用 Intent 过滤器和权限来确定这些组件之间以及这些组件和 其他应用程序是如何交互的。 它还提供了各种属性来详细地说明应用程序的元数据(如它的图标或者主 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 ) 以及额外的可用来进行安全设置和单元测试项级节点,如下所述。 清单由一个根 manifest 标签构成,该标签带有一个设置项目包的 package 属性。它通常包含一个 xmlns:android 属性来提供文件内使用的某些系统属性。 下面的 XML 代码段展示了一个典型的声明节点: 节点内容… manifest 标签包含了一些节点( node ) ,它们定义了应用程序组件、安 全设置和组成应用程序的测试类。下面列出了一些常用的 manifest 节点标签, 并用一些 XML 代码段说明了它们是如何使用的。 application 一个清单只能包含一个 application 节点。它使用各种属性 来指定应用程序的各种元数据(包括标题、图标和主题)。它还可以作为一个包 含了活动、服务、内容提供器和广播接收器标签的容器,用来指定应用程序组件。  activity 应用程序显示的每一个 Activity 都要求有一个 activity 标签,并使用 android : name 属性来指定类的名称。这必须包含核心 的启动 Activity 和其他所有可以显示的屏幕或者对话框。启动任何一 个没有在清单中定义的 Activity 时都会抛出一个运行时异常。每一个 Activity 节点都允许使用 intent-filter 子标签来指定哪个 Intent 启动该活动。  service 和 activity 标签一样,应用程序中使用的每一个 Service 类都要创建-个新的 service标签。(第 8 章会详细地讲述服务)。 service标签也支持使用 intent-filter子标签来允许后面的运行时绑 定。  provider provider 标签用来说明应用程序中的每一个内容提供器。 内容提供器是用来管理数据库访问以及程序内和程序间共享的,第 6 章将会对其进行详细讲述。  receiver 通过添加 receiver 标签,可以注册一个广播接收器 ( Broadcast Receiver ) ,而不用事先启动应用程序。正如将会在第 5 章看到的那样,广播接收器就像全局事件监听器一样,一旦注册了之 后,无论何时,只要与它相匹配的 intent 被应用程序广播出来,它就 会立即执行。通过在声明中注册一个广播接收器,可以使这个进程实现 完全自动化。如果一个匹配的 Intent 被广播了,则应用程序就会自动 启动,并且你注册的广播接收器也会开始运行。 Uses-permission 作为安全模型的一部分, uses-permission 标签声明了 那些由你定义的权限,而这些权限是应用程序正常执行所必需的。在安装程序的 时候,你设定的所有权限将会告诉给用户,由他们来决定同意与否。对很多本地 Android 服务来说,权限都是必需的,特别是那些需要付费或者有安全问题的服 务(例如,拨号、接收 SMS 或者使用基于位置的服务)。如上所示,第三方应 用程序,包括你自己的应用程序,也可以在提供对共享的程序组件进行访问之前 指定权限。 Permission 在可以限制访问某个应用程序组件之前,需要在清单中定义一 个 permission 。可以使用 Permission 标签来创建这些权限定义。然后,应用 程序组件就可以通过添加 android:permission 属性来要求这些权限。再后,其 他的应用程序就需要在它们的清单中包含 uses-permission 标签(并且通过授 权),之后才能使用这些受保护的组件。在 permission 标签内,可以详细指定 允许的访问权限的级别、一个 label 属性和一个外部资源,这个外部资源应该 包含了对授予这种权限的风险的描述。 Instrumentation instrumentation类提供一个框架,用来在应用程序运行 时在活动或者服务中运行测试,它们提供了一些方法来监控应用程序及其与系统 资源的交互。对于为自己的应用程序所创建的每一个测试类,都需要创建一个新 的节点。 3.3. Android 应用程序生命周期 与大部分传统的移动开发环境不同, Android 应用程序不能控制它们自己 的生命周期。相反,应用程序组件必须监听应用程序状态的变化并做出适当的反 应,而且特别要注意为随时被终止做好准备。 正如前面提到的,默认情况下,每一个 Android 应用程序都是通过它们自 己的进程运行的,每一个进程都是 Dalvik的一个单独实例。每一个应用程序的 内存和进程管理都是由运行时专门进行处理的。 虽然看起来有点不寻常,但是通过在清单内对每一个受到影响的应用程序组 件节一级使用 android:process ,还是有可能使同一个应用程序的组件运行在 不同的进程中,或者让多个应用程序共享同一个进程。 Android 主动地管理着它的资源,它会采取任何措施来保证设备保持响应。 这就意味着在必要的时候,进程(以及它们的承载应用程序)将会在没有替告的 情况下被终止,这样就可以为高优先级的应用程序-通常是当时正直接和用户进 行交互的应用程序-释放资源。下一部分内容将会讨论进程的优先级。 3.4. 理解应用程序的优先级和进程状态 回收资源的时候,进程被终止的顺序是由它们的承载应用程序的优先级所决 定的。一个应用程序的优先级等同于它优先级最高的组件的优先级。当两个应用 程序有相同的优先级时,处于较低优先级且运行时间最长的进程将会首先被终止。 进程的优先级也受到进程间依赖性的影响,如果一个应用程序依赖于第二个 应用程序所提供的服务或者内容提供器,那么第二个应用程序至少会拥有与它所 支持的这个应用程序相同的优先级。 所有的 Android 应用程序都会保持在内存中运行,直到系统需要释放它的 资源供其他应用程序使用对为止。 下图显示了用来确定应用程序终止顺序的优先级树。 通过合理地组织应用程序来保证它具有能够正常工作的适当的优先级是非 常重要的,如果没有做到这一点,则应用程序就可能在某些比较重要的时刻被终 止。 活动进程 活动(前台)的进程是指那些有组件正和用户进行交互的承载应 用程序的进程,这些都是 Android 尝试通过回收资源来保持响应的进程。这些 进程的数量非常少,只有到最后的关头才会终止这些进程。活动的进程包括:处 于“活动”状态的 Activity,也就是说,它们位于前台并对用户事件进行响应。  正在执行 onReceive 事件处理函数的话动、服务或者广播接收器。  正在执行 onStart 、 onCreate 或者 onDestroy 事件处理函数的服务。 可见进程 可见、但是非活动的进程,是指那些承载“可见”活动的进程。 顾名思义,可见的活动能被用户看到,但是它们并不在前台运行或者能对用户事 件做出反应。例如,当一个活动被部分遮挡时(被一个非全屏或者半透明的活动 遮档)就会出现这种情况。这些进程的数量也很少,只有在资源极度匾乏的环境 下,为保证活动进程继续执行时才会终止这些进程。 启动服务进程 己经启动的承载服务的进程。服务支持在没有可见界面的情 况下, 仍然能够继续不间断的处理。因为服务进程没有直接和用户交互,所以它 们的优先级要比可见进程低一些。但是它们仍然被认为是前台( foreground ) 进程,直到活动或者可见的进程需要资源的时候,才会终止它们。在第 8 章中 将会学到更多关于服务的内容。 后台进程 那些承载不可见活动的,并且也没有已经启动的任何服务的进程 即为后台进程。通常会有大量的后台进程, Android 将使用“最后一个被看到, 第一个被杀死”的方式来终止它们,从而为前台进程提供资源。 空进程 为了提高系统整体性能, Android 经常在应用程序的生存期结束之 后仍然把它们保存在内存中。 Android 通过维护这个缓存来减少应用程序被再 次启动时的启动时间。通常这些进程会按照要求被定期终止。 3.5. 分离资源 不管使用什么样的开发环境,把非代码资源(如图片和字符串常量)和代码 分离开来都是一种很好的做法。 Android 支持各种资源与代码的分离、从简单 的像字符串和颜色这样的值到更复杂的资源,例如,图片(可拉伸的)、动画和 主题。也许,可以分离的最复杂的资源应该是布局了。 通过将资源分离开来,可以使它们变得更加容易维护、更新和管理。这也可 以让你通过轻松地定义多种可选的资源值来支持不同的硬件和国际化需求。 在这一节的后面,将会看到 Android 是如何动态地从资源树中选择资源的, 然后可以基于设备的硬件配置、语言和位置来定义可选的值。因此,可以为特定 的语言、国家、屏幕和键盘创建不同的资源值。 当一个应用程序启动的时候,不需要编写一行代码, Android 就会自动地 选择正确的资源值。此外,还可以根据屏幕的尺寸和方向来改变布局,根据语言 和国家来定义文本提示。 3.5.1. 创建资源 应用程序资源存储在项目层次中的 res/ 文件夹下。在这个文件夹中,每一 种可用的资源都可以用子文件夹来储存该类型资源。 如果使用 ADT 向导来启动一个项目,则它会创建一个 res 文件夹,这个文 件夹包含了 3 个子文件夹, values 、 drawable 和 layout ,它们分别包含 了默认的布局、应用程序图标和字符串资源定义。 有 7 种主要的资源类型,分别为:简单的值、图片(可拉伸的)、布局、 动画、 XML 、样式和原始资源。当构建应用程序的时候,这些资源会被尽可能 高效地编译,并包含到应用程序包中。 这个过程还创建了一个 R 类文件,它包含了对加入到项目中的侮一个资源 的引用。因此,可以在代码中引用资源,同时也具有 设计 领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计 句法检查的优势。 下面的内容描述了这些分类中的特定资源类型以及如何为应用程序创建这 些资源。 在所有的情况下,资源的名称都应该只包含小写字母、数字、点( . )和 下划线( _ )。 1 .创建简单的值 支持的简单值包括字符串、颜色、尺寸和字符串数组或者整型数组。所有的 简单值都存储在 res/values 目录下的 XML 文件中。在每一个 XML 文件中,可 以使用标签来说明存储的每一个值的类型,如下面简单的 XML 文件所示: To Do List #FF0000FF 5px Item 1 Item 2 Item 3 3 2 1 这个例子包含了所有的简单值类型。习惯上,资源会将每一种类型存储到单 独的文件中,例如, res/values/strings.xml ,就只包含字符串资源。 下面的内容详细地解释了定义简单资源的选项。 字符串 分离字符串可以有助于维护应用程序内部的一致性,而且可以更容易地创建 本地化的版本。如下面的 XML 代码片段所示,字符串资源使用 String 标签来 进行说明: To Do List Android 支持简单的文本样式,所以可以使用 HTML 标签来 让部分文本字符串变为粗体、斜体和下划线,如下面的代码所示: TodoList 颜色 使用 color 标签来定义一种新的颜色资源。使用#符号来指定颜色值,其 后跟一个可选的 Alpha 通道,再之后使用一个或者两个十六进制值来表示红、 绿、蓝值,即下面的标记方法: # RGB # RRGGBB # ARGB # ARRGGBB 下面的代码显示了如何指定一种完全不透明的蓝色和一种半透明的绿色: #00f #7700ff00 尺寸 尺寸是样式和布局资源中最常引用的资源。它们对创建像边界和字体高度这 样的布局常量来说非常有用。 要说明一个尺寸资源,可以使用 dimen 标签来指定尺寸的值,并在其后跟 一个标识符来描述尺寸的单位:  px 屏幕像素  in 物理英寸  pt 物理点  mm 物理毫米  dp 相对于 160dpi的屏幕的非密度制约的像素  sp 无单位的像素 上述这些可选的标识符不仅可以定义绝对尺寸,还可以使用相对比例来适应 不同的屏幕分辨率和密度,以简化在不同硬件上的缩放。 下面的 XML 代码片段显示了如何为大字体和标准边界设定尺寸值: 5px 20pt 2.图片 图片资源包括位图和 NinePatch (可拉伸的 PNG )图像。它们都作为单独 的文件存储在 res/drawable 文件夹下。位图资源的资源标识符是一个没有后缀 的小写字母文件名。虽然Android也支持 JPG 和 GIF 文件,但是 PNG 是更好的 位图格式。 NinePatch (或者可拉伸的)图像是那些标记了一个图像可以被拉伸的部分 的 PNG 文件。 NinePatch 文件必须是以.9.png 为后缀名的正确定义的 PNG 文 件。 NinePatch 文件的资源标识符是没有后缀 9.png 的文件名。 一个 NinePatch 是 PNG 图像的一种变化形式,如果图像被放大了,它就用 l 像素的 边界来定义图像可以被拉伸的部分。如果要创建一个 NinePatch ,可以在图像 的左边界和上边界画一条单像素的黑线来表示可拉伸的部分,没有标记的部分其 大小就不会被调整,而每一个被标记的部分的相对大小,在图像大小改变的时候 都会保持不变。 NinePateh 是一种强大的技术,可以用它来为 View 或者Activity 创建可 变大小的背景。例如, Android 使用 NinePatch 来创建按钮的背景。 3.布局 布局资源可以让你在 XML 文件中设计用户界面的布局,而不是在代码中构 建它们,从而可以把表示层分离出来。 布局最常见的用途是定义活动的用户界面。一旦在用户 XML 中进行了定义, 就用以使用 setContentview 来让布局在 Activity中使用,这通常是在 onCreate 方法中进行的。 也可以从其他布局资源的内部引用布局,例如, List view 中每一行的布 局就是通过这种方式实现的。可以在第 4 章中找到关于在Activity中创建和使 用布局的更多信息。 每一个布局定义都存储在一个单独的文件中,每一个文件都包含一个单一的 布局,这些文件都存在于 res/layout 文件夹下,其文件名就是它的资源标识符。 在第 4 章中包含了对布局容器和 View 元素的详尽解释,但是作为个例子,下 面的代码显示了由新项目向导所创建的布局。使用线性布局作为了一个显示 “ Hello world " 问候语的 TextView 的布局容器。 4.动画 Android 支持两种类型的动画:补间动画,可以用来旋转、移动、拉伸或者 消退一个View ;或者你可以创建逐帧动画来显示一系列的图片。在第 11 章中可 以找到关于创建、使用和应用动画的全面介绍。将动画作为外部资源定义之后, 就可以在多个地方重复地使用同一个序列,同时也可以提供在设备硬件或者定向 的基础上呈现可选动画的机会。 5.样式和主题 样式资源可以指定 View 所使用的属性值,从而使应用程序保持一个一致的 用户界面体验。 主题和样式资源最大的用途是用来存储应用程序的颜色和字体。可以在项目 清单中简单地指定一个不同的样式来作为主题,以此来轻松地改变应用程序的外 观。 要创建一个样式,你可以使用 style 标签,它包含了一个 name 属性以及 一个或者多个 item 标签。每一个 item 标签都应该包含一个 name 属性来说明 要定义的属性(例如,字体大小或者颜色)。然后,标签本身应该包含值,如下 面的代码所示: 样式支持继承,通过在 style 标签中使用 Parent 属性可以方便地创建简 单的变化形式。下面的例子显示了两个可以用作主题的样式:第一个样式是基样 式,它设置了一些文本属性,而第二个样式则通过修改第一个样式来指定一个更 小的字体。 在使用之前需要在资源清单中进行描述: 3.5.2. 使用资源 与创建的资源一样, Android 提供了多个系统资源供在应用程序中使用。 既可以在应用程序代码中直接使用这些资源,也可以在其他资源中引用这些资源 (例如,在一个布局定义中就可以引用一个尺寸资源)。 在本章后面的部分中,将会学习如何为不同的语言、位置和硬件定义可选的 资源值。有点需要注意的是,当使用资源的时候,不能选择特定的专用版本。 Android会基于当前的硬件和设备配置来为某个资源标识符选择最合适的值。 1.在代码中使用资源 可以在代码中使用静态 R 类来访问资源。 R 类是基于外部资源而生成的类, 并且是通过编译项目而创建的。 R 类为那些定义了至少一个资源的每种资源类 型都包含了若干静态子类。例如,默认的新项目中就包含 R.string 和 R.drawable 子类。 如果在 Eclipse 中使用了 ADT 插件,那么当对任何外部资源文件或者文件 夹进行修改的时候, R 类都会自动地被创建,如果没有使用 ADT 插件,那么可 以使用 AAPT 工具来编译项目并生成 R 类。R 是编译器自动生成的类,所以不 要手工对它进行任何修改,因为当文件重新生成的时候,它们就会丢失。 R 中的每一个子类都把它的相关资源表示为变量的形式,变量的名字与资源 标识符相匹配,例如, R.string.app_name 或者 R.drawable.icon 。这些变量 的值是对资源表中资源位置的引用,而不是资源本身的一个实例。 当一个构造函数或者方法(如 setContentView )接收一个资源标识符时, 就可以传递资源变量了,如下面的代码段所示: setContentView(R.layout.main); 当需要一个资源本身的实例时,就需要使用 helper 方法来把它们从资源表 中提取出来,并用 Resources 类的一个实例来表示。因为这些方法将在应用程 序的资源表中执行杳找,所以这些 helper 方法不能是静态的。 可以在应用程序的上下文中使用 getResourees 方法来访问应用程序的资 源实例,如下面的代码段所示: Resources resources=getResources(); Resourees 类为每一个可用的资源类型包含了 getters ,并且通常是通过 传递你需要的资源实例的资源 ID 来发挥作用的,下面的代码展示了使用 helper 方法来返回对资源值的选择的例子: Resources resources=getResources(); String app_name=resources.getString(R.string.app_name); System.out.println(app_name); 2.资源的相互引用 也可以引用一个资源并把它作为其他 XML 资源中的属性值。使用@符号, 可以在一个资源中引用另外的一个资源,如下面的代码所示: 默认情况下 Android 会认为正在使用的是同一个包中的资源,所以如果使 用的是其他包中的资源,那么就需要完全限定包的名称. 3.使用系统资源 Android 本地应用程序也分离出了它们的很多资源,从而提供了各种各样的 字符串、图片、动画、样式和布局供你在应用程序中使用。在代码中使用系统资 源的方法和使用自己的资源的方法相似。不同的是,你要从 android.R 类中使 用那些可用的本地 Android 资源,而不是使用应用程序特定的 R 类。下面的代 码段通过在应用程序的上下文中使用 getString 方法来检索一个系统资源中可 用的出错信息: CharSequence httpErr=getString(android.R.string.httpErrorBadUrl); 在 XML 中访问系统资源,需要指定 Android 作为包的名称,如下面的 XML 代码所示: 本章节所使用的例子参见SimpleAndroid,代码不再给出。 3.6. 一个完整的例子 主布局文件main.xml文件:
本文档为【第03章 创建应用程序和活动】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_070498
暂无简介~
格式:pdf
大小:577KB
软件:PDF阅读器
页数:25
分类:互联网
上传时间:2012-01-25
浏览量:8