Android开发入门ppt课件

上传人:钟*** 文档编号:4960370 上传时间:2020-01-15 格式:PPT 页数:150 大小:1.60MB
返回 下载 相关 举报
Android开发入门ppt课件_第1页
第1页 / 共150页
Android开发入门ppt课件_第2页
第2页 / 共150页
Android开发入门ppt课件_第3页
第3页 / 共150页
点击查看更多>>
资源描述
Android简介 1 什么是Android Android是一个专门针对移动设备的软件集一个操作系统 中间件和一些重要的应用程序AndroidSDK提供了在Android平台上使用Java语言进行Android应用开发必须的工具和API接口 2 Android特性 应用程序框架支持组件的重用与替换Dalvik虚拟机专为移动设备优化集成的浏览器基于开源的WebKit引擎优化的图形库包括定制的2D图形库 3D图形库基于OpenGLES1 0 硬件加速可选 SQLite用作结构化的数据存储多媒体支持包括常见的音频 视频和静态图像格式 如MPEG4 H 264 MP3 AAC AMR JPG PNG GIF GSM电话技术 依赖于硬件 蓝牙Bluetooth EDGE 3G 和WiFi 依赖于硬件 照相机 GPS 指南针 和加速度计 accelerometer 依赖于硬件 丰富的开发环境包括设备模拟器 调试工具 内存及性能分析图表 和Eclipse集成开发环境插件 3 Android架构 4 应用程序 Android会同一系列核心应用程序包一起发布 该应用程序包包括 所有的应用程序都是使用JAVA语言编写的 email客户端SMS短消息程序日历地图浏览器联系人管理程序等 5 应用程序框架 开发人员也可以完全访问核心应用程序所使用的API框架 该应用程序的架构设计简化了组件的重用 任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块 不过得遵循框架的安全性限制 同样 该应用程序重用机制也使用户可以方便的替换程序组件 隐藏在每个应用后面的是一系列的服务和系统 其中包括 丰富而又可扩展的视图 Views 可以用来构建应用程序 它包括列表 lists 网格 grids 文本框 textboxes 按钮 buttons 甚至可嵌入的web浏览器 内容提供器 ContentProviders 使得应用程序可以访问另一个应用程序的数据 如联系人数据库 或者共享它们自己的数据 6 应用程序框架 资源管理器 ResourceManager 提供非代码资源的访问 如本地字符串 图形 和布局文件 layoutfiles 通知管理器 NotificationManager 使得应用程序可以在状态栏中显示自定义的提示信息 活动管理器 ActivityManager 用来管理应用程序生命周期并提供常用的导航回退功能 7 Android平台程序库 Android包含一些C C 库 这些库能被Android系统中不同的组件使用 它们通过Android应用程序框架为开发者提供服务 以下是一些核心库 系统C库 一个从BSD继承来的标准C系统函数库 libc 它是专门为基于embeddedlinux的设备定制的 媒体库 基于PacketVideoOpenCORE 该库支持多种常用的音频 视频格式回放和录制 同时支持静态图像文件 编码格式包括MPEG4 H 264 MP3 AAC AMR JPG PNG SurfaceManager 对显示子系统的管理 并且为多个应用程序提供了2D和3D图层的无缝融合 LibWebCore 一个最新的web浏览器引擎用 支持Android浏览器和一个可嵌入的web视图 SGL 底层的2D图形引擎3Dlibraries 基于OpenGLES1 0APIs实现 该库可以使用硬件3D加速 如果可用 或者使用高度优化的3D软加速 FreeType 位图 bitmap 和矢量 vector 字体显示 SQLite 一个对于所有应用程序可用 功能强劲的轻型关系型数据库引擎 8 Android运行库 Android包括了一个核心库 该核心库提供了JAVA编程语言核心库的大多数功能 每一个Android应用程序都在它自己的进程中运行 都拥有一个独立的Dalvik虚拟机实例 Dalvik被设计成一个设备可以同时高效地运行多个虚拟系统 Dalvik虚拟机执行 dex 的Dalvik可执行文件 该格式文件针对小内存使用做了优化 同时虚拟机是基于寄存器的 所有的类都经由JAVA编译器编译 然后通过SDK中的 dx 工具转化成 dex格式由虚拟机执行 Dalvik虚拟机依赖于linux内核的一些功能 比如线程机制和底层内存管理机制 9 Linux内核 Android的核心系统服务依赖于Linux2 6内核 如安全性 内存管理 进程管理 网络协议栈和驱动模型 Linux内核也同时作为硬件和软件栈之间的抽象层 10 AndroidSDK核心包 android util包含有许多底层的工具类 例如专用容器类 XML工具等等 android os提供基本的操作系统服务 消息传递和进程间通讯 android graphics核心图形绘制包 android text android text method android text style andandroid text util提供丰富的文本处理工具 富文本支持以及输入法等等 android database包含数据库相关的底层API android content提供大量的访问存储在设备上的数据的服务 安装在设备上的应用及相关资源 用于持续的动态数据的内容提供器 contentprovider android view核心用户界面框架 android widget提供构建view包的标准用户界面元素 列表 按钮 布局管理器等等 android app提供高层应用模型 通过活动实现 11 AndroidSDK附加包 android provider包括了平台内的各个内容提供器 contentproviders 的定义 android telephony提供与设备的电话协议栈交互的API android webkit包含各种用于web内容的API 12 开发环境 安装AndroidSDK设置开发环境JDK6 0u14Eclipse3 5 Galileo AndroidSDK1 5ADT0 9 1 13 系统和软件需求 用Androidsdk的代码和工具开发Android应用程序 你需要适合的开发电脑以及开发环境 如下描述 所需操作系统 WindowsXP或VistaMacOSX10 4 8或更高版本 仅支持x86 Linux LinuxUbuntuDapperDrake版本已测试 所需开发环境 EclipseIDEEclipse3 3 Europa 3 4 Ganymede 3 5 Galileo EclipseJDT插件 大多数的EclipseIDE包包含 WST 可选 但Android编辑器的功能需要 它被包含在mostEclipseIDEpackages中 JDK5或JDK6 只有JRE是不够的 AndroidDevelopmentTools插件 可选 不兼容GNUJava编译器 gcj 其他开发环境或IDEJDK5或JDK6 仅有JRE不够 ApacheAnt1 6 5或更高版本 Linux和Mac环境下 1 7或更高版本 Windows环境下 不兼容GNUJava编译器 gcj 14 安装SDK 下载完SDK后 把 zip文件解压到你电脑上合适位置 默认情况下 SDK文件被解压到android sdk 文件夹 这个文件夹包含tools samples 等 请注意系统里SDK解压后的文件夹的名字和位置 当你安装Android插件和使用SDK工具时 你将需要引用这个文件夹 你可以添加SDKtools的文件夹路径到你的环境变量中 如上所述 tools 文件夹位于SDK文件夹中 Linux环境下 修改 bash profile或者 bashrc文件 找到环境变量设置的地方 加入tools 的绝对路径 如果找不到该设置 你需要新添加一行 exportPATH PATH toolsMac环境下 在你的home文件夹里面查找 bash profile 然后和linux一样处理 如果之前没有 bash profile文件 你可以创建一个新的 Windows环境下 右击我的电脑 并选择属性 在标签页高级 点击环境变量 当对话框出现 在系统变量栏目里双击路径 Path 并添加tools 文件夹的完整路径 添加tools到你的环境变量里 这样你可以运行AndroidDebugBridge adb 和其他tools下命令 而不需要输入完整路径名 需要说明的是 如果你升级你的SDK 需要将你的相应环境变量更新到新的位置 15 Eclipse插件 ADT 安装 使用EclipseIDE作为开发Android应用的环境 你可以安装支持Android工程和工具的通用插件AndroidDevelopmentTools ADT ADT插件包含强大的扩张 使得创建 运行和调试Android更快速 更简单 如果你不使用EclipseIDE 就不必下载和安装ADT插件下载和安装ADT插件 请按照你们各自Eclipse版本步骤安装 Eclipse3 3 Europa Eclipse3 4 Ganymede 开始Eclipse 然后选择Help SoftwareUpdates FindandInstall 对话框出现后 选择Searchfornewfeaturestoinstall点击Next 点击NewRemoteSite 在对话框中 输入远程站点的名字 如AndroidPlugin 输入站点如下 https dl 16 点击Finish ADT插件没有签名 你可以点击 InstallAll 来安装所有东西 重启Eclipse 启动Eclipse 选择Help SoftwareUpdates 在出现的对话框里 点击标签页AvailableSoftware 点击AddSite 输入下面的地址 https dl 17 ADT安装疑难解答 下载ADT压缩文件 不解压 按照默认安装的第一部和第二步 如上 在Eclipse3 3 点击NewArchiveSite InEclipse3 4 clickAddSite 然后点击Archive 浏览和选择已经下载的压缩文件 从第五步开始完成上面剩下的流程 更新你的插件 你必须按照这些步骤代替默认的更行说明 18 开发调试 介绍在android上开发调试应用程序创建编译运行调试 19 在eclipse上开发Android应用程序 在用eclipseIDE开发android应用程序之前 你首先要创建一个Android工程 并且建立一个启动配置 在此之后你才可以开始编写 运行 以及调试你的应用程序 20 创建一个Android工程 ADT提供了一个新的工程向导 你可以快速的创建一个新的工程或者在现有代码上创建工程 创建工程的步骤如下 选择File New Project选择Android AndroidProject 然后按下Next选择项目内容 选择Createnewprojectinworkspace 为编码创建一个全新的工程 输入工程名称 projectname 基础软件包的名称 thebasepackagename 以及Activity类的名称 以创建stub java文件等文件和程序名字 选择Createprojectfromexistingsource 为已有代码创建一个工程 如果你想编译运行SDK中提供的示例程序 可以使用这个选项 示例程序的存放在SDK的samples 目录下 浏览包含已有代码的目录 点击ok 如果目录中包含有可用的androidmanifest文件 ADT将为你填写合适的软件包 activity 和应用程序名称 按下Finish ADT插件会根据你的工程类型创建合适的文件和文件夹 如下 src 包含stub javaActivity文件的文件夹 res 资源文件夹 AndroidManifest xml工程清单 21 创建一个启动项 在eclipse上运行调试应用程序之前 你必须为它创建一个启动项 启动项指定哪个工程将被启动 哪个activity开始工作 以及使用哪些模拟器选项等 按照以下步骤为Eclipse版本的应用程序创建合适的启动项 打开启动项管理工具 在Eclipse3 3 Europa 的版本中 酌情选择Run OpenRunDialog orRun OpenDebugDialog 在Eclipse3 4 Ganymede 版本中 酌情选择Run RunConfigurations orRun DebugConfigurations 在左边的工程类型列表选择AndroidApplication选择 双击 或者点击右键选择new 创建一个新的启动项 输入启动项名称 在Android标签中 浏览要开始的工程和Activity 在Target标签中 设置想要显示的屏幕及网络属性 以及其他任何模拟器启动选项 你可以在Common标签中设置更多的选项 按下Apply保存启动配置 或者按下Run或Debug 22 运行和调试应用程序 可以按照以下的说明运行和调试应用程序了 从eclipse主菜单 根据情况选择Run Run或者Run Debug 开始运行或者调试活动启动项 注意 这里活动启动项是在运行配置管理中最最近一次选中的那个 它不一定就是在EclipseNavigation面板中选择的程序 如果有的话 设置和修改活动启动项 可以使用启动项管理工具 如何获得启动项管理工具可以参考创建一个启动项运行或调试应用程序将触发以下动作 启动模拟器 如果他还没有开始运行 编译工程 如果在上次编译的基础上修改过代码 将重新编译 在模拟器上安装应用程序 Run选项 开始运行程序 Debug在 Waitfordebugger 模式下启动程序 然后打开调试窗口并将EclipseJava调试器和程序关联 23 应用程序签名 一 Android系统要求所有的程序经过数字签名才能安装 如果没有可用的数字签名 系统将不许安装运行此程序 不管是模拟器还是真实设备 只要是android系统 这都适用 鉴于此原因 在设备或者是模拟器上运行调试程序之前 你必须为你的应用程序设置数字签名 理解android程序签名的重要几点 所有的程序都必须签名 没有被签名的程序 系统将不能安装 系统仅仅会在安装的时候测试签名证书的有效期 如果应用程序的签名是在安装之后才到期 那么应用程序仍然可以正常启用 你可以使用标准工具 KeytoolandJarsigner 生成密钥 来签名应用程序的 apk文件 24 应用程序签名 二 AndroidSDK工具可以帮助你在调试时给应用程序签名 ADT插件和Ant编译工具都提供了两种签名模式 debug模式和release模式debug模式下 编译工具使用JDK中的通用程序Keytool通过已知方法和密码创建秘锁和密钥 每次编译的时候 工具使用debug密钥签名应用程序的 apk文件 因为密码是已知的 工具不需要在每次编译的时候提示你输入密锁和密钥 测试证书期限 自创建时间起有一年的期限当你的应用程序已经准备release了 你可以在release模式下编译 release模式下 工具编译时不会将 apk文件签名 你需要用Keytool生成密钥和密锁 再用JDK中的Jarsigner工具给 apk文件签名 Market受理应用一般要求30年期限 25 使用ApiDemo示例应用程序 AndroidSDK包含了一套示例程序 他们验证了许多功能以及API的用法 ApiDemos软件包被提前安装在模拟器中 所以你可以启动模拟器 在主画面的应用程序抽屉里打开它 你也可以在 samples ApiDemos中找到源码 可用看看它 学习Demo的实现方法 如果你愿意 你还可以将ApiDemo的示例程序作为一个工程加载进来 修改并在模拟器上运行 然而 在这之前你首先要卸载之前已经安装的ApiDemos 如果你没有移除之前安装的版本而直接在开发环境中运行或修改ApiDemos 将会有安装错误 26 调试 Android有相当广泛的一套工具帮助你调试你的应用程序 DDMS 一个生动的程序 它支持端口转换 因此你可以在IDE中给你的代码下端点 支持抓取模拟器屏幕 线程和堆栈信息 以及许多其他功能 你还可以运行logcat重新获得Log信息 点击此连接查看更多信息 logcat 转储系统信息 这些信息包括 模拟器抛出错误时堆栈的运行过程以及日志信息 运行logcat 点击此连接 AndroidLog 输出模拟器上log文件信息日志类 如果你在DDMS上运行了logcat 你可以实时阅读这些信息 在你的代码中添加logging方法的调用 使用log类 你可以根据你想获得信息的重要程度不同调用Log v verbose Log d debug Log i information Log w warning 或者Log e error 来分派log信息Log i MyActivity MyClass getView Requestingitemnumber position 你可以用logcat阅读这些信息 Traceview Android可以将函数的调用情况以及调用时间保存到一个log文件中 你可以用图形阅读器Traceview查看详细内容 更多信息查看这个连接下的主题Eclipseplugin Eclipse插件整合了相当数量的工具 ADB DDMS logcatoutput 以及其它功能 点击此连接查看更多信息 DebugandTestDeviceSettings Android揭示了很多有用的设定 例如CPU使用率和帧速率 27 设备上的调试和测试设置 Android允许你设置多个设定以便你测试和调试程序 获得模拟器的开发设置 可以选择DevTools DevelopmentSettings 按照以下选项将打开开发设置页 或其中之一 Debugapp选择要被调试的程序 你不需要设置这个来关联调试器 但是这个变量有两个作用 防止Android在调试的断点处长时间停留时抛出错误 允许你选择WaitforDebugger选项来暂停程序启动 直到调试器被关联上 如下介绍 Waitfordebugger阻塞程序加载直到关联上调试器 这样你可以在onCreate 中设置端点 这在调试Activity的启动进程时很重要 当你改变这个选项 任何当前运行的程序实例将被杀死 为选中此框 你必须如上面介绍的选择一个调试程序 这和在代码中添加waitForDebugger 是一样的 Immediatelydestroyactivities告诉系统只要activity停止了就销毁它 犹如Android必须回收内存 这个在测试onSaveInstanceState Bundle onCreate android os Bundle 代码路径时非常有用 否则将难以生效 选择这个选项可能带来很多问题 因为他们没有保存程序的状态 Showscreenupdates选中这个选项时 屏幕上任何被重绘的矩形区域会闪现粉红色 这对于发现屏幕不必要的绘图很有用 ShowCPUusage在屏幕顶端显示一个CPU进度 显示CPU的使用情况 上面红色栏显示总的CPU使用率 下方绿色栏显示目前画面的CPU使用时间 注意 一旦打开次功能就不能关掉 除非重新启动模拟器 Showbackground没有activity屏幕显示时显示背景面板 这个通常在调试的时候才会发生 模拟器重起后这些设置仍被记忆 28 顶端调试技巧 快速堆栈转储从模拟器上获得堆转储 你可以登录adbshell 用 ps 命令找到你想要的进程 然后用 kill 3 堆栈使用轨迹将显示在log文件中 在模拟器屏幕上显示有用信息设备可以显示一些有用信息 例如CPU使用率 以及高亮显示重绘区域 可以在开发设定窗口打开和关闭这些功能 Settingdebugandtestconfigurationsontheemulator 中有详细介绍 你可以通过DalvikDebugMonitorService工具获得转储状态信息 请参考adb中介绍的dumpsysanddumpstate获得模拟器中应用程序状态信息 dumpsys 你可以通过DalvikDebugMonitorService工具获得dumpsys信息 参考adb中介绍的dumpsysanddumpstate 获得无线连接信息你可以通过DalvikDebugMonitorService工具获得无线连接信息 在Device菜单中选择 Dumpradiostate 29 记录跟踪数据你可以在activity中通过调用android os Debug startMethodTracing 来记录函数的调用以及其它跟踪数据 详细的参考RunningtheTraceviewDebuggingProgram 记录无线数据默认情况下系统不记录无线数据 数据很多 然而 你可以用下面的命令记录无线数据 adbshelllogcat bradio运行adbAndroid有adb工具 他提供了许多功能 包括移动和同步文件到模拟器上 改变端口 在模拟器上运行UNIXshell 详见Usingadb 获得模拟器屏幕截图DalvikDebugMonitorServer DDMS 可以抓取模拟器屏幕截图 使用调试帮助类Android为方便使用提供了调试帮助类 例如util Log和Debug 30 编译安装Android应用程序 Android要求专门的编译工具可以正确的编译资源文件和应用程序的其他部分 因此 你必须为你的应用程序建立一个专门的编译环境 专门Android编译器编译步骤包括 编译XML和其他资源文件并创建合适的输出格式 编译好的Android应用程序是一个 apk压缩文件 它含有 dex文件 资源文件 原data文件 以及其他文件 你可以通过scratch 或者源文件构造一个合适的Android工程 Android目前不支持的在本地代码上开发第三方应用程序 比较推荐的Andriod应用程序开发方法是useEclipsewiththeAndroidplugin 它支持编译 运行 调试Android应用程序 31 移出一个Android应用程序 移出一个安装在模拟器上的应用程序 你需要执行adb删除 apk文件 apk文件是在安装的时候发送到模拟器上的 使用adbshell进入设备的shell 切换到data app目录下 用rm命令删除apk文件 rmyour app apk设备应用程序管理器 32 四大组件 Android应用中的四种组件活动广播接收器服务内容提供器XML配置文件AndroidManifest xml 33 Android应用程序构成 一般情况Android应用程序是由以下四种组件构造而成的 活动广播接收器服务内容提供器并不是每个Andorid应用程序都必须构建这4个组件 有些可能由这些组件的组合而成 XML配置文件 它用于定义应用程序中需要的组件 组件的功能及必要条件等 这个文件是必须的 34 活动 活动是最基本的Andorid应用程序组件 应用程序中 一个活动通常就是一个单独的屏幕 每一个活动都被实现为一个独立的类 并且从活动基类中继承而来 活动类将会显示由视图控件组成的用户接口 并对事件做出响应 大多数的应用是由多屏幕显示组成 例如 一个文本信息的应用也许有一个显示发送消息的联系人列表屏幕 第二个屏幕用来写文本消息和选择收件人 再来一个屏幕查看消息历史或者消息设置操作等 这里每一个这样的屏幕就是一个活动 很容易实现从一个屏幕到一个新的屏幕并且完成新的活动 在某些情况下当前的屏幕也许需要向上一个屏幕动提供返回值 比如让用户从手机中挑选一张照片返回通讯录做为电话拨入者的头像 当打开一个新的屏幕时 之前一个屏幕会被置为暂停状态并且压入历史堆栈中 用户可以通过回退操回到以前打开过的屏幕 我们可以选择性的移除一些没有必要保留的屏幕 因为Android会把每个从桌面打开的程序保留在堆栈中 35 活动 Intent和IntentFilters 调用Android专有类Intent进行构屏幕之间的切换 Intent是描述应用想要做什么 Intent数据结构两最重要的部分是动作和动作对应的数据 典型的动作类型有 MAIN 活动的门户 VIEW PICK EDIT等 而动作对应的数据则以URI的形式进行表示 例如 要查看某一个人的联系方式 你需要创建一个动作类型为VIEW的intent 以及一个表示这个人的URI 与之有关系的一个类叫IntentFilter 当intent被要求做某事的时候 intentfilter用于描述一个活动 或者BroadcastReceiver 看下面 能够操作哪些intent 一个活动如果要显示一个人的联系方式时 需要声明一个IntentFilter 这个IntentFilter要知道怎么去处理VIEW动作和表示一个人的URI IntentFilter需要在AndroidManifest xml中定义 通过解析各种intent 从一个屏幕切换到另一个屏幕是很简单的 当向前导航时 活动将会调用startActivity myIntent 方法 然后 系统会在所有安装的应用程序定义的IntentFilter中查找 找到最匹配myIntent的Intent对应的活动 新的活动接收到myIntent的通知后 开始运行 当start活动方法被调用将触发解析myIntent的动作 这个机制提供了两个关键好处 活动能够重复利用从其它组件中以Intent的形式产生的一个请求活动可以在任何时候被一个具有相同IntentFilter的新的活动取代 36 广播接收器 可以使用BroadcastReceiver来让你的应用对一个外部的事件做出响应 比如 当电话呼入时 数据网络可用时 或者到了晚上时 BroadcastReceivers不能显示UI 它只能通过NotificationManager来通知用户这些有趣的事情发生了 BroadcastReceivers既可以在AndroidManifest xml中注册 也可以在代码中使用Context registerReceiver 进行注册 但这些有趣的事情发生时 你的应用不必对请求调用BroadcastReceivers 系统会在需要的时候启动你的应用 并在必要情况下触发BroadcastReceivers 各种应用还可以通过使用Context sendBroadcast 将它们自己的intentbroadcasts广播给其它应用程序 37 服务 一个服务是具有一段较长生命周期且没有用户界面的程序 比较好的一个例子就是一个正在从播放列表中播放歌曲的媒体播放器 在一个媒体播放器的应用中 应该会有多个活动 让使用者可以选择歌曲并播放歌曲 然而 音乐重放这个功能并没有对应的活动 因为使用者当然会认为在导航到其它屏幕时音乐应该还在播放的 在这个例子中 媒体播放器这个活动会使用Context startService 来启动一个服务 从而可以在后台保持音乐的播放 同时 系统也将保持这个服务一直执行 直到这个service运行结束 你可以通过阅读LifeCycleofanAndroidApplication获取更多关于服务的介绍 另外 我们还可以通过使用Context bindService 方法 连接到一个服务上 如果这个服务还没有运行将启动它 当连接到一个服务之后 我们还可以通过服务提供的接口与它进行通讯 拿媒体播放器这个例子来说 我们还可以进行暂停 重播等操作 38 内容提供器 应用程序能够将它们的数据保存到文件 SQLite数据库中 甚至是任何有效的设备中 当你想将你的应用数据与其它的应用共享时 内容提供其将会很有用 一个内容提供器类实现了一组标准的方法 从而能够让其它的应用保存或读取此内容提供器处理的各种数据类型 39 Activity AndroidActivityClass 类继承体系Activity生命周期及相应接口Activity启动及返回持久数据保存权限许可进程生命周期 40 Activity概述 activity是单独的 用于处理用户操作 几乎所有的activity都要和用户打交道 所以activity类创建了一个窗口 开发人员可以通过setContentView View 接口把UI放到activity创建的窗口上 当activity指向全屏窗口时 也可以用其他方式实现 作为漂浮窗口 通过windowIsFloating的主题集合 或者嵌入到其他的activity 使用ActivityGroup 大部分的Activity子类都需要实现以下两个接口 onCreate Bundle 接口是初始化activity的地方 在这儿通常可以调用setContentView int 设置在资源文件中定义的UI 使用findViewById int 可以获得UI中定义的窗口 onPause 接口是使用者准备离开activity的地方 在这儿 任何的修改都应该被提交 通常用于ContentProvider保存数据 为了能够使用Context startActivity 所有的activity类都必须在AndroidManifest xml文件中定义有相关的 activity 项 activity类是Android应用生命周期的重要部分 41 Activity类继承体系 activity类处于android app包中 继承体系如下 java lang Objectandroid content Contextandroid content ContextWrapperandroid view ContextThemeWrapperandroid app Activity直接继承子类 ActivityGroup AliasActivity ExpandableListActivity ListActivity非直接继承子类 LauncherActivity PreferenceActivity TabActivity 42 Activity生命周期 在系统中的Activity被一个Activity栈所管理 当一个新的Activity启动时 将被放置到栈顶 成为运行中的Activity 前一个Activity保留在栈中 不再放到前台 直到新的Activity退出为止 43 Activity的四种状态 1 在屏幕的前台 Activity栈顶 叫做活动状态或者运行状态 activeorrunning 2 如果一个Activity失去焦点 但是依然可见 一个新的非全屏的Activity或者一个透明的Activity被放置在栈顶 叫做暂停状态 Paused 一个暂停状态的Activity依然保持活力 保持所有的状态 成员信息 和窗口管理器保持连接 但是在系统内存极端低下的时候将被杀掉 3 如果一个Activity被另外的Activity完全覆盖掉 叫做停止状态 Stopped 它依然保持所有状态和成员信息 但是它不再可见 所以它的窗口被隐藏 当系统内存需要被用在其他地方的时候 Stopped的Activity将被杀掉 4 如果一个Activity是Paused或者Stopped状态 系统可以将该Activity从内存中删除 Android系统采用两种方式进行删除 要么要求该Activity结束 要么直接杀掉它的进程 当该Activity再次显示给用户时 它必须重新开始和重置前面的状态 44 Activity状态转换 Activity的重要状态转换 矩形框表明Activity在状态转换之间的回调接口 开发人员可以重载实现以便执行相关代码 带有颜色的椭圆形表明Activity所处的状态 45 生命周期图示 46 三个关键循环 Activity有三个关键的循环 1 整个的生命周期 从onCreate Bundle 开始到onDestroy 结束 Activity在onCreate 设置所有的 全局 状态 在onDestory 释放所有的资源 例如 某个Activity有一个在后台运行的线程 用于从网络下载数据 则该Activity可以在onCreate 中创建线程 在onDestory 中停止线程 2 可见的生命周期 从onStart 开始到onStop 结束 在这段时间 可以看到Activity在屏幕上 尽管有可能不在前台 不能和用户交互 在这两个接口之间 需要保持显示给用户的UI数据和资源等 例如 可以在onStart中注册一个IntentReceiver来监听数据变化导致UI的变动 当不再需要显示时候 可以在onStop 中注销它 onStart onStop 都可以被多次调用 因为Activity随时可以在可见和隐藏之间转换 3 前台的生命周期 从onResume 开始到onPause 结束 在这段时间里 该Activity处于所有Activity的最前面 和用户进行交互 Activity可以经常性地在resumed和paused状态之间切换 例如 当设备准备休眠时 当一个Activity处理结果被分发时 当一个新的Intent被分发时 所以在这些接口方法中的代码应该属于非常轻量级的 47 生命周期在接口中的定义 Activity的整个生命周期都定义在下面的接口方法中 所有方法都可以被重载 所有的Activity都需要实现onCreate Bundle 去初始化设置 大部分Activity需要实现onPause 去提交更改过的数据 当前大部分的Activity也需要实现onFreeze 接口 以便恢复在onCreate Bundle 里面设置的状态 publicclassActivityextendsApplicationContext protectedvoidonCreate BundlesavedInstanceState protectedvoidonStart protectedvoidonRestart protectedvoidonResume protectedvoidonPause protectedvoidonStop protectedvoidonDestroy 48 Activity的启动及返回 Activity的创建启动startActivity Intent Activity运行结果返回startActivityForResult Intent int setResult int onActivityResult int int Intent 49 Activity的启动及返回 续一 startActivity Intent 接口用于启动一个新的activity 新的activity将被放置到activity栈顶 使用一个单一的参数 描述activity的执行动作的Intent 有时候我们希望在activity结束的时候获得activity的反馈结果 例如 在一个activity中 让用户在一个联系人列表中选择某一个人 在该页面结束的时候 能够返回选中的人员信息 要做到这一点 需要调用startSubActivity Intent int 接口进行启动 第二个参数为调用者的标识 结果将在onActivityResult int int String Bundle 中返回 当一个activity退出时 可以调用setResult int 返回数据给上一级的activity 它必须支持结果编码 可以是标准的RESULT CANCELED RESULT OK 或者从RESULT FIRST USER开始的自定义编码 此外 还可以返回一个字符串 通常是URL的某一项数据 也可以返回一个包含任意内容的包 所有的返回信息都会反馈到上一级的Activity onActivityResult 接口 并带有上一级activity提供的原始标识号 如果一个子activity失败了 如崩溃了 父activity将会接收到一个RESULT CANCELED的结果编码 50 代码片段 publicclassMyActivityextendsActivity staticfinalintPICK CONTACT REQUEST 0 protectedbooleanonKeyDown intkeyCode KeyEventevent if keyCode KeyEvent KEYCODE DPAD CENTER Whentheusercenterpresses letthempickacontact startActivityForResult newIntent Intent ACTION PICK newUri content contacts PICK CONTACT REQUEST returntrue returnfalse protectedvoidonActivityResult intrequestCode intresultCode Intentdata if requestCode PICK CONTACT REQUEST if resultCode RESULT OK Acontactwaspicked Herewewilljustdisplayit totheuser startActivity newIntent Intent ACTION VIEW data 51 保存持久状态 一般来说 activity有两种持久状态需要处理 共享的文档类数据 典型的是使用了contentprovider存储在SQLite中 内在的状态 如用户的嗜好 针对内容提供的数据 google建议采用 编辑到位 的用户模型 也就是说 用户的编辑动作是立即有效的 无须进行额外的确认步骤 支持这个模式只需要简单遵守下面的两个规则 1 当创建一个新的文档时 相关的数据库条目和文件都是立即创建的 例如 用户选择写一个新的电子邮件 一旦开始写 则新的电子邮件条目创建出来了 所以如果进入其他的activity 则这封电子邮件将会出现在草稿箱中 2 当一个activity的onPause 接口被调用时 它应该提交用户的修改到内容提供者或者文件中 这样确保其他将要运行的activity能够看到这些变化 在整个activity的生命周期中 有很多时候都需要频繁提交数据 例如 在启动一个新的activity之前 在结束自己的activity之前 在输入字段进行切换的时候等等 52 保存持久状态 续一 这个模型是为了防止用户在activity之间浏览时的数据丢失 允许系统在activity停止后的任何时间里安全地杀掉activity 因为系统资源要用在其他地方 注意 这样意味着在activity里按了 返回 键并不等于 取消 它意味着activity的当前数据被保存下来 离开了activity 在一个activity中要取消编辑动作必须有另外一套机制来实现 比如一个清晰的 恢复 或者 撤销 动作 可以在contentpackage里面查看更多的内容提供者信息 有一些重要的方面 在activity调用和activity之间的数据传递的不同 activity也提供了一些API用于管理内在的状态 可以用在如浏览器中用户设置的缺省主页等 activity的持久状态由getPreferences int 来进行管理 允许获取或者修改一套 名字 值 的对 为了在多个应用程序组件 activities receivers services providers 之间共享持久状态 可以使用Context getSharedPreferences 接口获取一个共享对象 注意 不可能跨越应用程序包来共享数据 但是可以使用内容提供者来做 53 保存持久状态 例子 publicclassCalendarActivityextendsActivity staticfinalintDAY VIEW MODE 0 staticfinalintWEEK VIEW MODE 1 privateSharedPreferencesmPrefs privateintmCurViewMode protectedvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState SharedPreferencesmPrefs getSharedPreferences mCurViewMode mPrefs getInt view mode DAY VIEW MODE protectedvoidonPause super onPause SharedPreferences Editored mPrefs edit ed putInt view mode mCurViewMode mit 54 权限许可 当activity在manifest的标签中进行了声明 就有能力进行启动 其他的应用程序为了能够启动这个activity 需要在他们自己的manifest资源文件中的元素中进行声明 55 进程的生命周期 Android系统试图确保一个应用进程尽可能长久 但是在内存减少的时候最终要删除旧的进程 像ActivityLifecycle描述的一样 决定哪一个进程被删除是依据于和用户打交道的状态 一般来说 基于运行的activity的进程有四种状态 下面列出了重要的顺序 Android系统在杀掉重要进程之前先杀掉次要的进程 56 进程的生命周期 续一 1 前台的activity activity在屏幕的最前面 正和用户进行交互 是最重要的 如果这个activity使用的内存超过了设备提供的内存 作为最后手段才杀掉这个activity的进程 通常在这一点上表明设备已经达到了memorypagingstate 因为需要确保用户界面的交互 2 可见的activity 对用户可见 但不是在前台 如位于前台弹出对话框下面的界面 是很重要的 一般不会杀掉这个进程 除非为了确保前台activity的运行不得已而杀之 3 后台的activity 对用户不可见 已经暂停 不再重要 系统可以安全杀掉这个进程 回收内存给其他前台或者可见的进程 当用户按下 返回 键浏览这个activity 使它重新在屏幕上可见 它的onCreate Bundle 接口将被调用 在暂停的时候由于已经调用过onSaveInstanceState Bundle 接口重置了状态 因此这个activity能够重新以相同的设置启动 4 空进程是没有activity组件和其他应用程序组件 ServiceorIntentReceiver 的进程 在系统内存变低的时候很快就被删除了 出于这个原因 任何在activity之外的后台操作必须在IntentReceiver或者Service的环境下执行 这样才能确保进程能够一直运行 57 进程的生命周期 续二 有时候activity希望能够执行一些长时间的操作 自立存在于activity的生命周期之外 例如 相机应用程序允许用户上传一幅图片到网站 上传将花费很长的时间 应用程序应该允许用户离开正在执行的程序 为了完成这些 activity应该启动一个Service来执行上传任务 在上传区间 系统能够给进程一个良好的优先级别 比那些不可见的进程更高的优先级别 而不用考虑源activity是否处于暂停 停止或者结束状态 58 Intent Intent机制Intent用途Intent基本使用方法 59 概述 Intent这个英语单词的本意是 目的 意向 等Android中提供了Intent机制来协助应用间的交互与通讯Intent不仅可用于应用程序之间 也可用于应用程序内部的Activity Service之间的交互 相对函数调用来说 Intent是更为抽象的概念利用Intent所实现的软件复用的粒度是Activity Service 比函数复用更高一些 另外耦合也更为松散 60 概述 一个Intent类似于一个EventIntent类绑定一次操作 它负责携带这次操作所需要的数据以及操作的类型等Android中与Intent相关的还有Action Category及IntentFilter等 61 概述 Intent的两个最重要的成员操作类型 Action 和数据 Data Intent的Action的取值主要是一些定义好了的常量 例如PICK ACTION VIEW ACTION EDIT ACTION之类的Data则是一个ContentURI类型的变量Intent要定位事件的目的地 无外乎需要以下几个信息 1 种类 category 比如我们常见的LAUNCHER CATEGORY就是表示这是一类应用程序 2 类型 type 表示数据的类型 这是隐性Intent定位目标的重要依据 3 组件 component 常用的是setClass 不过也可以用setComponent来设置intent跳转的前后两个类实例 4 附加数据 extras 在ContentURI之外还可以附加一些信息 它是Bundle类型的对象 62 Intent用途 加载活动startActivity广播发送 访问广播接收器 broadcastIntent访问服务startService Intent bindService Intent ServiceConnection int 63 Intent基本用法 显式的Intent即在构造Intent对象时就指定接收者 这种方式与普通的函数调用类似 只是复用的粒度有所差别隐式的Intent即Intent的发送者在构造Intent对象时 并不知道也不关心接收者是谁 这种方式与函数调用差别比较大 有利于降低发送者和接收者之间的耦合 用于广播的Intent 64 显式Intent ExplicitIntent 同一个应用程序中的Activity切换通常一个应用程序中需要多个UI屏幕 也就需要多个Activity类 并且在这些Activity之间进行切换 这种切换就是通过Intent机制来实现的 在同一个应用程序中切换Activity时 我们通常都知道要启动的Activity具体是哪一个 因此常用显式的Intent来实现 65 显式Intent使用例子 一个非常简单的应用程序SimpleIntentTest 它包括两个UI屏幕也就是两个Activity SimpleIntentTest类和TestActivity类 SimpleIntentTest类有一个按钮用来启动TestActivity 66 例子代码 SimpleIntentTest packagecom tope samples intent simple importandroid app Activity importandroid content Intent importandroid os Bundle importandroid view View importandroid widget Button publicclassSimpleIntentTestextendsActivityimplementsView OnClickListener Calledwhentheactivityisfirstcreated publicvoidonCreate BundlesavedInstanceState super onCreate savedInstanceState setContentView R layout main ButtonstartBtn Button findViewById R id start activity startBtn setOnClickListener this 67 publicvoidonClick Viewv switch v getId caseR id start activity Intentintent newIntent this TestActivity class startActivi
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 压缩资料 > 基础医学


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!