第三章Android应用程序框架_第1页
第三章Android应用程序框架_第2页
第三章Android应用程序框架_第3页
第三章Android应用程序框架_第4页
第三章Android应用程序框架_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章Android应用程序环境 实验一实验二 目录结构 src 专门存放我们编写的java源代码的包 gen 该目录不用我们开发人员维护 但又非常重要的目录 该目录用来存放由Android开发工具所生成的目录 该目录下的所有文件都不是我们创建的 而是由ADT自动生成的 该目录下的R java文件非常重要 后面会详细的介绍 android2 1 存放Android自身的jar包 assets 该目录用来存放应用中用到的类似于视频文件 MP3一些媒体文件 res 目录下可以有以下几个子目录 部分目录开发工具并没有自动创建 根据需要我们可以自行创建 res res是resource的缩写 我们称该目录为资源目录 该目录可以存放一些图标 界面文件 应用中用到的文字信息 AndroidManifest xml该文件是功能清单文件 该文件列出了应用中所使用的所有组件 如 activity 以及后面要学习的广播接收者 服务等组件 default properties该文件一般也不需要手工去更改 该文件存放了项目对应的一些环境配置 如应用要求运行的最低Android版本 资源被编译到最终的APK文件里 Android创建了一个被称为R的类 这样你在Java代码中可以通过它关联到对应的资源文件 R类包含的子类的命名由资源在res 目录下的文件夹名称所决定 1 res drawable res 目录下有三个dawable文件夹 drawable dpi 区别只是将图标按分辨率高低来放入不同的目录 drawable hdpi 用来存放高分辨率的图标 drawable mdpi 用来存放中等分辨率的图标 drawable ldpi 用来存放低分辨率的图标 程序运行时可以根据手机分辨率的高低选取相应目录下的图标 如果不想准备过多图片 那么也可以只准备一张图标将其放入三个目录的任何一个中去 2 res values 文件夹下常放的文件如下 1 strings xml用来定义字符串和数值 在Activity中使用getResources getString resourceId 或getResources getText resourceId 取得资源 strings xml文件内容 HelloWorld HelloActivity Android 你好 每个string标签声明了一个字符串 name属性指定其引用名 res layout 目录下的布局文件 本例中的布局文件是ADT默认自动创建的 main xml 文件 在Eclipse中 双击 main xml 文件 或者右击以选择相应的编辑器 选用 AndroidLayoutEditor 在编辑区出现如下界面 默认显示的是 Layout编辑器 的预览效果 可以点击Layout选项卡旁边的main xml 切换到代码模式以编辑 main xml main xml我们逐元素进行分析说明 元 LinearLayout 翻译成中文是 线性布局 所谓线性布局就是在该元素下的所有子元素会根据其 orientation 属性的值来决定是按行或者是按列逐个显示 元素该元素与HTML中的元素比较相似 也是一种显示控件 其属性text指定在该元素上面显示的文字内容 建议将该文字内容在strings xml文件中进行定义 之后再在main xml文件中通过 string stringName 的方式进行引用 gen 目录下的R java文件详解 接下来我们再来详细学习R java文件 R java文件中默认有attr drawable layout string等四个静态内部类 每个静态内部类分别对应一种资源 如layout静态内部类对应layout中的界面文件 其中每个静态内部类中的静态常量分别定义一条资源标识符 如 publicstaticfinalintmain 0 x7f030000 对应的是layout目录下的main xml文件 具体的对应关系 如下图 由于目前 drawable dpi 目录下都只有icon png一个图片文件 因此此时不同像素的同名的icon png文件在drawable内部类中只有一个icon属性 如果我们在 drawable dpi 目录下再添加一幅图片 那么会有什么效果出现呢 请看下图 R java文件总结 现在已经理解了R java文件中内容的来源 也即是当开发者在res 目录中任何一个子目录中添加相应类型的文件之后 ADT会在R java文件中相应的匿名内部类当中自动生成一条静态int类型的常量 对添加的文件进行索引 如果在layout目录下在添加一个新的界面 那么在publicstaticfinalclasslayout中也会添加相应的静态int常量 相反的 当我们再res目录下删除任何一个文件 其在R java中对应的记录会被ADT自动删除 再比如说我们在 strings xml 添加一条记录 在R java的string内部类中也会自动增加一条记录 R java文件会给我们开发程序带来很大的方便 比如在程序中我们使用 publicstaticfinalinticon 0 x7f020000 就可以找到其对应的icon png这幅图片 R java文件除了有自动标识资源的 索引 功能之外 还有另一个主要的功能 当res目录中的某个资源在应用中没有被使用到 在该应用被编译的时候系统就不会把对应的资源编译到该应用的APK包中 这样可以节省Android手机的资源 AndroidManifest xml功能 命名应用程序的Java应用包 这个包名用来唯一标识应用程序 描述应用程序的组件 活动 服务 广播接收者 内容提供者 对实现每个组件和公布其功能 比如 能处理哪些意图消息 的类进行命名 这些声明使得Android系统了解这些组件以及它们在什么条件下可以被启动 决定应用程序组件运行在哪个进程里面 声明应用程序所必须具备的权限 用以访问受保护的部分API 以及和其它应用程序交互 声明应用程序其他的必备权限 用以组件之间的交互 列举测试设备Instrumentation类 用来提供应用程序运行时所需的环境配置及其他信息 这些声明只在程序开发和测试阶段存在 发布前将被删除 声明应用程序所要求的AndroidAPI的最低版本级别 列举application所需要链接的库 下面以HelloWorld项目的功能清单文件为例进行讲解 1 元素 该元素是AndroidManifest xml文件的根元素 该元素为必选 其中根据xml文件的语法 xmlns android 指定该文件的命名空间 功能清单文件会使用 所指向的一个文件 package 属性是指定Android应用所在的包 以后会经常说到 应用的包 应用的包 就是指该属性的内容 android versionCode 指定应用的版本号 如果应用需要不断升级 在升级的时候应该修改该值 android versionName 是版本名称 名称的取定可根据爱好而定 是非常重要的一个元素 今后我们开发的许多组件都会在该元素下定义的 该元素为必选元素 的 icon 属性是用来设定应用的图标 该表达式指向的是icon png图片 在Eclipse中双击icon png图片 如下图 对照关系如下图 的 label 属性用来设定应用的名称 指定其属性值所用的表达式 string app name 含义与上面的表达式 drawable icon 一样 同样是指向R java文件中的string静态内部类中的app name属性所指向的资源 在这里它指向的是 strings xml 文件中的一条记录 app name 其值为 Android 你好 因此 这种表达方式等价于android label Android 你好 两者结合起来 当程序发布到模拟器上之后 会在 抽屉 中显示效果 如下 3 元素元素的作用是注册一个Activity信息 当我们在创建 HelloWorld 这个项目时 指定了 CreateActivity 属性为 HelloActivity 之后ADT在生成项目时帮我们自动创建了一个Activity名称就是 HelloActivity java Activity在Android中属于组件 它需要在功能清单文件中进行配置 元素的 name 属性指定的是该Activity的类名 我们可以看到这个属性值 HelloActivity 中的 代表的是在上面元素的 package 属性中指定的当前包 因而 HelloActivity 的含义等价于 com sharpandroid activity HelloActivity java 如果Activity在应用的包中 则这个 可以去掉 但如果Activity不在应用的包中 而在应用的包的子包当中 如下图中的OtherActivity这个Activity配置时必须这么写 sub OhterActivity 不可省略 因此建议在书写时不论何种情况都加上 以免出错 Activity只能放在 应用的包 或者其子包里面 而不能在 应用的包 以外的包中 这一点必须牢记 元素的 label 属性表示Activity所代表的屏幕的标题 其属性值的表达式在上面已经介绍过了 不再赘述 该属性值在AVD运行程序到该Activity所代表的界面时 会在标题上显示该值 如下图 4 元素翻译成中文是 意图过滤器 首先简单介绍什么是意图 Intent 应用程序的核心组一个合适的组件来响应这个意图 如果需要会启动这个组件一个新的实例 并传递给这个意图对象 后面会有详细的介绍 在此只需有大致印象即可 组件通过意图过滤器 intentfilters 通告它们所具备的功能 能响应的意图类型 由于Android系统在启动一个组件前必须知道该组件能够处理哪些意图 那么意图过滤器需要在manifest中以元素指定 一个组件可以拥有多个过滤器 每一个描述该组件所具有的不同能力 一个指定目标组件的显式意图将会激活那个指定的组件 意图过滤器不起作用 但是一个没有指定目标的隐式意图只在它能够通过组件过滤器任一过滤器时才能激活该组件 第一个过滤器 是最常见的 它表明这个activity将在应用程序加载器中显示 就是用户在设备上看到的可供加载的应用程序列表 换句话说 这个activity是应用程序的入口 是用户选择运行这个应用程序后所见到的第一个activity 5 权限PermissionsHelloWorld项目的功能清单文件中并没有出现元素 但是Permission也是一个非常重要的节点 我们在后面的学习中会经常的用到 在此进行介绍 Permission是代码对设备上数据的访问限制 这个限制被引入来保护可能会被误用而曲解或破坏用户体验的关键数据和代码 如拨号服务 短信服务等 每个许可被一个唯一的标签所标识 这个标签常常指出了受限的动作 例如 下面是一些Android定义的权限 如申请发送短信服务的权限需要在功能清单文件中添加如下语句 一个功能 feature 最多只能被一个权限许可保护 如果一个应用程序需要访问一个需要特定权限的功能 它必须在manifest元素内使用元素来声明这一点 这样 当应用程序安装到设备上之后 安装器可以通过检查签署应用程序认证的机构来决定是否授予请求的权限 在某些情况下 会询问用户 如果权限已被授予 那应用程序就能够访问受保护的功能特性 如果没有 访问将失败 但不会给用户任何通知 因此我们在使用一些系统服务 如拨号 短信 访问互联网 访问SDCard时一定要记得添加相应的权限 否则会出现一些难以预料的错误 MVC设计模式 M是指数据模型 V是指用户界面 C则是控制器 使用MVC的目的 将M和V的代码分离 从而使同一个程序可以使用不同的表现形式 比如一批统计数据你可以分别用柱状图 饼图来表示 C存在的目的则是确保M和V的同步 一旦M改变 V应该同步更新 视图 视图是用户看到并与之交互的界面 对老式的Web应用程序来说 视图就是由HTML元素组成的界面 在新式的Web应用程序中 HTML依旧在视图中扮演着重要的角色 但一些新的技术已层出不穷 它们包括AdobeFlash和像XHTML XML XSL WML等一些标识语言和Webservices 如何处理应用程序的界面变得越来越有挑战性 MVC一个大的好处是它能为你的应用程序处理很多不同的视图 在视图中其实没有真正的处理发生 不管这些数据是联机存储的还是一个列表 作为视图来讲 它只是作为一种输出数据并允许用户操纵的方式 模型 模型表示企业数据和业务规则 在MVC的三个部件中 模型拥有最多的处理任务 例如被模型返回的数据是中立的 就是说模型与数据格式无关 这样一个模型能为多个视图提供数据 由于应用于模型的代码只需写一次就可以被多个视图重用 所以减少了代码的冗余 增加了代码的复用性 控制器 控制器接受用户的输入并调用模型和视图去完成用户的需求 所以当单击Web页面中的超链接和发送HTML表单时 控制器 例如 servlet 本身不输出任何东西和做任何处理 它只是接收请求并决定调用哪个模型构件去处理请求 然后确定用哪个视图来显示模型处理返回的数据 一个Activity可以有多个界面 只需要将视图的ID传递到setContentView 就指定了以哪个视图模型显示数据 MVC的处理过程 MVC的处理过程 首先控制器接收用户的请求 并决定应该调用哪个模型来进行处理 然后模型用业务逻辑来处理用户的请求并返回数据 最后控制器用相应的视图格式化模型返回的数据 并通过表示层呈现给用户 为什么使用MVC 首先 最重要的一点是多个视图能共享一个模型 现在需要用越来越多的方式来访问你的应用程序 对此 其中一个解决之道就是使用MVC 那么无论你的用户想要使用XML布局 直接使用代码编写界面或者通过WebView控件使用HTML 用一个模型就能处理它们 由于已经将数据和业务规则从表示层分开 所以可以最大化的重用代码 由于模型返回的数据没有进行格式化 所以同样的构件能被不同界面使用 模型也有状态管理和数据持久性处理的功能 因为模型是自包含的 并且与控制器和视图相分离 所以很容易改变应用程序的数据层和业务规则 如果想把数据库从MySQL移植到Oracle 或者改变基于RDBMS数据源到LDAP 只需改变其模型即可 一旦正确的实现了模型 不管其数据来自数据库或是LDAP服务器 不用考虑 Android中集成的SQLite数据库已经能很好的解决我们的需求 由于运用MVC的应用程序的三个部件是相互独立 改变其中一个不会影响其它两个 所以依据这种设计思想你能构造良好的松偶合的构件 对我们来说 控制器也提供了一个好处 就是可以使用控制器来联接不同的模型和视图去完成用户的需求 这样控制器可以为构造应用程序提供强有力的手段 给定一些可重用的模型和视图 控制器可以根据用户的需求选择模型进行处理 然后选择视图将处理结果显示给用户 MVC的优点 低耦合性 视图层和业务层分离 这样就允许更改视图层代码而不用重新编译模型和控制器代码 同样 因为模型与控制器和视图相分离 所以很容易改变应用程序的数据层和业务规则 高重用性和可适用性 随着技术的不断进步 现在需要用越来越多的方式来访问应用程序 MVC模式允许你使用各种不同样式的视图来访问同一个服务器端的代码 它包括任何WEB HTTP 浏览器或者无线浏览器 WAP 比如 用户可以通过电脑也可通过手机来订购某样产品 虽然订购的方式不一样 但处理订购产品的方式是一样的 由于模型返回的数据没有进行格式化 所以同样的构件能被不同的界面使用 例如 很多数据可能用HTML来表示 但是也有可能用WAP来表示 而这些表示所需要的仅仅是改变视图层的实现方式 而控制层和模型层无需做任何改变 较低的生命周期成本 MVC使降低开发和维护用户接口的技术含量成为可能 快速的部署 使用MVC模式使开发时间得到相当大的缩减 它使程序员 Java开发人员 集中精力于业务逻辑 界面程序员 HTML和JSP开发人员 集中精力于表现形式上 可维护性 分离视图层和业务逻辑层也使得WEB应用更易于维护和修改 有利于软件工程化管理 由于不同的层各司其职 每一层不同的应用具有某些相同的特征 有利于通过工程化 工具化管理程序代码 Adroid应用程序构成 Activity活动1 最基本的Android应用程序组件 应用程序中 一个活动通常就是一个单独的屏幕 每一个活动都被实现为一个独立的类 并且从活动基类中继承而来 活动类将会显示由视图控件组成的用户接口 并对事件做出响应 大多数的应用是由多个屏幕显示组成 例如 一个文本信息的应用也许有一个显示发送消息的联系人列表屏幕 第二个屏幕用来写文本消息和选择收件人 再来一个屏幕查看消息历史或者消息设置操作等 这里每一个这样的屏幕就是一个活动 很容易实现从一个屏幕到一个新的屏幕并且完成新的活动 在某些情况下当前的屏幕也许需要向上一个屏幕活动提供返回值 比如让用户从手机中挑选一张照片返回通讯录做为电话拨入者的头像 Activity活动2 当一个新的屏幕打开后 前一个屏幕将会暂停 并保存在历史堆栈中 用户可以返回到历史堆栈中的前一个屏幕 当屏幕不再使用时 还可以从历史堆栈中删除 默认情况下 Android将会保留从主屏幕到每一个应用的运行屏幕 简单理解Activity代表一个用户所能看到的屏幕 Activity主要是处理一个应用的整体性工作 例如 监听系统事件 按键事件 触摸屏事件等 为用户显示指定的View 启动其他Activity等 所有应用的Activity都继承于android app Activity类 该类是Android提供的基层类 其他的Activity继承该父类后 通过Override父类的方法来实现各种功能 这种设计在其他领域也较为常见 Activity经常用到的事件 onKeyDown intkeyCode KeyEventevent 按键按下事件onTouchEvent MotionEventevent 点击屏幕事件onKeyUp intkeyCode KeyEventevent 按键松开事件onTrackballEvent MotionEventevent 轨迹球事件 编写EventActivity java EventActivity java publicclassEventActivityextendsActivity OverridepublicvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState setContentView R layout main OverridepublicbooleanonKeyDown intkeyCode KeyEventevent showInfo 按键 按下 returnsuper onKeyDown keyCode event OverridepublicbooleanonKeyUp intkeyCode KeyEventevent showInfo 按键 弹起 returnsuper onKeyUp keyCode event OverridepublicbooleanonTouchEvent MotionEvent event floatx event getX floaty event getY showInfo 你点击的坐标为 x y returnsuper onTouchEvent event publicvoidshowInfo Stringinfo Toast makeText EventActivity this info Toast LENGTH LONG show 执行程序 一个Activity就是一个屏幕 它既是用户操作的屏幕 也是Android显示内容的屏幕 那么必须有另一个功能 显示View 当Activity类被创建时 开发人员就可以通过setContentView 接口把UI加载到Activity创建的屏幕上 当然Activity不仅仅是可以全屏显示 也可以用其他方式实现 作为漂浮窗口 通过windowIsFloating的主题集合 或者嵌入到其它的Activity 使用ActivityGroup 大部分的Activity子类都需要实现onCreate 接口 onCreate 接口是初始化Activity的地方 在这儿通常可以调用setContentView 设置在资源文件中定义的UI 使用findViewById 可以获得UI中定义的控件 Activity生命周期三种状态包括 运行状态当Activity在屏幕的最前端 位于当前堆栈的顶部 它是可见的 有焦点的 可以用来进行处理用户的操作 点击 双击 长按等 那么就叫做激活或运行状态 值得注意的是 当Activity处于运行状态的时候 Android会尽可能的保持它的运行 即使出现内存不足等情况 Android也会先停止堆栈底部的Activity 来确保运行状态的Activity正常运行 暂停状态在某些情况下 Activity对用户来说 仍然是可见的 但不再拥有焦点 即用户对它的操作是没用实际意义的 在这个时候 它就是属于暂停状态 例如 当最前端的Activity是个透明或者没有全屏 那么下层仍然可见的Activity就是暂停状态 暂停的Activity仍然是激活的 它保留着所有的状态和成员信息并保持与Activity管理器的连接 但当内存不足时 可能会被停止 停止状态当Activity完全不可见时 它就处于停止状态 它仍然保留着当前状态和成员信息 然而这些对用户来说 都是不可见的 同暂停状态一样 当系统其他地方需要内存时 它也会被停止 生命周期事件 Activity状态的变化是人为操作的 而这些状态的改变 也会触发一些事件 称为生命周期事件 一共有7个 voidonCreate BundlesavedInstanceState voidonStart voidonRestart voidonResume voidonPause voidonStop voidonDestroy Activity生命周期 当打开一个Activity 如果该Activity实例不存在于Activity管理器中 就会触发onCreate事件 注意 Activity的实例不是我们自己创建的 是Android系统自己创建的 接下来是onStart事件 然后是onResume事件 此时Activity就处于了运行状态 编写MainActivity java 首先要重写7个相应被触发的方法 以日志的形式输出相应的事件信息 然后添加两个Button 一个用来启动新的Activity 另一个是用来退出当前Activity 代码略 在启动应用之后 当我们点击 打开新Activity 观看一下触发的相应事件 从Logcat控制台上看 新的Activity已经启动 而之前的Activity还处于可见状态 只是我们再去点击按钮已经没用 也就是失焦 此时 MainActivity处于暂停状态 OtherActivity处于运行状态 MainActivity转到OtherActivity 先触发自己的onPause 事件而后才是OtherActivity的生命周期事件 然后对应用稍作修改 先去除上面讲到的OtherActivity的android theme属性 使其能全屏显示 再次运行 查看运行结果 再次点击按钮 这时已经看不到MainActivity 说明现在MainActivity已经处于停止状态 而不是此前的暂停状态 对生命周期的总结 1 Activity从创建到进入运行状态所触发的事件 onCreate onStart onResume 2 当Activity从运行状态到停止状态所触发的事件

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论