• 1. 智能手机应用开发基础based on android 2011.7
  • 2. 内容包括: 1、Android 平台概述 2、搭建 Android 开发环境 3、第一个 Android 应用程序 4、Android 用户界面设计 5、Activity、Intent、Service、Broadcast Receiver 6、Android 中的数据存取 7、Android 的多媒体应用 8、应用实例:a、b、c、d
  • 3. 课程结构开放手机联盟(OHA) Android 平台综述: 平台介绍、开发者社区 开发环境: 构建 Android 开发环境 应用程序: 应用程序结构 典型应用: 用户界面、图形编程 数据存取、网络连接 硬件访问平台综述 开发环境程序结构数据存取网络连接硬件访问图形编程用户界面
  • 4. 获取 Android 资料的途径http://developer.android.com http://androidappdocs.appspot.com http://groups.google.com/group/android-developers/topics 下载 sdk 等相关软件 查看文档、在线帮助 开发社区 国内需要代理才能访问 http://www.android123.com.cn/ news、sdk下载 开发FAQ、源码下载、移植
  • 5. 1、Android 平台概述about android
  • 6. 开放手机联盟开放手机联盟(Open Handset Alliance): 美国 Google 公司于2007年11月5日发起组建的一个全球性的联盟组织。 网址:http://www.openhandsetalliance.com 联盟支持 Google 可能发布的手机操作系统或者应用软件,共同开发名为 Android 的开放源代码的移动系统 开放手机联盟成员已达 80 家,包括五大类: 手机制造商、手机芯片商 移动运营商 软件开发商、软件服务商
  • 7. 联盟创始成员Aplix、Ascender、Audience、Broadcom、中国移动、eBay、Esmertec、谷歌、宏达电、英特尔、KDDI、Living Image、LG、Marvell、摩托罗拉、NMS、NTT DoCoMo、Nuance、Nvidia、PacketVideo、高通、三星、SiRF、SkyPop、Sonic Network、Sprint Nextel、Synaptics、TAT、意大利电信、西班牙电信、德州仪器、T-Mobile 和 Wind River
  • 8. (本页无文本内容)
  • 9. Google Phone
  • 10. OHA 与 AndroidOHA 是一个软硬件开发者组织,包括 Google, NTT DoCoMo, Sprint Nextel, and HTC … 目标: 加速智能移动设备的发展 提供用户更多更好更便宜的服务 由 OHA 开发的 Android™,是第一个完整的、开放的、免费的智能移动开发平台。
  • 11. AndroidAndroid 软件系列包括操作系统、中间件和一些关键应用 基于 Linux 2.6 内核,使用 Java 开发应用程序 Android SDK 提供多种开发所必要的工具与 API
  • 12. 特点 1应用框架可以重复使用,其组件也可以更换 Dalvik 虚拟机针对移动设备进行了优化 优化的图形能力支持 2D/3D 图形(OpenGL ES 1.0 ) 集成了基于开源 WebKit 引掣的浏览器 采用 SQLite 实现结构化数据存储
  • 13. 特点 2多媒体支持多种音频、视频格式 GSM Telephony (hardware dependent) 支持蓝牙 Bluetooth,3G 和 WiFi 支持照相机、GPS、指南针和加速度仪等传感器硬件 丰富的开发环境,包括模拟机、调试工具、内存运行检测,以及为 Eclipse IDE 所写的插件
  • 14. 优势:开放性 源代码完全开放,便于开发人员更清楚的把握实现细节,便于提高开发人员的技术水平,有利于开发出更具差异性的应用 开放性对于 Android 的发展而言,有利于积累人气,这里的人气包括消费者和厂商,而对于消费者来讲,最大的受益之处在于丰富的软件资源 开放的平台也会带来更多竞争,如此一来,消费者将可以用更低的价位购得手机
  • 15. 优势:挣脱运营商的束缚 在过去很长的一段时间,特别是在欧美地区,手机应用往往受到运营商制约,使用什么功能接入什么网络,几乎都受到运营商的控制 自从 iPhone、GPhone 上市,用户可以更加方便地连接网络,运营商的制约减少 随着 2G 至 3G 移动网络的逐步过渡和提升,手机随意接入网络已不是运营商口中的笑谈
  • 16. 优势:丰富的硬件选择 由于 Android 的开放性,众多的厂商会推出千奇百怪,功能特色各具的多种产品 功能上的差异和特色,却不会影响到数据同步、甚至软件的兼容 例如:从诺基亚 Symbian 手机改用苹果 iPhone,此时还可将 Symbian 中优秀的软件带到 iPhone 上使用,联系人等资料更是可以方便地转移
  • 17. 优势:不受限制的开发商 采用了对有限内存、电池和 CPU 优化过的 Dalvik 虚拟机,Android 的运行速度比想象的要快很多 Android 的源代码遵循 Apache V2 软件许可,而不是通常的 GPL v2 许可,更有利于商业开发 Android 平台提供给第三方开发商一个十分宽泛、自由的环境,催生各种新颖别致的应用软件 具有强大的 Linux 社区的支持
  • 18. 优势:良好的盈利模式 3-7 开的盈利模式,使得产业链条的各方:运营商、制造商、独立软件生产商都可以获得不错的利益 将移动终端的评价标准从硬件向软件转变,极大的激发了软件开发者的热情
  • 19. 优势:无缝结合的 Google 应用 Google 成为最大的互联网络搜索引擎已经有 10 多年历史 从搜索巨人到全面的互联网渗透,Google 服务如地图、邮件、搜索等已经成为连接用户和互联网的重要纽带 Android 平台手机将无缝结合这些优秀的 Google 服务
  • 20. Android 不足由于采用了 Java 作为应用开发语言,目前可用的传统第三方应用还很少 Google 提供了一套 Java 核心包(J2SE 5,J2SE 6)的有限子集,尚不承诺遵守任何 Java 规范,可能会造成 Java 阵营的进一步分裂 基于 QEMU 开发的模拟器调试手段不十分丰富,只支持通话、SMS 等,速度慢 暂不具备 Push Mail 和 Office 功能,目前主要面向的是普通消费者用户,对商业用户支持尚弱
  • 21. 系统环境Android SDK 所支持的操作系统: Windows XP(32 bit)or Vista(32/64 bit) Mac OS X 10.5.8 or later(x86 only) Linux(tested on Linux Ubuntu Dapper Drake)
  • 22. Android 的系统架构
  • 23. Linux Kernel
  • 24. Linux KernelAndroid 基于 Linux 内核,但不是 Linux 内核提供系统核心服务,如进程、内存、电源管理,网络连接,驱动与安全等 并不包括全部的 Linux
  • 25. Linux KernelLinux 内核位于硬件和软件堆之间的抽象层 核心服务:安全机制、内存管理、进程管理、网络、硬件驱动 内核扮演的是硬件层和系统其它层次之间的一个抽象层的概念 操作系统的初始化和编程接口和标准 Linux 系统有所不同
  • 26. Libraries
  • 27. LibrariesBionic Libc:Google 自行开发,未采用标准 glibc Function Libraries Native Servers Hardware Abstraction Libraries
  • 28. Bionic LibcC/C++ 库:通过应用程序框架供各种 Android 组件使用,其功能包括: 媒体库:MPEG4 H.264 MP3 JPG PNG ..... WebKit/LibWebCore:Web 浏览引擎 SQLite 关系数据库引擎 2D,3D 图形库、引擎
  • 29. Function LibrariesWebKit 基于开源 WebKit的浏览器 支持 CSS、Javascript、DOM、Ajax 多媒体框架 基于 PacketVideo OpenCORE 平台 支持标准音频、视频 SQLite 轻型数据库,支持多种平台
  • 30. Native Servers:Surface为多种应用提供2D、3D表面设计
  • 31. Native Servers:Audio音频处理
  • 32. Hardware Abstraction Libraries硬件抽象层 HAL User space C/C++ library layer 硬件接口驱动 作用:隔离硬件接口与 Android 平台逻辑
  • 33. Andoid Runtime
  • 34. Andoid Runtime应用开发语言:Java Dalvik 虚拟机 指令 : Dalvik Excutable Java 标准库 把 Java 代码编译为 Dalvik 可执行文件(dex)
  • 35. Andoid Runtime核心库提供的 Java 功能、Dalvik 虚拟机依赖于 Linux 内核 可同时运行多个 Dalvik 虚拟机 每个 Android 应用程序在它自己的 Dalvik VM 实例中执行优化的 Dalvik 可执行文件(.dex) Dx-工具把编译过的 Java 文件转换为 dex 文件
  • 36. Dalvik Virtual MachineAndroid custom implementation virtual machine Provides application portability and runtime consistency Runs optimized file format (.dex) and Dalvik bytecode Java .class / .jar files converted to .dex at build time Designed for embedded environment Supports multiple virtual machine processes per device Highly CPU-optimized bytecode interpreter Efficiently Using runtime memory Core Libraries Core APIs for Java language provide a powerful, yet simple and familiar development platform
  • 37. DVM vs. JVMDVM Google Dalvik excutable bytecode 对便携设备有限的系统资源和供电进行了专门优化 JVM Sun Java bytecode 跨平台
  • 38. Applications Framework
  • 39. Applications FrameworkActivity manager 管理运行应用程序 Content Provider 在各应用之间共享数据 Notification Manager 显示用户提示和状态栏 Views System 可扩展显示,用于构建 UI
  • 40. Applications Framework核心应用: 联系人,邮件,电话,浏览器,日历,地图…… 充分访问所有核心应用的 API 简化组件的重用 用 Java 编写应用程序
  • 41. Applications
  • 42. ApplicationsJAVA 编写的应用程序 程序员、软件服务商……
  • 43. 开发环境、工具 IDE:Eclipse Eclipse plug-in: ADT(Android Development Tools) Software Development Kit: Android SDK Android Emulator: AVD(Android Virtual Device) Debuger: ADB(Android Debug Bridge) DDMS(Dalvik Debug Monitor Service)
  • 44. Android 版本历史  自 1.5 起,Android 用甜点作为系统版本代号,按26个字母的数序: Android 1.1:2008 年 9 月,代表机型:HTC G1 Android 1.5 Cupcake:2009 年 5 月 Android 1.6 Donut:2009 年 9 月 Android 2.0 Eclair:2009 年 10 月 Android 2.1 Eclair:2009 年 10 月 Android 2.2 Froyo:2010 年 5 月 20 日 Android 2.3 Gingerbread:2010 年 12 月 Android 2.4 Ice Cream Sandwich:即将发布 Android 3.0 Honeycomb:2011 年 1 月,针对平板设备的优化
  • 45. 最新消息2011年5月,在旧金山举办的 I/O 开发者大会上,Google 展示了 Android 2.4 版,侧重于解决设备分散问题,统一手机平台 2011年7月,installer_r12 开放下载 http://dl.google.com/android/installer_r12-windows.exe http://dl.google.com/android/android-sdk_r12-windows.zip http://developer.android.com 可直接访问
  • 46. 2、搭建 Android 开发环境before android
  • 47. 操作系统Windows XP(32-bit)or Vista(32/64-bit) Mac OS X 10.5.8 or later(x86 only) Linux(tested on Ubuntu Dapper Drake) 64-bit distributions must be capable of running 32-bit apps
  • 48. 开发包、工具软件:JDK:(only JRE not enough) http://www.oracle.com/technetwork/java/javase/downloads/index.html Eclipse: http://www.eclipse.org/downloads/ Android SDK: http://developer.android.com http://www.android123.com.cn/sdkxiazai/ ADT: https://dl-ssl.google.com/android/eclipse/
  • 49. Quick Start准备 安装 JDK (version 5 or 6) 安装 Eclipse(version 3.5 and higher ) 下载安装 SDK starter package 解压 starter package,修改系统变量 PATH 为 Eclipse 安装 ADT 插件 添加其它 SDK 组件 运行 Android SDK and AVD Manager, 选择并在线安装需要的开发包 Done!
  • 50. 安装 Java JDK下载 JDK 安装 配置系统变量: 新建 JAVA_HOME: C:\Program Files\Java\jdk1.6.0_25 新建 CLASSPATH: .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar; %JAVA_HOME%\lib\dt.jar 修改 PATH: 将 %JAVA_HOME%\bin; 添加在原变量值前
  • 51. 安装 Eclipse下载 Eclipse 解压 可选择的 Eclipse 版本: Eclipse IDE for Java EE Developers Eclipse IDE for Java Developers Eclipse Classic (versions 3.5.1 and higher) 常用快捷键: ctrl+Shift+O import package 更新 ctrl+Shift+F 代码自动排版 ctrl+/ 设置代码/注释
  • 52. Android 的 SDK 版本Android 2.3.4 Platform(new!) Android 2.2 Platform Android 2.1 update 1 Platform Android 1.6 Platform Android 1.5 Platform Older Platforms Android 2.0.1 Platform Android 2.0 Platform Android 1.1 Platform
  • 53.   据 Android Market 的近两周访问统计,目前 Android 2.2占总访问量的60%,而 Android 2.1和2.3.x均占18%,Android 1.x仅为4%,当然这和 Android 1.x用户可能近两周没有访问Market有关。Android 用户数量统计(2011年7月5日)
  • 54. 磁盘空间需求 不包括 JDK、Eclipse组件类型磁盘空间估算说明SDK Tools50 MB必须Android platform(each)150 MB至少一个SDK Add-on(each)100 MB可选USB Driver for Windows10 MBWindows 下必备Samples (per platform)20 MB可选Offline documents400 MB可选
  • 55. 安装 Android解压后,在 Eclipse 中 Install New Software…
  • 56. 详细步骤请参阅: Android开发环境搭建.doc
  • 57. Android 学习了解 Android、OHA 建立开发环境 阅读 SDK 文档: /docs/index.html 动手实现 Android 编程实例 背景知识 Java Object Oriented Programming 设计模式 Eclipse 应用 J2ME、Brew、Symbian(可选)
  • 58. 3、第一个 Android 应用程序on android
  • 59. Android 模拟器Android Emulator 可模拟电话本、通话等功能 内置的浏览器和 Google Maps 都可以联网 可以使用 PC 键盘输入(不包括小键盘) 可使用模拟器按键、键盘输入 可以使用鼠标单击、拖拽屏幕进行操作
  • 60. Android 模拟器Android 模拟器和真机的不同之处 不支持呼叫和接听实际来电,但可以通过控制台模拟电话呼入和呼出 不支持USB连接 不支持相机、视频捕捉 不支持音频输入,但支持输出 不支持扩展耳机 不能确定连接状态 不能确定电池电量水平和交流充电状态 不能确定 SD 卡的插入/弹出 不支持蓝牙 模拟器在 PC 机上产生的临时文件需要手工清理
  • 61. Android 虚拟机 DalvikDalvik 和标准 Java 虚拟机(JVM)首要差别 Dalvik 基于寄存器,相对于基于数据栈的 JVM,能够更快的编译较大的应用程序 Dalvik 和 JVM 运行环境的区别 Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例 每一个 Dalvik 应用作为一个独立的 Linux 进程执行,可防止在某一虚拟机崩溃的时候所有应用都被关闭 Dalvik 提供一个拥有较少限制许可证的平台
  • 62. Android 中重要的包Android.app :提供高层的程序模型、提供基本的运行环境 Android.content :包含各种的对设备上的数据进行访问和发布的类 Android.database :通过内容提供者浏览和操作数据库 Android.graphics :底层的图形库,可以将它们直接绘制到屏幕上. Android.location :定位和相关服务的类 Android.media :提供一些类管理多种音频、视频的媒体接口 Android.net :提供帮助网络访问的类,超过通常的 java.net.* 接口 Android.os :提供了系统服务、消息传输、IPC 机制 Android.opengl :提供 OpenGL 的工具 Android.provider :提供类访问 Android 的内容提供者 Android.telephony :提供与拨打电话相关的 API 交互 Android.view :提供基础的用户界面接口框架 Android.util :涉及工具性的方法,例如时间日期的操作 Android.webkit :默认浏览器操作接口 Android.widget :各 UI 元素(多数可见)在应用程序屏幕中使用
  • 63. Android 的文件格式java 文件:应用程序源代码 Android 本身相当一部分都是用 Java 编写而成 Android 的应用程序使用 Java 来开发 class 文件:Java 编译后的目标代码 Android 使用 Dalvik 来运行应用程序 Android 的 class 文件是编译过程中的中间目标文件,需要链接成 dex 文件才能在 Dalvik 上运行
  • 64. dex 文件:Android 平台上的可执行文件 Dalvik 虚拟机执行的是 dex 格式字节码,并非 Java 字节码 在编译 Java 代码之后,通过 Android 提供的 Dx 工具可以将 Java 字节码转换成 dex 字节码 Dalvik 针对手机应用、嵌入式 CPU 做过优化,可以同时运行多个 VM 实例而不占用过多系统资源
  • 65. apk 文件:Android 上的安装文件 apk 是 Android 安装包的扩展名,安装包内包含了与该 Android 应用程序相关的所有文件 Android 将 AndroidManifest.xml 文件、应用程序代码(.dex文件)、资源文件和其他文件打成一个压缩包,即 .apk apk 文件的本质是一个压缩包,一个工程只能打进一个 .apk 包
  • 66. Android 应用
  • 67. Android 应用
  • 68. Activity:活动Android 应用程序中最基本的组件,应用程序中一个Activity 通常就是一个单独的屏幕 每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并对事件做出响应 大多数的应用是由多个屏幕显示组成
  • 69. 示例:Hello world!on android
  • 70. HelloWorldEclipse 下自动生成 new android project → HelloWorld
  • 71. HelloWorld.javaJava 程序package test.helloworld; import android.app.Activity; import android.os.Bundle; public class HelloWorld extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }返回
  • 72. R.javaJava 程序/* AUTO-GENERATED FILE. DO NOT MODIFY. */ package test.helloworld; public final class R { public static final class attr { } public static final class drawable { public static final int icon=0x7f020000; } public static final class layout { public static final int main=0x7f030000; } public static final class string { public static final int app_name=0x7f040001; public static final int hello=0x7f040000; } }返回
  • 73. main.xmlxml 文件 Resources返回
  • 74. strings.xmlxml 文件 Hello World, everyone! HelloWorld 显示内容: Hello World, everyone!
  • 75. AndroidManifest.xmlxml 文件 返回
  • 76. RUNRUN
  • 77. 模拟器运行显示内容: Hello World, everyone!
  • 78. 命令行方式首先启动模拟器 emulator -avd SDK_2.1_Update1_API_7 然后连接模拟器: telnet localhost 5554 接下来,就可以拨打电话: gsm call 10086 或者是发送短信: sms send 10086 messagefrom10086 另:adb kill-server:关掉现有 adb Server    adb devices:显示运行中的设备
  • 79. 屏幕分辨率入门级的: QVGA(320x240) 主流的: HVGA(480x320) 主流的: WVGA800(800x480) moto特有的: WVGA854(854x480) 魅族 M9: 960x640 三星 Galaxy Tab P1000:1024x600(7 寸屏) 基准分辨率: VGA(640x480) HVGA-L 或是 -P:横屏、竖屏 模拟器的默认分辨率依 SDK 版本而不同
  • 80. Android project 的目录结构文件夹 src 文件夹 gen 文件夹 Android 2.1-update1 文件夹 assets 文件夹 res AndroidManifest.xml default.properties proguard.cfg项目 HelloWorld :
  • 81. Android project:src该文件夹是存放项目的源代码。新建项目时,系统生成了一个 HelloWorld.java 文件,它导入了两个类 android.app.Activity 和 android.os.Bundle,HelloWorld 类继承自 Activity 且重写了 onCreate 方法。 @Override:在方法前面加上 @Override 系统可以帮助检查方法的正确性。 例如,public void onCreate(……){……} 这种写法是正确的,如果写成 public void oncreate(……){……} 这样编译器会报错——The method oncreate(Bundle) of type HelloWorld must override or implement a supertype method,以确保你正确重写 onCreate 方法。如果不加 @Override,则编译器会认为是新定义了一个方法 oncreate,检测不出书写错误。
  • 82. android.app.Activity 类:因为几乎所有的 Activity 都是与用户交互的,所以该类关注创建窗口,可以用方法 setContentView(View) 将自定义的 UI 放到 Activity 里面。 有两个方法是几乎所有的 Activity 子类都实现的: onCreate(Bundle):初始化 Activity,用布局资源(layout resource)调用 setContentView(int) 方法定义 UI(main.xml)。 onPause():处理当离开该 Activity 时要做的事情,用户做的所有改变应该在这里提交(通常 Content Provider 保存数据)。
  • 83. android.os.Bundle 类:从字符串值映射各种可打包的(Parcelable)类型   Bundle:捆绑 例如该类提供了公有方法:public boolean containKey (String key),如果给定的 key 包含在 Bundle 的映射中返回 true,否则返回 false。
  • 84. Android project:gen该文件夹下面有一个项目创建时自动生成并实时更新的 R.java 文件,这个文件是只读的,不允许修改。 R.java 文件中定义了一个类 R,类中包含很多静态类,且静态类的名字都与 res 中的一个名字对应,即 R 类定义了 res 目录下所有资源的索引。 通过 R.java 程序可以很快地查找到需要的资源,另外通过检查 R.java 列表,编译器不会将没有被使用到的资源编译进应用程序包中,以减少手机中的空间占用。
  • 85. R:资源索引类
  • 86. Android project:Android 2.1-update1该文件夹下包含 Java 归档文件 android.jar,包含了构建项目所需的所有的 Android SDK 库和 APIs。 通过 android.jar 将应用程序绑定到 Android SDK 和 Android Emulator,这使得项目可以使用所有 Android 的库和包,并且可以在适当的环境中调试。 例如 HelloWorld.java 通过下面两行代码从 android.jar 导入了两个包: import android.app.Activity; import android.os.Bundle;
  • 87. Android project:res资源目录,包含项目中的资源文件并将其编译进程序包中。向此目录添加资源时,会被 R.java 自动索引。 res 中默认有三个子目录:drawabel、layout、values drawabel:包含应用程序可以用的图标、图像文件(*.png、*.jpg) layout:界面布局文件(main.xml)等 values:项目中所需要显示的各种文字。可以存放多个*.xml文件,还可以存放不同类型的数据,如 arrays.xml、colors.xml、dimens.xml、styles.xml
  • 88. Android project:assets该文件夹包含项目所需要使用到的诸如 mp3、视频文件,存放的也是资源文件。 与 res 文件夹存放的资源不同的是,assets 内的资源文件不会被 R 类索引,不能使用 R 的成员引用方式进行访问。
  • 89. Android project:AndroidManifest.xml 项目的总配置文件,存储整个项目的配置数据,记录了应用程序中所使用的各种组件,列出了应用程序所提供的功能,指出了应用程序使用到的服务(如电话、互联网、短信、GPS 等) 应用程序添加新的 Activity 时,也需在此注册后才能调用 AndroidManifest.xml 包含如下设置: application、permissions、Activities、Intent filters 等
  • 90. Android project:default.properties由 Android Tools 自动生成,不允许修改 文件中记录了项目中所需要的环境信息,比如Android API 的最低兼容版本等 项目 HelloWorld 的 default.properties 文件代码如下所示: # Project target. target=android-7
  • 91. Android project:proguard.cfgproguard 是 Java 类文件的压缩、优化、混淆器,用于删除没有用的类、字段、方法与属性,以使字节码达到最大程度地优化 作为配置文件,proguard.cfg 是 \android-sdk-windows\tools\lib\ 目录下的同名文件的副本 proguard.cfg 是在Android SDK 升级到 2.3 版后才出现的,同样不需要手工修改
  • 92. 4、Android 用户界面设计on android
  • 93. User Interface:用户界面UI 布局管理、事件响应机制:Java 的 UI 设计思想 布局管理 Layout 事件响应 Listener 图标 Icon 菜单 Menu 对话 Dialog 提示 Toast 风格和主题 定制组件 Widget
  • 94. User Interface:用户界面UI 布局管理、事件响应机制:Java 的 UI 设计思想 布局管理 Layout 事件响应 Listener 图标 Icon 菜单 Menu 对话 Dialog 提示 Toast 风格和主题 定制组件 Widget
  • 95. UI:布局管理 Layout 所有 UI 类均源于 View、ViewGroup, View 的子类称为组件(Widget), ViewGroup 的子类称为布局(Layout) ViewGroup 通过各种 Layout,控制所属 View 的显示位置,形成图示的组合设计  模式(Composite): ViewGroup (Layout)ViewViewViewViewViewViewGroup (Layout)
  • 96. UI:布局管理 Layout Layout:组件在 Activity 中的呈现方式即为”布局”,      布局中需要描述组件的大小、间距、对齐方式等 Layout 的创建: 首先将需要呈现的组件在 xml 配置文件中进行声明 然后在程序中通过 setContentView(View) 方法将视图呈现在 Activity 中 最后在程序中通过 findViewById(Id) 方法获得各组件实例
  • 97. UI:Layout 的种类LinearLayout FrameLayout TableLayout RelativeLayout AbsoluteLayout ListLayout RadioGroup GridView ………
  • 98. 实例:TextView、Button、 ImageView 等各个组件按线性布局垂直摆放线性布局 LinearLayout
  • 99. UI:LinearLayout线性布局 LinearLayout 方向:android:orientation="vertical "     android:orientation="horizontal " 对齐:android:gravity="top " (bottom/left/right) 大小:android:layout_width="wrap_content "    android:layout_width="fill_parent "
  • 100. UI:FrameLayout从屏幕左上角 (0,0) 坐标开始布局 所有组件都钉到屏幕的左上角 不能为组件指定位置,所有组件均在 (0,0) 坐标放置 多个组件层叠排序,后面的组件覆盖前面的组件
  • 101. UI:TableLayout以行、列表格的形式布局各组件 使用 TableRow 对象来定义多行 单元格不能横跨行 不显示行、列或是单元格边界线
  • 102. UI:AbsoluteLayout需明确指明各组件确切的屏幕坐标(X,Y) (0,0) 为左上角,组件下移或右移时,坐标值增加 注意: 通常不建议使用 AbsoluteLayout,因为绝对布局在不同尺寸和分辨率的设备显示中不能很好地工作 Android 2.0 API 文档中标示该布局已过时
  • 103. UI:RelativeLayout指明各组件相对于其他组件(通过 Id)或相对于父布局对象的位置,跟 AbsoluteLayout 相反 在 RelativeLayout 布局里的各控件具备多种排列属性: Layout above:控件在指定控件的上方 Layout below:控件在指定控件的下方 Layout to left of …… 使用 RelativeLayout 布局的时候,程序运行时应尽量不去更改各组件的相对布局,以免组件间布局冲突
  • 104. User Interface:用户界面UI 布局管理、事件响应机制:Java 的 UI 设计思想 布局管理 Layout 事件响应 Listener 图标 Icon 菜单 Menu 对话 Dialog 提示 Toast 风格和主题 定制组件 Widget
  • 105. UI:事件处理机制延用了 Java 的事件处理机制,Android 中事件处理同样包括三个部分:    事件源:产生事件的组件、硬件、资源等    事件:单击事件、按键事件等    事件监听器:Listener,用于监听事件的发生
  • 106. UI:Listener常用的事件处理方法: OnClickListener() OnFocusChangeListener()button0=(Button)findViewById(R.id.button0); button0.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent=new Intent(MainActivity.this, Common_Widget_Test.class); startActivity(intent); } });
  • 107. User Interface:用户界面UI 布局管理、事件响应机制:Java 的 UI 设计思想 布局管理 Layout 事件响应 Listener 图标 Icon 菜单 Menu 对话 Dialog 提示 Toast 风格和主题 定制组件 Widget
  • 108. UI:关于 Icon应用程序需要各种各样的图标:icon 文件 icons 要有多样化的形状和样式,但又要形成统一的视觉风格,其尺寸和定位也需要统一: 红色边框为图标尺寸 蓝色边框是图形尺寸,比图标尺寸稍小,图形之外的空间用于显示阴影和特殊效果 橙色边框是另外一种图形尺寸。两种类型的图形尺寸可以达到统一的视觉权重
  • 109. UI:Icon 的风格符合当下的流行趋势,避免过度使用隐喻 高度简化和夸张,小尺寸图标也能易于识别,不宜太复杂 尝试抓住程序的主要特征,比如音像作为音乐的 icon 使用自然的轮廓和形状,看起来几何化和有机化,不失真实感。 采用前视角,几乎没有透视,光源在顶部。 不光滑但富有质感。
  • 110. User Interface:用户界面UI 布局管理、事件响应机制:Java 的 UI 设计思想 布局管理 Layout 事件响应 Listener 图标 Icon 菜单 Menu 对话 Dialog 提示 Toast 风格和主题 定制组件 Widget
  • 111. UI:关于 MenuAndroid 系统提供三种菜单:    options menu(选项菜单)通过点击 MENU 键来显示    context menu(上下文菜单)在某 View 上长按 2s 后显示    sub menu(子菜单)显示为浮动列表,在以上两种菜单的菜单项被选中时显示出来;    前二者都有可以嵌套子菜单,而子菜单本身不能再嵌套 Android 系统具备对菜单项进行分组的功能,可以把相似功能的菜单项分成同一个组;菜单项分组后,可以调用 setGroupCheckable、setGroupEnabled、setGroupVisible 等方法来统一设置整个菜单项分组的属性,而无须一个一个单独设置
  • 112. UI:options menu 主菜单options menu 显示在屏幕下方,最多只能显示 6 个菜单项,称为 icon menu(不支持 checkable 属性);其余菜单项会以 more icon menu 来调出,称为 expanded menu options menu 通过 Activity 的 onCreateOptionsMenu 方法来生成,这个函数只会在 menu 第一次生成时调用 可在 menu 显示前调用 onPrepareOptionsMenu 方法来实现对菜单的更改 onOptionsItemSelected 方法在选中菜单项后被调用,实现菜单项的响应
  • 113. UI:sub menu 子菜单一个浮动菜单列表,通过在选项菜单或上下文菜单选择菜单项显露出来 不支持嵌套子菜单 // 其他的 item 定义 // 其他的 item 定义
  • 114. 实例:Test_of_WidgetMainActivity.java 中指定主菜单 xml 文件 重写 onOptionsItemSelected() 方法public boolean onCreateOptionsMenu(Menu menu) { menuInflater.inflate(R.menu.menu_filesystem, menu); return true; }public boolean onOptionsItemSelected(MenuItem item) { switch(item.getItemId()){ case R.id.about: aboutAlert("使用xml实现菜单");break; case R.id.exit: exitAlert("确认要退出吗?");break; } return true; }private void aboutAlert(String msg){ …… } private void exitAlert(String msg){ …… }
  • 115. \res\menu\menu_filesystem.xml 定义菜单 ...
  • 116. 运行结果:
  • 117. 运行结果:
  • 118. UI:context menu 右键菜单context menu 是跟某个具体的 View 绑定在一起的 在 Activity 中用 registerForContextMenu 方法来为某个 View 注册 context menu context menu 在显示前都会调用 onCreateContextMenu 方法来生成 menu @Override public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) { menu.add(0, ITME1, 0, "红色背景"); menu.add(0, ITME2, 0, "绿色背景"); menu.add(0, ITME3, 0, "蓝色背景"); }registerForContextMenu(textView00);
  • 119. onContextItemSelected 方法处理菜单项选中事件@Override public boolean onContextItemSelected(MenuItem item) { // TODO Auto-generated method stub switch(item.getItemId()){ case ITEM1: textView00.setBackgroundColor(Color.RED);break; case ITEM2: textView00.setBackgroundColor(Color.GREEN);break; case ITEM3: textView00.setBackgroundColor(Color.BLUE);break; } return true; }private static final int ITEM1 = Menu.FIRST; private static final int ITEM2 = Menu.FIRST+1; private static final int ITEM3 = Menu.FIRST+2;
  • 120. 运行结果:
  • 121. User Interface:用户界面UI 布局管理、事件响应机制:Java 的 UI 设计思想 布局管理 Layout 事件响应 Listener 图标 Icon 菜单 Menu 对话 Dialog 提示 Toast 风格和主题 定制组件 Widget
  • 122. UI:关于 DialogAndroid 中对话框主要有:普通对话框、选项对话框、单选多选对话框、进度对话框、日期对话框、时间对话框等 在程序中可以通过方法 onCreateDialog 来完成对话框的创建,调用 showDialog 方法传入对话框的id来显示指定对话框 关闭对话框可用 dismiss 方法实现,也可以调用 removeDialog 方法来彻底释放对话框 onDismissListener 方法可在关闭对话框时执行一些特定工作
  • 123. 实例:Test_of_Widgetbutton1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { showDialog(0); } }); protected Dialog onCreateDialog(int id) { ProgressDialog pD = new ProgressDialog(this); pD.setIcon(R.drawable.icon); pD.setTitle("ProgressDialog测试"); pD.setIndeterminate(true); pD.setMessage("我只是测试代码,看看...."); pD.setCancelable(true); pD.setButton(Dialog.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } } ); return pD; }
  • 124. UI:Dialog
  • 125. UI:Dialog
  • 126. User Interface:用户界面UI 布局管理、事件响应机制:Java 的 UI 设计思想 布局管理 Layout 事件响应 Listener 图标 Icon 菜单 Menu 对话 Dialog 提示 Toast 风格和主题 定制组件 Widget
  • 127. UI:关于 ToastToast:    当用户执行某一动作后,系统自动显示提示信息,显示一段时间后自动消失,是为 “Toast” 程序中创建 Toast: 调用 Toast 的静态方法 makeText() 设置现实文本和时长 调用 Toast 的 show() 方法显示
  • 128. 实例:Test_of_Stringfinal int l = Toast.LENGTH_LONG; final int s = Toast.LENGTH_SHORT; final String s1 = "我会多显示一会儿,呵呵"; final String s2 = "我少显示一会儿,呵呵"; button1.setOnClickListener(new OnClickListener() { public void onClick(View v) { Toast t1 = Toast.makeText(getApplicationContext(),s1,l); t1.show(); } }); button2.setOnClickListener(new OnClickListener() { public void onClick(View v) { Toast t2 = Toast.makeText(getApplicationContext(),s2,s); t2.show(); } });
  • 129. 实例:Test_of_Toast
  • 130. User Interface:用户界面UI 布局管理、事件响应机制:Java 的 UI 设计思想 布局管理 Layout 事件响应 Listener 图标 Icon 菜单 Menu 对话 Dialog 提示 Toast 风格和主题 定制组件 Widget
  • 131. UI:关于 Style & Theme风格(style),是指能应用于布局文件中的单一组件的一套格式属性集合。比如为一个 TextView 组件定义一套风格并在其中指定字体的大小和颜色。 主题(theme),是指能应用于一个或者多个 Activity 的一套格式属性的集合。比如定义一个主题,指定窗口框架颜色和面板的前景色和背景色,并且为菜单指定字体的颜色和大小,应用于一个 Activity。
  • 132. UI:Style            30px    #FFFF0000    bold serif            设置字体、字号、颜色、加粗
  • 133. UI:Theme //仅应用到单一 Activity   //应用到整个程序所有 Activity  设置背景图片、无窗口框、无标题、设置前景色、全屏
  • 134. UI:Color 常量android.graphics.Color 中定义了颜色值 Color.BLACK Color.BLUE Color.CYAN Color.DKGRAY Color.GRAY Color.GREEN Color.LTGRAY Color.MAGENTA Color.RED Color.TRANSPARENT Color.WHITE Color.YELLOW
  • 135. User Interface:用户界面UI 布局管理、事件响应机制:Java 的 UI 设计思想 布局管理 Layout 事件响应 Listener 图标 Icon 菜单 Menu 对话 Dialog 提示 Toast 风格和主题 定制组件 Widget
  • 136. UI:关于 Widget Widget 是 Android 1.5 引入的新特性,允许程序显示一些常用而又重要的信息在用户的桌面主屏上 标准的 Android 系统映像包含了一些示例 widgets,包括指针时钟、音乐播放器和其他工具如 Google 搜索栏 Widget 即是可由用户自己编写的功能控件 用户在主屏幕(HomeScreen)的空白区域长按,选择菜单的 Widgets 项,即可选取所需的控件显示在主屏幕上 用户可自行设计一个 Widget,使得和其它 Widget 以及主屏幕其它元素保持风格一致
  • 137. UI:Widget 设计典型的 Android Widget 主要有三个组成部分:一个限位框,一个框架,还有 Widget 的图形控件以及其它元素 设计周全的 Widget 会在限位框边缘与框架之间,及框架内边缘与 Widget 的控件之间都保留一些内填充(内补白) Widget 的外观应被设计得与主屏幕的其它 Widget 相匹配,并以主屏幕的其它元素为依据对齐,也应使用标准的阴影效果 更多信息,可参考开发者指南的 AppWidgets 章节
  • 138. UI:不同方向的 Widget
  • 139. 5、Activity,Intent,Service, Broadcast Receiver,on android
  • 140. Activity Intent Service Broadcast Receiver
  • 141. Activity:窗口Android 应用程序中最基本的组件,应用程序中一个Activity 通常就是一个单独的屏幕、窗口 每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并对事件做出响应 大多数的应用是由多个屏幕显示组成 在某些情况下当前的屏幕也许需要向上一个屏幕活动提供返回值,比如让用户从手机中挑选一张照片返回通讯录做为电话拨入者的头像
  • 142. Activity 的生命周期onCreate() onStart() onResume() onPause() onStop() onRestart() onDestroy()
  • 143. Activity 的状态① active:    当一个 Activity 在屏幕的最上层时(Activity 栈的最顶端),处在 active 或者 running 状态 ② paused:    如果一个 Activity 失去焦点(focus)但还看得到它的画面,则处在 paused 状态。此时 该Activity 本身所有的状态及数据都还是存在的,也跟窗口管理程序 window manager 保持着联系着 ③ stop:    如果一个 Activity 被其它的 Activity 完全的遮盖住时,处于 stop 状态,它仍然保有全部的状态及数据,但因为它已不再被使用者看见,画面不再需要更新
  • 144. Activity:状态转换与生命周期
  • 145. Android 的进程优先级前台进程(Active Process): 前台 Activity、包含正在运行的广播接收器、正在运行的服务 可视进程(Visible Process): 包含一个可视化的 Activity 服务进程(Started Service Process): 包含一个被开启的服务(处理服务,不是直接可视,例如媒体播放器,网络上传、下载等) 后台进程(Background Process): 包含一个不可视的 Activity(随时可以结束该进程来回收内存) 空进程(Empty Process): 没有持有任何应用程序组件高低
  • 146. Activity Intent Service Broadcast Receiver
  • 147. Intent:组件之间的使者Intent:不同组件之间通信的“媒介”,用于描述程序想要做什么 Intent 可以包括: 动作 Action 数据 Data,以 URI 的形式表示 分类 Category 类型 Type 组件 Component 扩展信息 Extra 常用于启动新的 Activty、Service 或是发起新的 Broadcast 等
  • 148. 用于启动一个新的Activity,实现多个Activity 间的切换 定义并实例化一个 Intent 调用 startActivity() 方法启动新的 Activitybutton0=(Button)findViewById(R.id.button0); button0.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent=new Intent(MainActivity.this, Common_Widget_Test.class); startActivity(intent); } });
  • 149. 实例:Test_of_Intent_Action给 uri 赋值、并设为 Intent 的数据 Data 设置 Intent 的 动作 Action 调用 startActivity() 转向新的窗口,Intent中指明了新 Activity 的信息case 0: string="tel:5556"; uri=Uri.parse(string); intent.setAction(Intent.ACTION_DIAL); intent.setData(uri); this.startActivity(intent); break; case 1: string="tel:5556"; uri=Uri.parse(string); intent.setAction(Intent.ACTION_CALL); intent.setData(uri); this.startActivity(intent); break; case 2: string="http://www.lzu.edu.cn"; uri=Uri.parse(string); intent.setAction(Intent.ACTION_VIEW); intent.setData(uri); this.startActivity(intent); break;
  • 150. 运行结果:
  • 151. 运行结果:
  • 152. IntentFilter用于描述该 Activity 能够操作哪些 Intent IntentFilter 需要在 AndroidManifest.xml 中定义 程序主界面启动时显示
  • 153. IntentReceiverIntentReceiver 在 AndroidManifest.xml 中注册,也可在代码中使用 Context.registerReceiver() 进行注册 当一个 IntentReceiver 被触发时,系统会在需要的时候启动程序 各种应用还可以通过使用 Context.broadcastIntent() 将自己的 IntentReceiver 广播给其它应用程序 虽然 IntentReceiver 在指定的事件发生时,会使用 NotificationManager 通知用户,但并不生成一个 UI
  • 154. Activity Intent Service Broadcast Receiver
  • 155. Service:后台服务后台运行,几乎不与用户交互,没有可视化界面 与 Activity 一样,同属 Android 基本组件 同样需要在 AndroidManifest.xml 中注册
  • 156. Service:后台服务每一个服务均继承自父类 Service 同样以 startService() 方法启动服务 button1=(Button)findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent1=new Intent(Runnable_Service_Test.this, Runnable_Service.class); intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startService(intent1); } });
  • 157. 实例:Test_of_Serviceprivate Runnable task1 = new Runnable() { public void run() { intCounter++; Log.i("test", "int Counter:" +Integer.toString(intCounter)); Toast.makeText(getApplicationContext(), Integer.toString(intCounter), Toast.LENGTH_SHORT) .show(); handler1.postDelayed(task1, 1000*second); } };Runnable: 允许服务持续运行,即使启动服务的应用退出 类似于 定时器中断的中断服务程序
  • 158. 运行结果:
  • 159. Activity Intent Service Broadcast Receiver
  • 160. Broadcast Receiver:系统级别的事件处理机制 UI的事件处理机制:程序、组件级别的 sendBroadcast(Intent intent)方法 发送广播 BroadcastReceiver.onReceive()方法 接收广播并做相应处理 多个广播接收器可能同时接收同一个广播Broadcast Receiver:广播接收器
  • 161. 标准的 Broadcast Action 常量: ACTION_TIME_CHANGED 时间改变 ACTION_DATE_CHANGED 日期改变 ACTION_BATTERY_LOW 电量不足 ACTION_MEDIA_EJECT 插拔外部媒体 ACTION_BOOT_COMPLETED 启动完成 …… 用户自定义广播事件
  • 162. 实例:Test_of_BroadcastReceiver_Send(1)Main Activity中定义一个 Button,其单击事件中准备数据并发起广播private int i = 0; private static final String TESTACTION = "test.broadcast.SEND"; button1=(Button)findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent intent1=new Intent(); intent1.setAction(TESTACTION); i++; intent1.putExtra("message","这是第 "+ i +" 次广播……"); sendBroadcast(intent1); } });
  • 163. (2)定义继承自 BroadcastReceiver 类的Receiver1 类,用于接收广播并回显信息import android.content.Context; import android.content.Intent; import android.widget.Toast; import android.content.BroadcastReceiver; public class Receiver1 extends BroadcastReceiver{ public void onReceive(Context ctx,Intent intent){ String string1=intent.getStringExtra("message"); Toast.makeText(ctx, string1, Toast.LENGTH_SHORT).show(); }; }
  • 164. (3)在 AndroidManifest 文件中注册广播接收器类 Receiver1,并指明其用于接收识别的 action
  • 165. 运行结果:
  • 166. 实例:Test_of_BroadcastReceiver手机接收到短信时以 Toast 显示短信息 首先注册一个 receiver : 所用 Action 为系统常量
  • 167. 定义广播接收器 SMS_Receiver 类,继承自类 BroadcastReceiver 并重写 onReceive(): stringBuilder1:生成 Toast 信息字符串 bundle1:绑定到接收到的短信上以获取数据private static final String SMSRECEIVED =     "android.provider.Telephony.SMS_RECEIVED"; public void onReceive(Context ctx, Intent intent) {  if(intent.getAction().equals(SMSRECEIVED)){   StringBuilder sB1 = new StringBuilder();   Bundle bundle1 = intent.getExtras();  }stringBuilder1
  • 168. 然后获取短信内容,组织字符串并显示:if(bundle1 != null){ Object[] object1 = (Object[])bundle1.get("pdus"); SmsMessage[] msg1 = new SmsMessage[object1.length]; for(int i=0;i
  • 169. 程序开始时的 Activity 不需要做任何工作 关闭 Activity 后,仍可后台接收
  • 170. 发送短信的方式: (1)Emulator Control: (2)adb 命令:sms send 10086 ???? (3)模拟器之间互发:5554←→5556 (3)模拟器自发自收:5554←→5554
  • 171. 6、Android 中的数据存取on android
  • 172. 数据存取方式Preference “键-值”方式存储,以 xml 文件的形式保存 File 采用 java.io.* 库所提供 I/O 接口读写文件 SQLite SQLite 是轻量级的嵌入式数据库引擎 Content Provider 用于实现不同应用程序之间的数据共享
  • 173. 1、Preference主要用于存储数据较少的场合,比如配置信息 文件位置:/data/data/<包>/shared_prefs/***.xml 需要用到接口:SharedPreferences 及其内部接口:SharedPreferences.Editor 取得接口: Context.SharedPreferences(filename,mode) SharedPreferences.edit() 数据类型、数据操作: int、flaot、string、boolean等 putString(key,value) getString(key,defValue)
  • 174. 实例:Test_of_Preference定义 main.xml: 一个 EditText 用于键入数据 三个 Button 分别用于将数据写入 xml 文件、从文件获取数据并显示、清除文件中的数据 定义 sharedpreferences.xml: 一个 TextView 用于显示从文件中获取的数据et1=(EditText)findViewById(R.id.editText1); button1=(Button)findViewById(R.id.button1); button2=(Button)findViewById(R.id.button2); button3=(Button)findViewById(R.id.button3); textView1=(TextView)findViewById(R.id.textView1);
  • 175. 创建接口 sp1、spEditor1 以键值 方式加入数据 以 String Key 为索引来获取数据 清除数据 private SharedPreferences sp1; sp1 = this.getSharedPreferences("test", MODE_PRIVATE); SharedPreferences.Editor spEditor1 = sp1.edit();spEditor1.putString("TEXT",et1.getText().toString()); spEditor1.commit();String string1 = sp1.getString("TEXT", ""); textView1.setText(string1);spEditor1.clear().commit();
  • 176. 运行结果:
  • 177. (本页无文本内容)
  • 178. 2、File文件可用来存放大量数据,如文本、图片、音频等 默认位置:/data/data/<包>/files/***.*** java.io.* 库提供 I/O 接口实现本地文件读写 文件输入流的获取 Context.openFileInput(String name) 文件输出流的获取 Context.openFileOutput(String name, int mode) 包内资源(res/raw/)文件的读取 Resources.openRawResource(R.raw.file)
  • 179. 实例:Test_of_File定义 main.xml: 两个 EditText、两个 Button 写文件 writeFile(str):private void writeFile(String str){ try{ FileOutputStream output= openFileOutput(FILE_NAME,MODE_APPEND); output.write(str.getBytes()); output.close(); }catch(Exception e){ Log.e("File_IO", e.toString()); this.finish(); } }
  • 180. 读文件 readFile():private String readFile(){ try{ FileInputStream input = openFileInput(FILE_NAME); byte[] buffer = new byte[input.available()]; input.read(buffer); input.close(); String str = new String(buffer); return str; }catch(Exception e){ Log.e("File_IO", e.toString()); this.finish(); } return null; }editText2.setText(readFile());
  • 181. 运行结果: 注意:写文件时用的 MODE_APPEND 模式
  • 182. 3、SQLiteSQLite 轻量级嵌入式数据库引擎,面向资源有限的设备 没有服务器进程 所有数据存放在同一文件中 跨平台,可自由复制 SQLiteOpenHelper 帮助类,用于管理数据库创建和版本更新 onCreate(SQLiteDatabase db) onUpgrade(db,int old_ver,int new_ver) sqlite3 :位于 /tools
  • 183. 实例:Test_of_SQLiteDatabaseHelper 继承自 SQLiteOpenHelper 重写了onCreate()、onUpgrade() 方法 实现 insert、del、query、close 等方法 ListView 显示记录,字段对应成 TextView ListView 的 onItemClick() 实现删除记录 数据库文件路径: /data/data/<包>/database/***.db
  • 184. private SQLiteDatabase db; public void insert(ContentValues values){ SQLiteDatabase db = getWritableDatabase(); db.insert(TABLE_NAME, null, values); db.close(); } public void del(int id){ if(db == null) db = getWritableDatabase(); db.delete(TABLE_NAME, "_id=?", new String[]{String.valueOf(id)}); } public void onCreate(SQLiteDatabase db) { this.db = db; db.execSQL(CREATE_TABLE); }DatabaseHelper.java
  • 185. DatabaseHelper dbHelper = new DatabaseHelper(this); Cursor cursor = dbHelper.query(); String[] from = {"_id","name","url","notes"}; int[] to = {R.id.textView1,R.id.textView2,R.id.textView3, R.id.textView4}; SimpleCursorAdapter scadapter = new SimpleCursorAdapter (this,R.layout.favoritelist,cursor,from,to); ListView listView = getListView(); listView.setAdapter(scadapter); AlertDialog.Builder adBuilder = new AlertDialog.Builder(this);Query_Test.javalistView.onItemClick{ adBuilder.setMessage("确认删除?") .setPositiveButton("Y", new OnClickListener()) .setNegativeButton("N", new OnClickListener()); AlertDialog aleraDialog = adBuilder.create(); aleraDialog.show(); }删除记录并重建 ListView
  • 186. 运行结果:
  • 187. 4、Content Provider与 Activity、Service、Broadcast Receiver 同属 Android 应用程序基本组件之一 用于保存和检索数据,实现了数据的跨应用共享 Android 中各应用均运行在自己的进程中,互相访问的 Content Provider 接口统一定义在 android.provider 包内,涵盖了常见的数据类型如音视频、图片、联系人等 实现的方法包括: insert、delete、qurey、update 等
  • 188. URI Content Provider 用以实现数据共享的对象 Content Resolver Content Provider 的客户端接口 客户端通过 getContentResolver() 获得接口 提供与 Content Provider 对应的方法 间接地通过操作 Resolver 来操作 Provider 一个 Provider 可以对应多个 Resolver 用户自定义/系统 :Content Provider
  • 189. 实例:Test_of_ContentProvider系统 Content Provider 添加联系人:String name = editText1.getText().toString(); String notes = editText2.getText().toString(); ContentResolver contentResolver1 = getContentResolver(); ContentValues contentValues1 = new ContentValues(); Uri uri1 = Contacts.People.CONTENT_URI; contentValues1.put(People.NAME,name); contentValues1.put(People.NOTES, notes); try{contentResolver1.insert(uri1, contentValues1);}
  • 190. 运行结果:
  • 191. 7、Android 的多媒体应用on android
  • 192. Android 的多媒体Android 实现了常见媒体格式的编解码机制 图片:jpeg、gif、png、bmp 音频:3gp、mp3、wav 视频:3gp、mp4 Android 提供相应 API 实现多媒体应用 音视频播放:MediaPlayer、JetPlayer 音视频录制: MediaRecorder …… 媒体文件来源: 应用程序资源、本地文件、网络文件流
  • 193. 实例:ImageView 194. 实例:GridView、Gallery 详见实例:Test_of_Widget
  • 195. 实例:Test_of_Mp3Player实现 MediaPlayer.OnCompletionListener 接口public class Mp3Player_Test extends Activity implements MediaPlayer.OnCompletionListener // 重写 onCompletion() 方法,实现循环播放 public void onCompletion(MediaPlayer mp) { if(flag1==1)ib4play(); if(flag2==1)ib8play(); } // 重写 onDestroy() 方法 public void onDestroy(){ super.onDestroy(); if(imageButton2.isEnabled()) ib2stop(); if(imageButton6.isEnabled()) ib6stop(); }
  • 196. 定义 MediaPlayer 对象并初始化private MediaPlayer mp1,mp2; private void mp1init(){ try {mp1=MediaPlayer.create(this, R.raw.temp); mp1.setOnCompletionListener(this); }catch (Throwable t){errorReport(t);} } private void mp2init(){ try {mp2 = new MediaPlayer(); String path = "/sdcard/graduated.mp3"; mp2.setDataSource(path); mp2.prepare(); mp2.setOnCompletionListener(this); }catch (Throwable t){errorReport(t);} }
  • 197. 音乐文件路径:
  • 198. 定义三个 ImageButton 对象并实例化
  • 199. 实现 paly、pause 方法private void ib4play(){ flag1=1; mediaPlayer1.start(); imageButton2.setEnabled(true); imageButton3.setEnabled(true); imageButton4.setEnabled(false); } private void ib3pause(){ flag1=0; mediaPlayer1.pause(); imageButton2.setEnabled(false); imageButton3.setEnabled(false); imageButton4.setEnabled(true); }
  • 200. 实现 stop 方法private void ib2stop(){ flag1=0; mediaPlayer1.stop(); imageButton2.setEnabled(false); imageButton3.setEnabled(false); try{mediaPlayer1.prepare(); mediaPlayer1.seekTo(0); imageButton4.setEnabled(true); }catch(Throwable t){errorReport(t);} }
  • 201. 运行结果:
  • 202. Android AVD、SD Card创建 AVD: Android SDK and AVD Manager AVD 的存放位置: C:\Documents and Settings\Administrator\ .android\avd\ AVD SD Card 及其容量的设定 AVD 的默认 Skin 与 Target 版本有关 AVD 的硬件参数设定: ……new……Device ram size:512M \SDK_2.1_Update1_API_7.avd\config.ini
  • 203. SD Card 文件操作从SD卡提取文件向SD卡添加文件删除文件先选定设备(Device) 然后打开 File Explorer: 另有:   adb 命令方式
  • 204. 8、应用实例:a、b、c、don android
  • 205. Android 应用开发a:Xeye b:蓝牙短信收发 c:兰大新闻网 d:黑白棋游戏
  • 206. the end