Android <ul><li>讲师: </li></ul><ul><li>杨喜山 </li></ul><ul><li>Tel  : 0411- 88 33- 55 33 </li></ul><ul><li>Mail :  www. pk be...
授课内容 <ul><li>1.Android 简介 </li></ul><ul><li>2. 应用剖析 </li></ul><ul><li>3. 调试方法 </li></ul><ul><li>4 、 Android 框架  &  设计模式 </...
Android&3G <ul><li>第三代移动通信技术( 3rd-generation , 3G ) : </li></ul><ul><li>是指支持高速数据传输的蜂窝移动通讯技术。 3G 服务能够同时传送声音及数据信息,速率一般在几百 kb...
Android 架构
Android 特性 <ul><li>应用程序框架 :支持组件的重用与替换  </li></ul><ul><li>Dalvik 虚拟机 :专为移动设备优化  </li></ul><ul><li>集成的浏览器 :基于开源的 WebKit 引擎  ...
Android 程序库 <ul><li>Android  包含一些 C/C++ 库,这些库能被 Android 系统中不同的组件使用。它们通过  Android  应用程序框架为开发者提供服务。 </li></ul><ul><li>以下是一些 ...
Android 与其他系统比较 <ul><li>智能手机软件平台有: </li></ul><ul><li>Symbian : </li></ul><ul><li>C++  &  Java </li></ul><ul><li>RIM BlackB...
Android 前景 <ul><li>Iphone </li></ul><ul><li>Gphone ( google  tv,voice,earth) </li></ul><ul><li>Ophone </li></ul><ul><li>乐 ...
Dalvik 虚拟机 <ul><li>Dalvik 和标准 Java 虚拟机 (JVM) 首要差别 : </li></ul><ul><li>Dalvik  基于寄存器,而 JVM  基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候...
Android 菜单
开发环境 <ul><li>下载: 1.JDK1.6  http://www.sun.com  建议不要 使用 JRE </li></ul><ul><li>2.Eclipse3.5  http://www.eclipse.org  建议 for ...
Android 开发全过程 <ul><li>创建 android 项目 </li></ul>
运行 Android 程序 <ul><li>创建 AVD(Android 模拟器 ) : </li></ul><ul><li>在工具栏中有一个手机图标 (Opens the Android SDK and AVD Manager) 。 </li...
目录结构
AndroidManifest.xml 轮廓 <ul><li><?xml version= &quot;1.0&quot;  encoding= &quot;utf-8&quot; ?> </li></ul><ul><li><manifest ...
xml 文件 <ul><li>正前方 提示: 布局文件名字 可以自己指定 </li></ul><ul><li>strings.xml 常量如下 : </li></ul>
资源 & 国际化 (I18N) <ul><li>Internationalization( 国际化 ) 简称  i18n , 因为在 i 和 n 之间还有 18 个字符。  Localization( 本地化 ) ,简称 L10n 。 </li...
I18N <ul><li>如: values- zh - rCN /strings.xml ( 用 语言 _r 地区 的形式 ) values/strings.xml  文件夹名是变化的,文件名不变 </li></ul><ul><li>res/...
限定词 <ul><li>限定词   值   </li></ul><ul><li>1. 语言  两字节 ISO 639-1  低位的语言编码,比如: en, fr, es  </li></ul><ul><li>2. 区域  两字节 ISO 316...
调试工具 & 方法 <ul><li>DDMS : Dalvik Debug Monitor service ,提供很多功能:截屏、模拟广播信息、模拟电话呼叫、接发 SMS 、虚拟地理坐标、进程、线程查看、堆信息及 gc 等。 </li></ul...
应用打包与安装 <ul><li>Apk 是 Android  安装包的扩展名,一个 Android  安装包包含了与某个 Android  应用程序相关的所有文件。 apk 文件将 AndroidManifest.xml  文件、应用程序代码 ...
Linux 命令 <ul><li>ADB(Android Debug Bridge) 是一个通用调试工具,借助这个工具,可以管理设备或手机模拟器的状态。 </li></ul><ul><li>ADB 常用操作: </li></ul><ul><li...
模拟器参数
模拟器参数
eclipse 快捷键 <ul><li>Alt+/ 显示 api 列表 : </li></ul><ul><li>Ctrl+Shift+L+L( 可以弹出设置窗口  或  Window->Preferences->General->Keys) <...
拨打电话 <ul><li>调用面板拨打 :模拟器上号码使用端口号 </li></ul><ul><li>Intent it =  new  Intent(Intent. ACTION_ DIAL , Uri. parse (&quot;tel:0...
发送短信 SMS <ul><li>调用界面发送 : </li></ul><ul><li>Uri uri = Uri. parse (&quot;smsto:0411 88335533 &quot;);  </li></ul><ul><li>In...
Android 应用解析 <ul><li>Android 应用程序由 4 个模块构成,但并不是必须的,可根据需求进行组合。 </li></ul><ul><li>Activity :最基本的模块,称之为“活动”;控制视图、监听系统事件、启动其他的...
Intent <ul><li>Android 基本的设计理念是鼓励 减少组件间的耦合 ,因此 Android 提供了 Intent ( 意图 )  , Intent 提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递 Inte...
隐式 Intent <ul><li>隐式 Intent: 恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。 Android 系统会根据隐式意图中设置的动作 (action) 、类别 (category...
屏幕切换 <ul><li>Android 其实跟网页开发差不多,屏幕切换就好像一个页面跳转到另一个页面。 </li></ul><ul><li>1. 屏幕切换( A  B ):需要调用 startActivity() 来完成 </li></ul...
Activity 生命周期
Activity 生命周期 <ul><li>Activity 有三个状态: </li></ul><ul><li>当它在屏幕前台时(位于当前任务堆栈的顶部),它是 激活或运行状态 。它就是响应用户操作的 Activity 。 </li></ul>...
Android 设计模式 <ul><li>Android 是个完全的 Application framework ,处处可见反向控制。主要有两种实现机制: </li></ul><ul><li>Template Method 模式  : 使用继承...
事件处理 <ul><li>1.Android 基于 Listener 实现事件处理的,通过 View 的 setOnXXXListener() 来添加事件的监听器 Listener 。 </li></ul><ul><li>OnClickList...
UI <ul><li>Android 生成屏幕有三种方式: XML 配置 、 IDE 界面接口 、 硬代码生成 。在一个 Android 应用中,用户界面是有 View 和 ViewGroup 对象构成。 </li></ul><ul><li>V...
Layout <ul><li>AbsoluteLayout : 绝对布局。是一个按照绝对坐标定义的布局,由于使用绝对坐标去定位控件,因此要实现自适应界面时,应尽少使用 AbsoluteLayout 。  AbsoluteLayout 里面的控件...
FrameLayout <ul><li>FrameLayout 是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 — 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为 Fram...
LinearLayout <ul><li><LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>...
RelativeLayout <ul><li><RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul>...
AbsoluteLayout <ul><li><AbsoluteLayout xmlns:android= &quot;http://schemas.android.com/apk/res/android&quot;   </li></ul><...
TableLayout <ul><li>< TableLayout  xmlns:android= &quot;http://schemas.android.com/apk/res/android&quot;   </li></ul><ul><...
TabWidget <ul><li>< TabHost  xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>androi...
TabActivity <ul><li>public   class  PKbestActivity  extends   TabActivity  {  // 正前方 提示:使用 TabHost 必须与 TabActivity 一起使用 </...
UI 控件 <ul><li>ListView  :列表在 android.widget 包下,有这些 View 。均为可视的图形 UI 部件。 </li></ul><ul><li>EditText  :编辑框 ( 多行 ) </li></ul>...
Spinner <ul><li>使用 XML 布局 +arrays.xml 数据 </li></ul><ul><li>res/values/arrays.xml </li></ul><ul><li><?xml version=&quot;1.0...
Spinner <ul><li>使用 Adapter </li></ul><ul><li>public   class  PKbestSpinner  extends  Activity { </li></ul><ul><li>public  ...
Menu <ul><li>选项菜单 Options Menu :这是一个活动的主菜单。按 MENU 键来显示,在屏幕最下面最多显示 6 个菜单选项( icon menu ,不可以有 checkable ),如果多于 6 个的其他的会以“ mor...
OptionsMenu <ul><li>XML 布局方式 :  OptionsMenu 需重写 Activity 的 onCreateOptionsMenu() 、 onOptionsItemSelected() </li></ul><ul><...
OptionsMenu <ul><li>硬编码方式 :  OptionsMenu 需重写 Activity 的 onCreateOptionsMenu() 、 onOptionsItemSelected() </li></ul><ul><li>...
ContextMenu <ul><li>public   void  onCreate(Bundle savedInstanceState) { </li></ul><ul><li>super .onCreate(savedInstanceSt...
Dialog <ul><li>2 个按钮对话框  xml 布局的对话框  进度对话框 </li></ul><ul><li>前两个都通过 AlertDialog.Builder 创建获得。 </li></ul><ul><li>进度对话框通过 Pr...
Dialog <ul><li>Builder  builder  =  new   AlertDialog.Builder (DisplayUIActivity. this ); </li></ul><ul><li>builder. setTi...
ImageView&ImageButton <ul><li><ImageView </li></ul><ul><li>android:id= &quot;@+id/pkbestImageView&quot; </li></ul><ul><li>...
Gallery <ul><li><?xml version= &quot;1.0&quot;  encoding= &quot;utf-8&quot; ?> </li></ul><ul><li><LinearLayout xmlns:andro...
Gallery <ul><li>1. 通过 BaseAdapter 装载图片库  2. 监听 Gallery 的 setOnItemClickListener 事件,得知要显示的图片  3. 通过 ImageView 呈现指定的图片 </li>...
ImageSwitcher <ul><li>1. 设置 ViewFactory 为数据源,通过 makeView() 显示图片  2. 通过 setImageResource() 指定图片资源 </li></ul><ul><li>public ...
GridView <ul><li>1.XML 布局文件  2. 使用 BaseAdapter (与前的基本上一样)作为数据源 ( 只是将 Gallery.LayoutParams 换成 GridView .LayoutParams ) </li...
ScrollView <ul><li>卷轴视图是指内容很多时,一屏显示不完,需要通过滚动来显示。  1. 通过 XML 配置 ScrollView 布局。  2. 硬编码动态添加 View 部件。 </li></ul><ul><li><Scro...
发送 Email <ul><li>使用系统自带 Email 程序,需要配置 email 信息: 需要网络支持 ( 网络连接后在启动模拟器 ) </li></ul><ul><li>Email  账号:  www.pkbest.cn@ gmail....
带附件的 Email <ul><li>Intent it = new Intent(Intent.ACTION_SEND);   </li></ul><ul><li>it.putExtra(Intent.EXTRA_TEXT, &quot;Th...
监听短信 <ul><li>Android 设备接收到的 SMS 是 pdu 形式的 (protocol description unit) 。  android.telephony.SmsMessage 这个类可以储存 SMS 的相关信息,我们...
监听电话 <ul><li>监听电话状态需要: </li></ul><ul><li>1. 获取 TelephonyManager service , 添加自己的监听器 </li></ul><ul><li>2. 自己的监听器要继承 PhoneSta...
MediaPlayer
播放音乐 <ul><li>获得 MediaPlayer 对象: (注意三者的在 start 之前调用略有不同) </li></ul><ul><li>1. 如果是 res 下资源文件(即与程序一起打包文件) </li></ul><ul><li>p...
参考资源 <ul><li>http://androidappdocs.appspot.com/ </li></ul><ul><li>http://www.linuxgraphics.cn/gui/ </li></ul><ul><li>http:...
Thanks <ul><li>本人能力有限,有不足之处,请多指教! </li></ul><ul><li>thanks </li></ul><ul><li>杨喜山 </li></ul><ul><li>2011-08-27 </li></ul>
广告 <ul><li>正前方最近活动: </li></ul><ul><li>手机 课 程: Android3.2 、 iPhone4 </li></ul><ul><li>javaEE 课程: struts2.1 、 spring2.5 、 hi...
Upcoming SlideShare
Loading in...5
×

Android -汇博

2,111

Published on

Published in: Technology, Education
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,111
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
19
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Android -汇博

  1. 1. Android <ul><li>讲师: </li></ul><ul><li>杨喜山 </li></ul><ul><li>Tel : 0411- 88 33- 55 33 </li></ul><ul><li>Mail : www. pk best. cn @gmail.com [email_address] </li></ul><ul><li>Web : http:// www. pk best. cn </li></ul>
  2. 2. 授课内容 <ul><li>1.Android 简介 </li></ul><ul><li>2. 应用剖析 </li></ul><ul><li>3. 调试方法 </li></ul><ul><li>4 、 Android 框架 & 设计模式 </li></ul><ul><li>5.UI 主题 样式 </li></ul><ul><li>6. 数据存储 </li></ul><ul><li>7. 电话、短信 </li></ul><ul><li>8. 多媒体 </li></ul><ul><li>9. 网络通信 </li></ul><ul><li>10. 浏览器开发 </li></ul><ul><li>11. 天气预报 & GoogleMap & GPS </li></ul><ul><li>12. 电源管理 </li></ul><ul><li>13.TextToSpeech </li></ul><ul><li>14. 传感器 </li></ul><ul><li>15.OpenGL </li></ul><ul><li>16. 图像处理 </li></ul><ul><li>17. 桌面组件 </li></ul><ul><li>18. 优化技术 </li></ul><ul><li>19. 项目实战 </li></ul><ul><li>20. 最佳实践 </li></ul>
  3. 3. Android&3G <ul><li>第三代移动通信技术( 3rd-generation , 3G ) : </li></ul><ul><li>是指支持高速数据传输的蜂窝移动通讯技术。 3G 服务能够同时传送声音及数据信息,速率一般在几百 kbps 以上。目前 3G 存在四种标准: CDMA2000 , WCDMA , TD-SCDMA , WiMAX 。 </li></ul><ul><li>中国电信的 CDMA2000 日、韩和北美使用 </li></ul><ul><li>中国联通的 WCDMA 世界上大部分 3G 网络都采用的是该标准 </li></ul><ul><li>中国移动的 TD-SCDMA 具有自主知识产权 , 只有中国使用 ( 最近又提出 4G 技术 ) </li></ul><ul><li>3G 网络 能处理图像、音乐、视频等多种媒体形式,提供包括网页浏览、电话会议、电子商务等多种信息服务。第三代与前两代的主要区别是在传输声音和数据的 速度上有很大的提升 。 </li></ul><ul><li>Android 一词的本义指“机器人”,同时也是 Google 于 2007 年 11 月 5 日宣布的基于 Linux 平台的开源手机操作系统的名称,该平台由 操作系统 、 中间件 和 应用软件 组成,号称是首个为移动终端打造的真正开放和完整的移动软件。它采用了软件堆层 (software stack ,又名软件叠层 ) 的架构,主要分为三部分: </li></ul><ul><li>底层: 以 Linux 核心为基础,由 C 语言开发,只提供基本功能。 </li></ul><ul><li>中间层: 包括函数库 Library 和虚拟机 Virtual Machine ,由 C++ 开发。 </li></ul><ul><li>应用软件: 是最上层,包括通话程序,短信程序等,以 Java 编写。 </li></ul>
  4. 4. Android 架构
  5. 5. Android 特性 <ul><li>应用程序框架 :支持组件的重用与替换 </li></ul><ul><li>Dalvik 虚拟机 :专为移动设备优化 </li></ul><ul><li>集成的浏览器 :基于开源的 WebKit 引擎 </li></ul><ul><li>优化的图形库 :包括定制的 2D 图形库, 3D 图形库基于 OpenGL ES 1.0 </li></ul><ul><li>SQLite :用作结构化的数据存储 </li></ul><ul><li>多媒体支持 :包括常见的音频、视频和静态图像格式 </li></ul><ul><li>(如 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF ) </li></ul><ul><li>GSM 电话技术 :(依赖于硬件) </li></ul><ul><li>Bluetooth EDGE 3G WiFi : (依赖于硬件) </li></ul><ul><li>照相机 GPS 指南针 加速度计( accelerometer ): (依赖于硬件) </li></ul><ul><li>丰富的开发环境: 包括设备模拟器,调试工具,内存及性能分析图表和 </li></ul><ul><li>Eclipse 集成开发环境插件 </li></ul>
  6. 6. Android 程序库 <ul><li>Android 包含一些 C/C++ 库,这些库能被 Android 系统中不同的组件使用。它们通过 Android 应用程序框架为开发者提供服务。 </li></ul><ul><li>以下是一些 核心库 : </li></ul><ul><li>系统 C 库 :一个从 BSD 继承来的标准 C 系统函数库( libc ), 它是专门为基于 embedded linux 的设备定制的。 </li></ul><ul><li>媒体库 :基于 PacketVideo OpenCORE ;该库支持多种常用的音频、视频格式回放和录制,同时支持静态图像文件。编码格式包括 MPEG4 、 H.264 、 MP3 、 AAC 、 AMR 、 JPG 、 PNG 。 </li></ul><ul><li>Surface Manager :对显示子系统的管理,并且为多个应用程序提供了 2D 和 3D 图层的无缝融合。 </li></ul><ul><li>LibWebCore :一个最新的 web 浏览器引擎,支持 Android 浏览器和一个可嵌入的 web 视图。 </li></ul><ul><li>SGL :底层的 2D 图形引擎 </li></ul><ul><li>3D libraries :基于 OpenGL ES 2.0 APIs 实现;该库可以使用硬件 3D 加速(如果可用)或者使用高度优化的 3D 软加速。 </li></ul><ul><li>FreeType :位图( bitmap )和矢量( vector )字体显示。 </li></ul><ul><li>SQLite : 一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎。 </li></ul>
  7. 7. Android 与其他系统比较 <ul><li>智能手机软件平台有: </li></ul><ul><li>Symbian : </li></ul><ul><li>C++ & Java </li></ul><ul><li>RIM BlackBerry : </li></ul><ul><li>Java </li></ul><ul><li>Palm : </li></ul><ul><li>C & C++ </li></ul><ul><li>Brew : </li></ul><ul><li>C++ </li></ul><ul><li>J2ME : </li></ul><ul><li>java ( MIDP ) </li></ul><ul><li>WindowsMobile : </li></ul><ul><li>C#(Compact Framework) </li></ul><ul><li>C & C++ </li></ul><ul><li>Android : SDK & NDK </li></ul><ul><li>java & C </li></ul><ul><li>Symbian : </li></ul><ul><li>C++ </li></ul><ul><li>iPhone : </li></ul><ul><li>Objective-C </li></ul>
  8. 8. Android 前景 <ul><li>Iphone </li></ul><ul><li>Gphone ( google tv,voice,earth) </li></ul><ul><li>Ophone </li></ul><ul><li>乐 phone </li></ul>
  9. 9. Dalvik 虚拟机 <ul><li>Dalvik 和标准 Java 虚拟机 (JVM) 首要差别 : </li></ul><ul><li>Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。 </li></ul><ul><li>Dalvik 和 Java 运行环境的区别 : </li></ul><ul><li>Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个 Dalvik 应用作为一个独立的 Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭 . </li></ul><ul><li>Dalvik 形势 : </li></ul><ul><li>Dalvik 的诞生也导致人们开始忧虑 Java 平台的第一次大规模的分道扬镳或许已经是进行时了——有人已经把 Davlik 和微软的 JVM 以及 Sun( 现 Oracle) 对微软的诉讼联系起来,等着看 Google 身上是否也会发生类似事情;另外一些人则指出, Google 并没有宣称 Dalvik 是一个 Java 实现,而微软却是这样做的。 Sun 也对可能带来的阵营分裂表达了忧虑情绪,并提出和 Google 合作来保证 Dalvik 和 JVM 之间的兼容性—— Google 对此的解释是, Dalvik 是对解决目前 JavaME 平台上分裂的一次尝试,也是为了提供一个拥有较少限制许可证的平台。甚至还有人怀疑这是否是 Sun 和 Google 两大阵营对 Java 之未来的一次大规模较量。 </li></ul><ul><li>Class 文件 ------Java 编译后的目标文件 : </li></ul><ul><li>不像 J2se , java 编译成 class 就可以直接运行, android 平台上 class 文件不能直接在 android 上运行。由于 Google 使用了自己的 Dalvik 来运行应用,所以这里的 class 也肯定不能在 Android Dalvik 的 java 环境中运行, android 的 class 文件实际上只是编译过程中的中间目标文件,需要链接成 dex 文件后才能在 dalvik 上运行。 </li></ul><ul><li>Dex 文件 -----Android 平台上的可执行文件 </li></ul><ul><li>Android 虚拟机 Dalvik 支持的字节码文件格式 Google 在新发布的 Android 平台上使用了自己的 Dalvik 虚拟机来定义,这种虚拟机执行的并非 Java 字节码,而是另一种字节码: dex 格式的字节码。在编译 Java 代码之后,通过 Android 平台上的工具可以将 Java 字节码转换成 Dex 字节码。虽然 Google 称 Dalvik 是为了移动设备定做的,但是业界很多人认为这是为了规避向 sun 申请 Java license 。这个 Dalvik VM 针对手机程式 /CPU 做过最佳化,可以同时执行许多 VM 而不会占用太多 Resource 。 </li></ul>
  10. 10. Android 菜单
  11. 11. 开发环境 <ul><li>下载: 1.JDK1.6 http://www.sun.com 建议不要 使用 JRE </li></ul><ul><li>2.Eclipse3.5 http://www.eclipse.org 建议 for Java EE Developers 版本 </li></ul><ul><li>3.Ansroid SDK 3.2 ( + ADT-12.0.zip ) http:// developer.android.com/index.html </li></ul><ul><li>http://androidappdocs.appspot.com/index.html </li></ul><ul><li>http://www.coolapk.com/docs/ </li></ul><ul><li>http://www.ideasandroid.com/android/sdk/docs/offline.html </li></ul><ul><li>安装: </li></ul><ul><li>1. 安装 JDK( 设置 JAVA_HOME) </li></ul><ul><li>2. 解压 eclipse 到指定目录 </li></ul><ul><li>3. 解压 Android SDK 到指定目录,更改环境变量 PATH=……; android-sdk-windows-HOME tools </li></ul><ul><li>4. 安装 Eclipse 插件 ADT( 在线安装方式 ) : </li></ul><ul><li>a. 启动 Eclipse ,选择 Help -> Install New Software </li></ul><ul><li>b. 在弹出窗体里,点击 Add… </li></ul><ul><li>c. 在 Location 中输入 http s ://dl-ssl.google.com/android/eclipse/ </li></ul><ul><li>如果不可访问,输入 http://dl-ssl.google.com/android/eclipse/ </li></ul><ul><li>d. 点击 OK -> Next -> Next -> Finish 。重启 Eclipse </li></ul><ul><li>或 也可直接 下载 ADT-12.0.zip ( 文件安装方式 ): </li></ul><ul><li>a. 启动 Eclipse ,选择 Help -> Install New Software </li></ul><ul><li>b. 在弹出窗体里,点击 Add… ,然后选择 Archive… (选下载的 ADT-12.0.zip 文件 ) </li></ul><ul><li>c. 选 Help -> Install New Software ,选择 android3.2 - jar:file:… </li></ul><ul><li>5. 安装 SDK( 需要网络 ) : </li></ul><ul><li>运行 android-sdk-windows-HOME / SDK Manager.exe SDK 或者 Setup.exe ( 如果 https 不好用,就在 settings 设置为 Force 强行 ) </li></ul><ul><li>建议选择所有的版本 (13,12,11,10,9,8,7,6,5,4,3,2,1) 。 </li></ul><ul><li>Window -> Android SDK and AVD Manager -> 点击 New 创建 AVD </li></ul><ul><li>6. 创建 sdcard : </li></ul><ul><li>1. 在 android-sdk-windows-HOME / tools / 目录下执行 mksdcard -l sdcard 256M e:/sd/pkbest.img ( 非常耗时 , 耐心等待 ) </li></ul><ul><li>2. 在 eclipse -> windows->Android AVD Manager ,弹出一个窗口,在 SDCard 后面的框中输入: e:pkbest.img; 即 SD 卡镜像文件 </li></ul><ul><li>3. 上传文件: android-sdk-windows-HOME / platform-tools /adb push E:musichello.mp3 /sdcard/ </li></ul>
  12. 12. Android 开发全过程 <ul><li>创建 android 项目 </li></ul>
  13. 13. 运行 Android 程序 <ul><li>创建 AVD(Android 模拟器 ) : </li></ul><ul><li>在工具栏中有一个手机图标 (Opens the Android SDK and AVD Manager) 。 </li></ul><ul><li>选择 Virtual Devices ,点击 New 按钮添加一个模拟器。 </li></ul><ul><li>Target 选择 Android2.3 。其他的默认,单击 Create AVD 确认添加。 </li></ul><ul><li>启动模拟器 :选中我们添加的模拟器,单击右边的 Start... 按钮, </li></ul><ul><li>启动我们的模拟器。模拟器启动后, </li></ul><ul><li>在右键菜单 Run As Android Application 。 </li></ul><ul><li>执行 Android 程序 : </li></ul><ul><li>在模拟器中,打开抽屉,找到自己的应用程序。点击运行 </li></ul>
  14. 14. 目录结构
  15. 15. AndroidManifest.xml 轮廓 <ul><li><?xml version= &quot;1.0&quot; encoding= &quot;utf-8&quot; ?> </li></ul><ul><li><manifest xmlns:android = &quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>package= &quot; cn.pkbest.mobile &quot; </li></ul><ul><li>android:versionCode= &quot;1&quot; </li></ul><ul><li>android:versionName= &quot;1.0&quot; > </li></ul><ul><li>< application android:icon = &quot;@drawable/icon&quot; android:label = &quot;@string/app_name&quot; > </li></ul><ul><li>< activity android:name= &quot;. PKbestActivity &quot; </li></ul><ul><li>android:label= &quot; @string/app_name &quot; > </li></ul><ul><li>< intent-filter > </li></ul><ul><li>< action android:name= &quot;android.intent.action. MAIN &quot; /> 入口 </li></ul><ul><li>< category android:name= &quot;android.intent.category. LAUNCHER &quot; /> 在桌面列表中显示 </li></ul><ul><li><data /> </li></ul><ul><li>< /intent-filter > </li></ul><ul><li>< /activity > </li></ul><ul><li><service /> </li></ul><ul><li><receiver /> </li></ul><ul><li><provider /> </li></ul><ul><li>< /application > </li></ul><ul><li>< uses-sdk android:minSdkVersion= &quot;8&quot; /> </li></ul><ul><li></manifest> </li></ul>
  16. 16. xml 文件 <ul><li>正前方 提示: 布局文件名字 可以自己指定 </li></ul><ul><li>strings.xml 常量如下 : </li></ul>
  17. 17. 资源 & 国际化 (I18N) <ul><li>Internationalization( 国际化 ) 简称 i18n , 因为在 i 和 n 之间还有 18 个字符。 Localization( 本地化 ) ,简称 L10n 。 </li></ul><ul><li>一般说明一个地区的语言时,用 语言 _r 地区 的形式,如 zh_CN, zh_TW . </li></ul><ul><li>本人认为 对于不同国籍、文化信仰、办公习惯和生活方式,国际化可分为 数据国际化 、 UI 国际化 、 逻辑国际化 。 </li></ul><ul><li>一个很好的国际化软件是需要从这三个方面做到适应不同国籍人群的需要。 </li></ul><ul><li>像 struts 一样, Android 也提供了一套数据国际化的经济处理方案:转化大量的资源信息,使 Android 资源保存与代码无关。可使用 Resources 类访问应用程序的资源;与应用程序相关联的资源可以通过 Context.getResources() 得到。 android 没有专门的 API 来提供国际化,而是通过对不同 resource 的命名来达到国际化,同时这种命名方法还可用于对硬件的区分,如不同的新视屏用不同的图片。 </li></ul><ul><li>在代码中使用资源: R.resource_type.resource_name 的方式来使用,如 setTitle( R.string.title ); </li></ul><ul><li>在 xml 中直接引用 : <TextView android:id =&quot;@+id/hello_view&quot; android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; android:text=&quot; @string/hello &quot; /> </li></ul><ul><li>我们以不同的 local 和 region 来做一次国际化,首先 values 表示默认的字符串,也即当 Resource 找不到匹配的资源时,默认使用 values 文件夹下的资源,其余 drawable 等资源也是同样的。 </li></ul><ul><li>文件夹的命名必须都是小写字符 。可以有限定词来修饰。 </li></ul><ul><li>res/anim XML 文件编译为桢序列动画或者自动动画对象。 </li></ul><ul><li>res/ drawable .png , .jpg 文件被编译为 Drawable 资源子类型:使用 Resources.getDrawable(id) 可以获得资源类型位图文。 </li></ul><ul><li>res/ layout 资源编译为屏幕布局器。参见“ 布局器 ”一章 res/valuesXML 文件可以被编译为多种资源。 注意 :不像其他 res 下的目录,这个目录可以包含多个资源描述文件。 XML 文件元素类型控制着这些资源被 R 类放置在何处。这些文件 可以自定义名字 。这里有一些约定俗成的文件。 </li></ul><ul><li>res/values/ arrays.xml 定义数组。 </li></ul><ul><li>colors.xml 定义可绘制对象的颜色和字符串的颜色。使用 Resources.getDrawable() 和 Resources.getColor() 都可以获得这些资源。按照以下序列排列: #RGB , #ARGB , #RRGGBB , #AARRGGBB 。 </li></ul><ul><li>dimens.xml 定义尺度。使用 Resources.getDimension() 可以获得这些资源 </li></ul><ul><li>strings.xml 定义字符串(使用 Resources.getString() 或者更适合的 Resources.getText() 方法获得这些资源。 Resources.getText() 方法将保留所有用于描述用户界面样式的描述符,保持复杂文本的原貌。 </li></ul><ul><li>styles.xml 定义样式对象 </li></ul><ul><li>res/ xml 自定义的 XML 文件。这些文件将在运行时编译近应用程序,并且使用 Resources.getXML() 方法可以在运行时获取。 </li></ul><ul><li>res/ raw 自定义的原生资源,将被直接拷贝入设备。这些文件将不被压缩近您的应用程序。使用带有 ID 参数的 </li></ul><ul><li>Resources.getRawResource() 方法可以获得这些资源,比如 R.raw.somefilename 。 </li></ul>
  18. 18. I18N <ul><li>如: values- zh - rCN /strings.xml ( 用 语言 _r 地区 的形式 ) values/strings.xml 文件夹名是变化的,文件名不变 </li></ul><ul><li>res/ drawable </li></ul><ul><li>在之前的版本中,只有一个 drawable ,而 2.1 版本以后有 drawable-mdpi 、 drawable-ldpi 、 drawable-hdpi 三个,这三个主要是为了支持多分辨率。 </li></ul><ul><li>1.drawable- hdpi 里面存放 高分辨率 的图片 , 如 WVGA (480x800),FWVGA (480x854) </li></ul><ul><li>2.drawable- mdpi 里面存放 中等分辨率 的图片 , 如 HVGA (320x480) </li></ul><ul><li>3.drawable- ldpi 里面存放 低分辨率 的图片 , 如 QVGA (240x320) </li></ul><ul><li>系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片 </li></ul>
  19. 19. 限定词 <ul><li>限定词 值 </li></ul><ul><li>1. 语言 两字节 ISO 639-1 低位的语言编码,比如: en, fr, es </li></ul><ul><li>2. 区域 两字节 ISO 3166-1-alpha-2 带有小写 &quot;r&quot; 前缀的大写地区编码。如: rUS, rFR, rES </li></ul><ul><li>3. 屏幕方向 port, land, square </li></ul><ul><li>4. 屏幕像素密度 92dpi, 108dpi, etc. </li></ul><ul><li>5. 触摸屏类型 notouch, stylus, finger </li></ul><ul><li>6. 用户是否可以使用键盘 keysexposed, keyshidden </li></ul><ul><li>7. 默认的文字输入方法 nokeys, qwerty, 12key </li></ul><ul><li>8. 默认的非触摸导航方法 notouch, dpad, trackball, wheel </li></ul><ul><li>9. 屏幕尺寸 320x240, 640x480, etc. 较大的尺寸必须首先声明。 </li></ul><ul><li>此列表不包括设备定制的参数,比如信号、商标等。所有应用程序应该知道的信息都需要按照上面的列表信息编码。 </li></ul><ul><li>这里有一些命名的通用原则: </li></ul><ul><li>1. 值之间用连接号连接 </li></ul><ul><li>2. 值是大小写敏感的,比如:一个指定的 drawable 目录必须命名为 drawable-port ,而不是 drawable-PORT 。 </li></ul><ul><li>3. 每种限定词只能有一种选择,您不能命名目录为 drawable-rEN-rFR/ 。 </li></ul><ul><li>4. 可以添加多种限定词,但是每个限定词必须在在上面列表中。比如: drawable-en-rUS-land 表明其用于直板的美式英语设别上。 </li></ul><ul><li>5. 带有限定词的目录不能被嵌套,比如: res/drawable/drawable-en 是不允许的。 </li></ul><ul><li>6. 资源引用在语法中表示为未加修饰的表达式,比如 PKbestApp/res/drawable-port-92dpi/ pkbestimage . png ,在 XML 中表示为: @drawable/ pkbestimage ,在代码中表示为: R.drawable. pkbestimage 。 </li></ul><ul><li>正前方 提示:限定词只对特定 目录 有作用 </li></ul>
  20. 20. 调试工具 & 方法 <ul><li>DDMS : Dalvik Debug Monitor service ,提供很多功能:截屏、模拟广播信息、模拟电话呼叫、接发 SMS 、虚拟地理坐标、进程、线程查看、堆信息及 gc 等。 </li></ul><ul><li>LogCat :用来将消息写入模拟器上的日志文件中的类。可以在 DDMS 上查看实时消息。 </li></ul><ul><li>Log.v 输出颜色为 黑色 的,任何消息都会输出,这里的 v 代表 verbose 啰嗦的意思,平时使用就是 Log.v(&quot;&quot;,&quot;&quot;); </li></ul><ul><li>Log.d 输出颜色是 蓝色 的,仅输出 debug 调试的意思,但他会 输出上层的信息 ,过滤起来可以通过 DDMS 的 Logcat 标签来选择 . </li></ul><ul><li>Log.i 输出颜色为 绿色 ,一般提示性的消息 information ,它不会输出 Log.v 和 Log.d 的信息,但会显示 i 、 w 和 e 的信息 </li></ul><ul><li>Log.w 输出颜色为 橙色 ,可以看作为 warning 警告,一般需要我们注意优化 Android 代码,同时选择它后还会输出 Log.e 的信息。 </li></ul><ul><li>Log.e 输出颜色为 红色 ,可以想到 error 错误,这里仅显示红色的错误信息,这些错误就需要认真的分析,查看栈的信息了。 </li></ul><ul><li>Log.v() verbose :适合开发过程中 Log.d() debug :适合开发过程中 </li></ul><ul><li>Log.i() information :最终版本 Log.w() warning :最终版本 </li></ul><ul><li>Log.e() error :最终版本 </li></ul><ul><li>Devices :可以查看到当前运行的 Emulator 和其内运行的应用 </li></ul><ul><li>Emulator control : 即仿真器的硬件设置项 </li></ul><ul><li>Debug 单步调试 :设置断点,进行单步调试。启动 Run -> Debug History 即可切入 debug 模式运行。 正前方 提示: 断点调试必须有源代码 。 </li></ul><ul><li>adb : 调试桥 (adb) 是多种用途的工具,该工具可以帮助你你管理设备或模拟器的状态。 Adb shell 是一个简单的 shell 环境。 </li></ul><ul><li>android-sdk-windows-HOME / platform-tools /adb android-sdk-windows-HOME / tools /adb </li></ul><ul><li>adb shell ( 进入 shell) </li></ul><ul><li>mksdcard -l sdcard 1024M e:/sdcard.iso ( 创建 SD 卡 ) </li></ul><ul><li>adb push <local> <remote> adb push E:musichello.mp3 /sdcard/ ( 将文件上传至 SD 卡,下载用 pull) </li></ul><ul><li>常用 shell 命令: 正前方 提示: 如果遇到 Read-only file system 请仔细核查虚拟机是否安装了 sdcard </li></ul><ul><li>ls cd </li></ul><ul><li>mkdir music rm pkbest.mp3 rmdir alarms </li></ul>
  21. 21. 应用打包与安装 <ul><li>Apk 是 Android 安装包的扩展名,一个 Android 安装包包含了与某个 Android 应用程序相关的所有文件。 apk 文件将 AndroidManifest.xml 文件、应用程序代码 (.dex 文件 ) 、资源文件和其他文件打成一个压缩包。一个工程只能打进一个 .apk 文件。通常会安装到 /data/app/xxx.apk </li></ul><ul><li>1. 导出 Android 应用 : </li></ul><ul><li>在工程上右键 -->Export-->Android-->Export Android Application ,将工程导出为 APK 包。 </li></ul><ul><li>2. 将 APK 包放入到 SDCard 目录中 : </li></ul><ul><li>在 FileExplorer 面板的右上角有一个导入手机图标,将上面生成的 APK 包导入到 SDCard 目录中。 </li></ul><ul><li>或直接使用命令安装: adb install pkbest.apk 命令即可执行安装 </li></ul><ul><li>3. 编写安装 APK 包的 Android 程序 : </li></ul><ul><li>1. 在 AndoirdManifest.xml 添加权限: </li></ul><ul><li><!-- 安装程序权限 --> </li></ul><ul><li><uses-permission android:name=&quot;android.permission. INSTALL_PACKAGES &quot;/> </li></ul><ul><li>2. 通过 Android 提供的功能,安装 APK : </li></ul><ul><li>Intent intent = new Intent(); </li></ul><ul><li>intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); </li></ul><ul><li>intent.setAction(android.content.Intent.ACTION_VIEW); </li></ul><ul><li>Uri data = Uri.fromFile(new File( Environment.getExternalStorageDirectory() , filename)); </li></ul><ul><li>intent.setDataAndType(data, &quot; application/vnd.android.package-archive &quot;); </li></ul><ul><li>startActivity(intent); </li></ul><ul><li>4. 向模拟器中 安装 apk 文件 adb install c:/pkbest.apk </li></ul><ul><li>卸载 (只能手动删除): adb shell cd data/app rm app.apk </li></ul>
  22. 22. Linux 命令 <ul><li>ADB(Android Debug Bridge) 是一个通用调试工具,借助这个工具,可以管理设备或手机模拟器的状态。 </li></ul><ul><li>ADB 常用操作: </li></ul><ul><li>复制文件:可向一个设备或从一个设备中复制文件;复制一个文件或目录到设备或模拟器上: adb push </li></ul><ul><li>adb push test.txt /tmp/test.txt 一般放小的文件挺顺利 ( < 1 M ) </li></ul><ul><li>从设备或模拟器上复制一个文件或目录如: adb pull </li></ul><ul><li>adb pull /android/lib/libwebcore.os </li></ul><ul><li>搜索 / 等待模拟器、设备实例,取得当前运行的模拟器、设备的实例列表及每个实例的状态 | 等待正在运行的设备 </li></ul><ul><li>adb devices </li></ul><ul><li>adb wait-for-device </li></ul><ul><li>查看 Bug 报告: adb bugreport </li></ul><ul><li>记录无线通讯日志: adb bugreport </li></ul><ul><li>无线通讯记录日志非常多,在运行时没必要记录,可以通过命令设置记录: </li></ul><ul><li>adb shell </li></ul><ul><li>logcat -b radio </li></ul><ul><li>获取设备 ID 和序列号: </li></ul><ul><li>adb get-product </li></ul><ul><li>adb get-serialno </li></ul><ul><li>访问数据库 SQLite3 </li></ul><ul><li>adb shell </li></ul><ul><li>sqlite3 </li></ul><ul><li>创建文件夹 : mkdir pkbest </li></ul>
  23. 23. 模拟器参数
  24. 24. 模拟器参数
  25. 25. eclipse 快捷键 <ul><li>Alt+/ 显示 api 列表 : </li></ul><ul><li>Ctrl+Shift+L+L( 可以弹出设置窗口 或 Window->Preferences->General->Keys) </li></ul><ul><li>Content Assist 改成别的组合键 (alt+ 非 /) </li></ul><ul><li>word completion 改成 alt+/ </li></ul><ul><li>CTRL+SHIFT+X 将选中字母变为大写 </li></ul><ul><li>CTRL+SHIFT+Y 将选中字母变为小写 </li></ul><ul><li>如果 api 列表还不出现,不妨可以删除 workspace 目录里的设置信息 </li></ul>
  26. 26. 拨打电话 <ul><li>调用面板拨打 :模拟器上号码使用端口号 </li></ul><ul><li>Intent it = new Intent(Intent. ACTION_ DIAL , Uri. parse (&quot;tel:0411 88 33 55 33&quot;)); </li></ul><ul><li>startActivity(it); </li></ul><ul><li>直接拨打 :没有面板, API 方式 </li></ul><ul><li>Intent it = new Intent(Intent. ACTION_ CALL , Uri.parse(&quot;tel:0411 88335533 &quot;)); </li></ul><ul><li>startActivity(it); </li></ul><ul><li>// 正前方 提示:可以使用: PhoneNumberUtils. isGlobalPhoneNumber (phoneNumber) 来判断电话号码的有效性 </li></ul><ul><li>需要权限 : </li></ul><ul><li><uses-permission android:name=&quot;android.permission. CALL_PHONE &quot;/> 与 < application > 节点同级 </li></ul><ul><li>启动模拟器 : 我们可以启动两个模拟器。使用一个模拟器给另一个模拟器拨打。启动模拟器后,主界面显示信号强度的旁边会有一个 3G 的字样,这说明模拟器已经能接收到信号了。如果我们的机器不能联网,那么将自己的 IP 地址、网关和 DNS 服务器都设置为相同的值,比如都设置为 192.168.0.100 。如果我们的机器是在局域网下,但没有联网,那么将自己的网关和 DNS 设置为路由的 IP 即可,一般情况下路由的 IP 是 192.168.0.1 。 </li></ul><ul><li>拨打电话 : 可以看到模拟器窗口的标题栏上有 5554 和 556 的字样。这是模拟器监听的端口即 --127.0.0.1:5554 。 </li></ul><ul><li>使用 ADT 插件呼叫模拟器 : 如机器太慢,无法启动两个模拟器,我们可以只启动一个模拟器。然后在菜单 windows->show view->other->Android->Emulator Control 打开 Emulator Control 面板。 </li></ul>
  27. 27. 发送短信 SMS <ul><li>调用界面发送 : </li></ul><ul><li>Uri uri = Uri. parse (&quot;smsto:0411 88335533 &quot;); </li></ul><ul><li>Intent it = new Intent(Intent. ACTION_SENDTO , uri); </li></ul><ul><li>String message = &quot; 来正前方学习,每次都有新感觉! from www. PK best .CN&quot;; </li></ul><ul><li>it.putExtra(&quot; sms_body &quot;, message); </li></ul><ul><li>startActivity(it); </li></ul><ul><li>finish(); </li></ul><ul><li>直接发送 : API 方式没有界面 </li></ul><ul><li>SmsManager sms = SmsManager. getDefault (); </li></ul><ul><li>// 正前方 提示:运营商允许每次发送的字节有限,需要分割成多条发。 </li></ul><ul><li>message=&quot; 一件外衣钱学会 3G ,值!现在是 javaEE+Android 的春天!你还等什么?来正前方学习,每次都有新感觉! &quot;; </li></ul><ul><li>List<String> messList = sms. divideMessage (message); </li></ul><ul><li>for (String mess : messList) { </li></ul><ul><li>sms. sendTextMessage (&quot;0411 88335533 &quot;, null , mess , null , null ); </li></ul><ul><li>} </li></ul><ul><li>sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent) : </li></ul><ul><li>destinationAddress: 接收方的手机号码 scAddress: 发送方的手机号码 </li></ul><ul><li>text: 信息内容 sentIntent: 发送是否成功的回执 </li></ul><ul><li>deliveryIntent: 接收是否成功的回执 </li></ul><ul><li>权限 : </li></ul><ul><li><uses-permission android:name=&quot;android.permission. SEND_SMS &quot;/> </li></ul><ul><li>正前方 提示:目前在模拟器中对短信中文支持不够理想,发送短信会有乱码,依赖真机测试 . </li></ul>
  28. 28. Android 应用解析 <ul><li>Android 应用程序由 4 个模块构成,但并不是必须的,可根据需求进行组合。 </li></ul><ul><li>Activity :最基本的模块,称之为“活动”;控制视图、监听系统事件、启动其他的 Activity 、 Service 等。一个应用有很多个 Activity ,一个 Activity 控制一个屏幕(一个屏幕很有可能由多个 Activity 组成);很容易实现一个屏幕到一个新的屏幕,完成新的活动。打开一个新的屏幕,前一个屏幕将会暂存在历史栈中,用户可以返回到历史栈中前一个屏幕,不用时还可以删除。简单理解 Activity 为一个 action 类( MVC )。 Activity 类必须在 AndroidManifest.xml 中注册方可使用 。 </li></ul><ul><li>ContentProvider :是提供与其他应用程序 共享 存取数据的标准方法的类。应用程序可以查询、修改、添加、删除数据。 </li></ul><ul><li>Service :后台运行的“服务”程序 ,可交互。跟 Activity 的级别差不多,但他不能自己运行,需要通过某一个 Activity 或者其他 Context 对象 来调用, Context.startService() 和 Context.bindService() 。通常用来播放媒体文件或检测设备状态等无需界面的任务。 </li></ul><ul><li>BroadcastReceiver :能让你的应用对外部的事件做出响应;不能显示 UI ,它只能通过 NotificationManager 来通知用户事情发生了。既可在 xml 中注册,也可在代码中用 Context.registerReceiver() 注册。各种应用还可以通过使用 Context.sendBroadcast() 将它们自己的 intent broadcasts 广播给其它应用程序。 </li></ul>
  29. 29. Intent <ul><li>Android 基本的设计理念是鼓励 减少组件间的耦合 ,因此 Android 提供了 Intent ( 意图 ) , Intent 提供了一种通用的消息系统,它允许在你的应用程序与其它的应用程序间传递 Intent 来执行动作和产生事件。使用 Intent 可以激活 Android 应用的三个核心组件: 活动、服务和广播接收器 。 Intent 可以划分成 显式意图 和 隐式意图 : </li></ul><ul><li>对于明确指出了目标组件名称的 Intent ,我们称之为“显式 Intent” 。对于没有明确指出目标组件名称的 Intent ,则称之为“隐式 Intent” 。 Android 系统使用 IntentFilter 来寻找与隐式 Intent 相关的对象。 </li></ul><ul><li>显式 Intent: 直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式 Intent 更 多用于在应用程序内部传递消息。比如在某应用程序内,一个 Activity 启动一个 Service 。 </li></ul><ul><li>Intent intent = new Intent( PKbestActivity .this, NewActivity .class); </li></ul><ul><li>startActivity(intent);// 发送 Intent ,启动 NewActivity , </li></ul><ul><li>// 意图里 默认类别 相当于 :android.intent.category. DEFAULT </li></ul><ul><li>// 对于显示 Intent , Android 不需要去做解析,因为目标组件已经很明确 </li></ul><ul><li>应用场景 : </li></ul><ul><li>应用内部使用 显式意图 ,代码清晰可见。 </li></ul>
  30. 30. 隐式 Intent <ul><li>隐式 Intent: 恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。 Android 系统会根据隐式意图中设置的动作 (action) 、类别 (category) 、数据( URI 和数据类型)找到最合适的组件来处理这个意图。 如: </li></ul><ul><li>Uri uri = Uri. parse (&quot;smsto:0411 8835533 &quot;); </li></ul><ul><li>Intent it = new Intent(Intent. ACTION_SENDTO , uri); // 通过 action 和 URI 找到最适合的组件 </li></ul><ul><li>String message = &quot; 来正前方学习,每次都有新感觉! from www.PKbest.CN&quot;; </li></ul><ul><li>it.putExtra(&quot;sms_body&quot;, message); </li></ul><ul><li>startActivity (it); </li></ul><ul><li><activity android:name=&quot;. PKbestActivity &quot; android:label=&quot;@string/main_activity&quot;> </li></ul><ul><li><intent-filter> </li></ul><ul><li><action android:name=&quot;cn.pkbest.mobile. PKbestActivity &quot;/> </li></ul><ul><li><category android:name=&quot;android.intent.category. DEFAULT &quot; /> </li></ul><ul><li></intent-filter> </li></ul><ul><li></activity> </li></ul><ul><li>Android 需要解析的是那些间接 Intent ,通过解析,将 Intent 映射给可以处理此 Intent 的 Activity 、 IntentReceiver 或 Service </li></ul><ul><li>在 intent 过滤器中还可以添加多个 action 和 category ,还可以添加 data 。 </li></ul><ul><li>应用场景 : </li></ul><ul><li>应用外部只能使用 隐式意图 ,功能封装。 </li></ul>
  31. 31. 屏幕切换 <ul><li>Android 其实跟网页开发差不多,屏幕切换就好像一个页面跳转到另一个页面。 </li></ul><ul><li>1. 屏幕切换( A  B ):需要调用 startActivity() 来完成 </li></ul><ul><li>Intent intent = new Intent(); </li></ul><ul><li>intent.setClass(A. this , B. class ); </li></ul><ul><li>startActivity (intent); </li></ul><ul><li>A. this .finish();// 关闭 A 的 Activity </li></ul><ul><li>2. 携带数据切换:需要调用 startSubActivity() 实现跳转 (A  B) , </li></ul><ul><li>setData(ContentURI) :将封装的数据 带过去 (A  B) 。 </li></ul><ul><li>setResult() :将参数 带回来 (A  B  A ), 即传递 B 后, A 可以得到 B 返回的数据, </li></ul><ul><li>同时触发 A 的 onActivityResult() 。 </li></ul><ul><li>A.Java </li></ul><ul><li>Intent intent = new Intent(); </li></ul><ul><li>intent.setClass(A.this, B.class); </li></ul><ul><li>Bundle b = new Bundle(); </li></ul><ul><li>b.putString(&quot;first&quot;, &quot;firstValue&quot;); </li></ul><ul><li>intent.putExtras(b); </li></ul><ul><li>intent.setData(Uri.parse( &quot; www.PKbest.CN&quot; )); </li></ul><ul><li>int requestCode = 88 33 55 33; //88335533 为自定义的整数 . 此时就不要关掉 A ,因为要有得知返回的状态 </li></ul><ul><li>this. startActivityForResult (intent,requestCode); // 正前方 提示:不要关闭 A </li></ul><ul><li>protected void onActivityResult (int requestCode , int resultCode , Intent data ) {// 正前方 提示:获取 B 返回的信息 </li></ul><ul><li>} </li></ul><ul><li>B.java 获取来自 A 的数据 </li></ul><ul><li>Intent intentFromA = B.this.getIntent(); </li></ul><ul><li>Bundle bundleFromA = intentFromA.getExtras(); </li></ul><ul><li>String firstValue = bundleFromA .getString(&quot;first&quot;); </li></ul><ul><li>Bundle toABundle = new Bundle(); </li></ul><ul><li>toABundle.putString(&quot;second&quot;, &quot;return string value to a&quot;); </li></ul><ul><li>intentFromA.putExtras(toABundle); // 正前方 提示:返回给 A </li></ul><ul><li>int REQUEST_CODE = 8833; </li></ul><ul><li>B.this. setResult (REQUEST_CODE, intentFromA ); // 正前方 提示:返回给 A </li></ul><ul><li>B.this.finish(); </li></ul>
  32. 32. Activity 生命周期
  33. 33. Activity 生命周期 <ul><li>Activity 有三个状态: </li></ul><ul><li>当它在屏幕前台时(位于当前任务堆栈的顶部),它是 激活或运行状态 。它就是响应用户操作的 Activity 。 </li></ul><ul><li>当它失去焦点但仍然对用户可见时,它处于 暂停状态 。即在它之上有另外一个 Activity 。这个 Activity 也许是透明的,或者没有完全覆盖全屏,所以被暂停的 Activity 仍对用户可见。暂停的 Activity 仍然是存活状态(它保留着所有的状态和成员信息并保持和窗口管理器的连接),但系统处于极低内存时仍然可以杀死这个 Activity 。 </li></ul><ul><li>完全被另一个 Activity 覆盖时则处于 停止状态 。它仍然保留所有的状态和成员信息。然而对用户是不可见的,所以它的窗口将被隐藏,如果其它地方需要内存,则系统经常会杀死这个 Activity 。 </li></ul><ul><li>当 Activity 从 一种状态转变到另一种状态时 ,会调用以下保护方法来通知这种变化: </li></ul><ul><li>void onCreate(Bundle savedInstanceState) </li></ul><ul><li>void onStart() </li></ul><ul><li>void onRestart() </li></ul><ul><li>void onResume() </li></ul><ul><li>void onPause() </li></ul><ul><li>void onStop() </li></ul><ul><li>void onDestroy() </li></ul><ul><li>这七个事件定义了 Activity 的完整生命周期。实现这些事件方法可以帮助我们监视其中的 三个嵌套生命周期循环 : </li></ul><ul><li>1.Activity 的完整生命周期自第一次调用 onCreate() 开始,直至调用 onDestroy() 为止。 </li></ul><ul><li>Activity 在 onCreate() 中设置所有“全局”状态以完成初始化,而在 onDestroy() 中释放所有系统资源。例如,如果 Activity 有一个线程在后台运行从网络上下载数据,它会在 onCreate() 创建线程,而在 onDestroy() 销毁线程。 </li></ul><ul><li>2.Activity 的 可视生命周期 自 onStart() 调用开始直到相应的 onStop() 调用结束。 </li></ul><ul><li>在此期间,用户可以在屏幕上看到 Activity ,尽管它也许并不是位于前台或者也不与用户进行交互。在这两个方法之间,我们可以保留用来向用户显示这个 Activity 所需的资源。例如,当用户不再看见我们显示的内容时,我们可以在 onStart() 中注册一个 BroadcastReceiver 来监控会影响 UI 的变化,而在 onStop() 中来注消。 onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。 </li></ul><ul><li>3.Activity 的前台生命周期自 onResume() 调用起,至相应的 onPause() 调用为止。 </li></ul><ul><li>在此期间, Activity 位于前台最上面并与用户进行交互。 Activity 会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新的 Activity 启动时,将调用 onPause() 方法。当 Activity 获得结果或者接收到新的 Intent 时会调用 onResume() 方法。 </li></ul>
  34. 34. Android 设计模式 <ul><li>Android 是个完全的 Application framework ,处处可见反向控制。主要有两种实现机制: </li></ul><ul><li>Template Method 模式 : 使用继承 (Inheritance) </li></ul><ul><li>Observer( 也称 Listener) 模式 : </li></ul><ul><li>Android 的源码很多都是 singleton 模式。 </li></ul>
  35. 35. 事件处理 <ul><li>1.Android 基于 Listener 实现事件处理的,通过 View 的 setOnXXXListener() 来添加事件的监听器 Listener 。 </li></ul><ul><li>OnClickListener OnCreateContextMenuListener </li></ul><ul><li>OnKeyListener OnFocusChangeListener </li></ul><ul><li>OnTouchListener OnLongClickListener </li></ul><ul><li>2.Listener 是以 Interface 的方式来提供,包含一个或多个 abstract 方法,需要实现这些方法来完成相应事件的操作。在特定的事件被 dispatch 到该 view 时,通过 callback() 给予响应 。 </li></ul><ul><li>3.Android 下, Activity 的相应按键和触屏两种事件: </li></ul><ul><li>boolean onKeyDown ( int keyCode, KeyEvent event) // 键按下 </li></ul><ul><li>boolean onKeyLongPress ( int keyCode, KeyEvent event) // 长按键 </li></ul><ul><li>boolean onKeyMultiple ( int keyCode, int repeatCount, KeyEvent event) // 重复按键 </li></ul><ul><li>boolean onKeyUp ( int keyCode, KeyEvent event) // 按键释放 </li></ul><ul><li>boolean onTouchEvent (MotionEvent event) // 触屏事件 </li></ul><ul><li>//Touch Screen Click 举例 </li></ul><ul><li>public class PKbestEventActivity extends Activity implements  OnTouchListener  {   </li></ul><ul><li>     public void onCreate(Bundle savedInstanceState) {   </li></ul><ul><li>         super.onCreate(savedInstanceState);   </li></ul><ul><li>         setContentView(R.layout.main);   </li></ul><ul><li>         TextView tv = (TextView) findViewById(R.id.tv); </li></ul><ul><li>         tv.setOnTouchListener(this);    </li></ul><ul><li>     }   </li></ul><ul><li>     public boolean onTouch(View v, MotionEvent event) {   </li></ul><ul><li>         Toast.makeText(this, &quot;Touch&quot;, Toast.LENGTH_SHORT).show(); // 正前方 提示: Toast 是一个提示,几秒钟后自动消失  </li></ul><ul><li>         return false;   </li></ul><ul><li>     }   </li></ul><ul><li>}    </li></ul>
  36. 36. UI <ul><li>Android 生成屏幕有三种方式: XML 配置 、 IDE 界面接口 、 硬代码生成 。在一个 Android 应用中,用户界面是有 View 和 ViewGroup 对象构成。 </li></ul><ul><li>View :任何一个 View 的对象都继承 android.view.View 类。它表示屏幕特定的矩形布局和内容属性的数据结构。可以处理测距、布局、绘图、焦点变换、滚动条、案件、手势等。 View 为 Widget 服务,是一组用于绘制交互屏幕元素的完全实现子类。 Widget 处理自己的测距和绘图,可快速用它们构建 UI 。可用的 Widget 包括 Text 、 EditText 、 Button 、 RadioButton 、 Checkbox 、 ScrollView 等。 </li></ul><ul><li>ViewGroup : android.view.ViewGroup 类。是一个特殊的 View 对象,装载和管理一组下层的 View 和 ViewGroup ; ViewGroup 可以为 UI 增加结构,并将复杂的屏幕构建成独立实体。 ViewGroup 为 Layout 服务, Layout 可为一组 View 构建。 </li></ul><ul><li>右图表示一个 Activity 界面,可以包含很多 ViewGroup 和 View ,这样的组合可以开发更完美、更复杂的界面。 </li></ul><ul><li>当 Activity 被激活并得到 焦点 时,通过 setContentView() 方法传递给 </li></ul><ul><li>根节点对象,系统会通知并请求根节点测距并 绘制 树,根节点 </li></ul><ul><li>就会请求它的子节点对象的 draw() 去完成此事。 </li></ul><ul><li>依次下去。如果叶子节点为 ViewGroup ,则会测量它的有效空间、布 </li></ul><ul><li>局,并调用每个子对象 draw() 去绘制。 </li></ul><ul><li>子对象可以获取父对象的大小和 </li></ul><ul><li>位置,但父对象对每个子对象的大小和位置有最终的 决定权 。 </li></ul>View View View View View ViewGroup ViewGroup View 和 ViewGroup 混合布局的 Activity 界面
  37. 37. Layout <ul><li>AbsoluteLayout : 绝对布局。是一个按照绝对坐标定义的布局,由于使用绝对坐标去定位控件,因此要实现自适应界面时,应尽少使用 AbsoluteLayout 。 AbsoluteLayout 里面的控件都以 layout_x 、 layout_y 来定义其位置。 </li></ul><ul><li>FrameLayout : 帧布局。所有的控件都被放到布局的左上角,并一层覆盖一层。 </li></ul><ul><li>LinearLayout : 线布局。按照水平或者垂直排列。 </li></ul><ul><li>RelativeLayout : 相对布局。按照相对位置排列的布局。 </li></ul><ul><li>TableLayout : 表布局。 </li></ul><ul><li>TabWidget : 切换卡。 </li></ul>
  38. 38. FrameLayout <ul><li>FrameLayout 是最简单的一个布局对象。它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象 — 比如,一张你要发布的图片。所有的子元素将会固定在屏幕的左上角;你不能为 FrameLayout 中的一个子元素指定一个位置。后一个子元素将会直接在前一个子元素之上进行覆盖填充,把它们部份或全部挡住(除非后一个子元素是透明的)。 FrameLayout 的大小是 最大的子元素的大小 。 </li></ul><ul><li><FrameLayout xmlns:android= &quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;fill_parent&quot; > </li></ul><ul><li><Button </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;wrap_content&quot; </li></ul><ul><li>android:text= &quot; 正前方最新课程访问 www.PKbest.CN &quot; /> </li></ul><ul><li></FrameLayout> </li></ul>
  39. 39. LinearLayout <ul><li><LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:orientation=&quot; vertical &quot; horizontal </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;fill_parent&quot;> </li></ul><ul><li><Button </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android:text= &quot; 正前方 开启地震提示 &quot; /> </li></ul><ul><li><Button </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android:text= &quot; 最新课程访问 www.PKbest.CN &quot; /> </li></ul><ul><li></LinearLayout> </li></ul><ul><li>DisplayMetrics screen = new DisplayMetrics(); </li></ul><ul><li>this .getWindowManager().getDefaultDisplay(). getMetrics ( screen );// 获取屏幕的大小 </li></ul><ul><li>LinearLayout layout = new LinearLayout( this ); </li></ul><ul><li>// LayoutParams params = new LayoutParams( screen.widthPixels , screen.heightPixels ); </li></ul><ul><li>// layout.setLayoutParams( params ); </li></ul><ul><li>layout.setOrientation(LinearLayout. VERTICAL ); </li></ul><ul><li>Button a = new Button( this ); </li></ul><ul><li>a.setText(&quot; 正前方开启地震提示 &quot;); </li></ul><ul><li>Button b = new Button( this ); </li></ul><ul><li>b.setText(&quot; 最新课程访问 www.PKbest.CN&quot;); </li></ul><ul><li>LayoutParams buttonParams = new LayoutParams(screen.widthPixels,50); </li></ul><ul><li>LayoutParams buttonParams1 = new LayoutParams(screen.widthPixels,50); </li></ul><ul><li>layout.addView(a,buttonParams); </li></ul><ul><li>layout.addView(b,buttonParams1); </li></ul><ul><li>this .setContentView(layout); </li></ul>
  40. 40. RelativeLayout <ul><li><RelativeLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android:padding=&quot;10px&quot; > </li></ul><ul><li><TextView android:id=&quot;@+id/label&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android:text=&quot; 输入 正前方 课程名称 :&quot; /> </li></ul><ul><li><EditText android:id=&quot;@+id/entry&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android: layout_below =&quot;@id/label&quot; /> </li></ul><ul><li><Button android:id=&quot;@+id/go&quot; </li></ul><ul><li>android:layout_width=&quot;wrap_content&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android:layout_below=&quot;@id/entry&quot; </li></ul><ul><li>android: layout_alignParentRight =&quot;true&quot; </li></ul><ul><li>android: layout_marginLeft =&quot;10px&quot; </li></ul><ul><li>android:text=&quot;GO&quot; /> </li></ul><ul><li><Button android:layout_width=&quot;wrap_content&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android: layout_toLeftOf =&quot;@id/go&quot; </li></ul><ul><li>android: layout_alignTop =&quot;@id/go&quot; </li></ul><ul><li>android:text=&quot;Cancel&quot; /> </li></ul><ul><li></RelativeLayout> </li></ul>
  41. 41. AbsoluteLayout <ul><li><AbsoluteLayout xmlns:android= &quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:id= &quot;@+id/mArtivleViewLayout&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;fill_parent&quot; </li></ul><ul><li>androidrientation= &quot;vertical&quot; > </li></ul><ul><li><LinearLayout android:layout_y= &quot;350px&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:id= &quot;@+id/TooLBarLayout&quot; </li></ul><ul><li>android:layout_x= &quot;0px&quot; </li></ul><ul><li>android:layout_height= &quot;44px&quot; </li></ul><ul><li>android:gravity= &quot;center&quot; > </li></ul><ul><li><ImageView android:id= &quot;@+id/pkbest&quot; </li></ul><ul><li>android:layout_height= &quot;wrap_content&quot; </li></ul><ul><li>android:layout_width= &quot;wrap_content&quot; android:src= &quot;@drawable/pkbest&quot; > </li></ul><ul><li></ImageView> </li></ul><ul><li></LinearLayout> </li></ul><ul><li></AbsoluteLayout> </li></ul><ul><li>AbsoluteLayout 可以让子元素指定准确的 x/y 坐标值,并显示在屏幕上。 (0, 0) 为左上角,当向下或向右移动时,坐标值将变大。 AbsoluteLayout 没有页边框,允许元素之间互相重叠 ( 尽管不推荐 ) 。我们通常 不推荐使用 AbsoluteLayout ,除非你有正当理由要使用它,因为它使界面代码太过刚性,以至于在不同的设备上可能不能很好地工作。 </li></ul>
  42. 42. TableLayout <ul><li>< TableLayout xmlns:android= &quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; android:layout_height= &quot;fill_parent&quot; android:stretchColumns= &quot;1&quot; > </li></ul><ul><li>< TableRow > </li></ul><ul><li>< TextView android:text= &quot; 正前方 java 系列课程 &quot; android:padding= &quot;3dip&quot; /> </li></ul><ul><li></ TableRow > </li></ul><ul><li><TableRow> </li></ul><ul><li><TextView android:text= &quot;Android2.2 课程 &quot; android:padding= &quot;3dip&quot; /> </li></ul><ul><li><TextView android:text= &quot;Struts2.1 课程 &quot; android:padding= &quot;3dip&quot; /> </li></ul><ul><li></TableRow> </li></ul><ul><li><TableRow> </li></ul><ul><li><TextView android:text= &quot;Spring2.5 课程 &quot; android:padding= &quot;3dip&quot; /> </li></ul><ul><li><TextView android:text= &quot;Hibernate3.3 课程 &quot; android:padding= &quot;3dip&quot; /> </li></ul><ul><li></TableRow> </li></ul><ul><li></ TableLayout > </li></ul><ul><li>TableLayout layout = new TableLayout( this ); </li></ul><ul><li>TableRow row0 = new TableRow( this ); </li></ul><ul><li>TextView text0 = new TextView( this ); </li></ul><ul><li>text0.setText(&quot; 正前方 java 系列课程 :&quot;); </li></ul><ul><li>row0.addView(text0); </li></ul><ul><li>layout.addView(row0); </li></ul><ul><li>TableRow row1 = new TableRow( this ); </li></ul><ul><li>TextView text1 = new TextView( this ); </li></ul><ul><li>text1.setText(&quot;Android2.2 课程 &quot;); </li></ul><ul><li>row1.addView(text1); </li></ul><ul><li>TextView text11 = new TextView( this ); </li></ul><ul><li>text11.setText(&quot;Struts2.1 课程 &quot;); </li></ul><ul><li>row1.addView(text11); </li></ul><ul><li>layout.addView(row1); </li></ul><ul><li>this .setContentView( layout ); </li></ul>
  43. 43. TabWidget <ul><li>< TabHost xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:id=&quot;@android:id/tabhost&quot; android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;fill_parent&quot;> </li></ul><ul><li>< LinearLayout </li></ul><ul><li>android:orientation=&quot;vertical&quot; android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;fill_parent&quot;> </li></ul><ul><li>< TabWidget android:id=&quot;@android:id/tabs&quot; android:layout_width=&quot;fill_parent&quot; android:layout_height=&quot;wrap_content&quot; /> </li></ul><ul><li><!-- TabHost 必须与 FrameLayout 搭配使用 --> </li></ul><ul><li>< FrameLayout </li></ul><ul><li>android:id=&quot;@android:id/tabcontent&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;fill_parent&quot;> </li></ul><ul><li><TextView </li></ul><ul><li>android:id=&quot;@+id/android&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;fill_parent&quot; </li></ul><ul><li>android:text=&quot; 正前方 最新 Android 课程 请到 www.PKbest.CN 查询 &quot; /> </li></ul><ul><li><TextView </li></ul><ul><li>android:id=&quot;@+id/spring&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;fill_parent&quot; </li></ul><ul><li>android:text=&quot; 正前方 最新 Spring 课程 请到 www.PKbest.CN 查询 &quot; /> </li></ul><ul><li><TextView </li></ul><ul><li>android:id=&quot;@+id/struts&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;fill_parent&quot; </li></ul><ul><li>android:text=&quot; 正前方 最新 Struts 课程 请到 www.PKbest.CN 查询 &quot; /> </li></ul><ul><li></ FrameLayout > </li></ul><ul><li></ LinearLayout > </li></ul><ul><li></ TabHost > </li></ul>
  44. 44. TabActivity <ul><li>public class PKbestActivity extends TabActivity { // 正前方 提示:使用 TabHost 必须与 TabActivity 一起使用 </li></ul><ul><li>private TabHost tabHost = null ; // 声明 TabHost 对象 </li></ul><ul><li>public void onCreate(Bundle savedInstanceState){ </li></ul><ul><li>super .onCreate(savedInstanceState); </li></ul><ul><li>setContentView(R.layout. pkbest ); </li></ul><ul><li>tabHost = getTabHost() ; // 取得 TabHost 对象 </li></ul><ul><li>// 为 TabHost 添加标签 </li></ul><ul><li>//1. 新建 newTabSpec(newTabSpec) 2. 设置其标签和图标 (setIndicator) 3. 设置内容 (setContent) </li></ul><ul><li>tabHost. addTab (tabHost .newTabSpec (&quot;tab_test1&quot;) </li></ul><ul><li>. setIndicator (&quot;Android 课程 &quot;,getResources().getDrawable(R.drawable. icon )) </li></ul><ul><li>. setContent (R.id. android )); </li></ul><ul><li>tabHost.addTab(tabHost.newTabSpec(&quot;tab_test2&quot;) </li></ul><ul><li>.setIndicator(&quot;Spring 课程 &quot;,getResources().getDrawable(R.drawable. icon )) </li></ul><ul><li>.setContent(R.id. spring )); </li></ul><ul><li>tabHost.addTab(tabHost.newTabSpec(&quot;tab_test3&quot;) </li></ul><ul><li>.setIndicator(&quot;Struts 课程 &quot;,getResources().getDrawable(R.drawable. icon )) </li></ul><ul><li>.setContent(R.id. struts )); </li></ul><ul><li>tabHost.setBackgroundColor(Color. argb (150, 22, 70, 150));// 设置 TabHost 的背景颜色 </li></ul><ul><li>//tabHost.setBackgroundResource(R.drawable.pkbest);// 设置 TabHost 的背景图片资源 </li></ul><ul><li>tabHost.setCurrentTab(0);// 设置当前显示哪一个标签 </li></ul><ul><li>// 标签切换事件处理, setOnTabChangedListener </li></ul><ul><li>tabHost. setOnTabChangedListener ( new OnTabChangeListener() { </li></ul><ul><li>public void onTabChanged(String tabId) { </li></ul><ul><li>// 已经选中此 tab 页 </li></ul><ul><li>} </li></ul><ul><li>}); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  45. 45. UI 控件 <ul><li>ListView :列表在 android.widget 包下,有这些 View 。均为可视的图形 UI 部件。 </li></ul><ul><li>EditText :编辑框 ( 多行 ) </li></ul><ul><li>RadionButton :单项选择按钮 ( 用 RadionGroup 分组管理、事件监听等 ) </li></ul><ul><li>CheckBox :多项选择 </li></ul><ul><li>Spinner :下拉框 </li></ul><ul><li>ExpandableListView :可折叠列表 </li></ul><ul><li>AutoCompleteTextView :自动提示 </li></ul><ul><li>DatePicker :日期 ( DatePickerDialog ) </li></ul><ul><li>TimePciker :时间 ( TimePickerDialog ) </li></ul><ul><li>Menu :菜单 ( 三种菜单类型,分别为 options menu , context menu , sub menu </li></ul><ul><li>Dialog :对话框 </li></ul><ul><li>ImageView :图片 </li></ul><ul><li>ImageButton :图片按钮 </li></ul><ul><li>Gallery :拖动效果 </li></ul><ul><li>ImageSwitcher :切换图片 </li></ul><ul><li>GridView :网格 </li></ul><ul><li>ScrollView :卷轴视图 </li></ul><ul><li>ProgressBar :进度条 </li></ul><ul><li>SeekBar :拖动条 </li></ul><ul><li>VideoView :视频视图 </li></ul><ul><li>Notification :状态提示 ( NotificationManager: 管理状态栏信息 ) </li></ul><ul><li>PopupWindow :弹出窗体 </li></ul><ul><li>RatingBar :评分条 </li></ul><ul><li>WebView : webkit 内核浏览器 </li></ul><ul><li>TableView : </li></ul><ul><li>自定义 View : </li></ul><ul><li>SurfaceView : </li></ul>
  46. 46. Spinner <ul><li>使用 XML 布局 +arrays.xml 数据 </li></ul><ul><li>res/values/arrays.xml </li></ul><ul><li><?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> </li></ul><ul><li><resources> </li></ul><ul><li><string-array name=&quot; cities &quot;> </li></ul><ul><li><item> 大连 -- 正前方总部 </item> </li></ul><ul><li><item> 北京 </item> </li></ul><ul><li><item> 上海 </item> </li></ul><ul><li></string-array> </li></ul><ul><li></resources> </li></ul><ul><li><?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> </li></ul><ul><li><LinearLayout xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:orientation=&quot;vertical&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;fill_parent&quot;> </li></ul><ul><li><Spinner android:id=&quot;@+id/citiesSpinner&quot; </li></ul><ul><li>android:layout_width=&quot;wrap_content&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android:entries=&quot;@+array/ cities &quot; /> </li></ul><ul><li></LinearLayout> </li></ul>
  47. 47. Spinner <ul><li>使用 Adapter </li></ul><ul><li>public class PKbestSpinner extends Activity { </li></ul><ul><li>public void onCreate(Bundle savedInstanceState) { </li></ul><ul><li>super .onCreate(savedInstanceState); </li></ul><ul><li>setContentView(R.layout. spiner ); </li></ul><ul><li>List<String> list = new ArrayList<String>(); </li></ul><ul><li>list.add(&quot; 大连 -- 正前方总部 &quot;); </li></ul><ul><li>list.add(&quot; 北京 &quot;); </li></ul><ul><li>list.add(&quot; 上海 &quot;); </li></ul><ul><li>Spinner citiesSpinner = (Spinner) this .findViewById(R.id. citiesSpinner ); </li></ul><ul><li>ArrayAdapter adapter = new ArrayAdapter<String>( this , </li></ul><ul><li>android.R .layout. simple_spinner_item , list); </li></ul><ul><li>// 为适配器设置下拉列表下拉时的菜单样式。 </li></ul><ul><li>adapter.setDropDownViewResource( android.R .layout. simple_spinner_dropdown_item ); </li></ul><ul><li>// 将适配器添加到下拉列表上 </li></ul><ul><li>citiesSpinner.setAdapter(adapter); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  48. 48. Menu <ul><li>选项菜单 Options Menu :这是一个活动的主菜单。按 MENU 键来显示,在屏幕最下面最多显示 6 个菜单选项( icon menu ,不可以有 checkable ),如果多于 6 个的其他的会以“ more”icon menu 来调出包含两组菜单项: </li></ul><ul><li>图标菜单 Icon Menu :这个是当用户按下菜单键时最初出现屏幕下方的 item 集合。它支持最多 6 个菜单项。只有这些菜单支持图标而且这些菜单并不支持 checkboxes 或者 radio buttons 。 </li></ul><ul><li>扩展菜单 Expanded Menu :这是通过按“更多”菜单显现出来的一个竖向的项目列表。它仅当图标菜单过多时存在而且是由 6 个以及其它选项菜单组成。 </li></ul><ul><li>上下文菜单 Context Menu :这是一个浮动菜单列表,通常在你长时间按在一个视图上时出现(比如一个列表项) </li></ul><ul><li>子菜单 Submenu :这是一个浮动菜单列表,通过在 选项菜单 或 上下文菜单 显露出来。不支持嵌套子菜单。 </li></ul>
  49. 49. OptionsMenu <ul><li>XML 布局方式 : OptionsMenu 需重写 Activity 的 onCreateOptionsMenu() 、 onOptionsItemSelected() </li></ul><ul><li><menu> 、 <group> 和 <item> 。 item 和 group 必须是菜单的子元素,而 <item> 元素还可以是 <group> 的子元素,并且另外一个菜单元素可以是一个 <item> 的子元素(来创建一个子菜单 <menu> )。任何文件的根元素必须是一个 <menu> 元素。 </li></ul><ul><li><menu xmlns:android= &quot;http://schemas.android.com/apk/res/android&quot; > </li></ul><ul><li><item android:id= &quot;@+id/newItem&quot; android:title= &quot;new&quot; > </li></ul><ul><li><menu> </li></ul><ul><li><item android:id= &quot;@+id/androidItem&quot; android:title= &quot;android project&quot; /> </li></ul><ul><li></menu> </li></ul><ul><li></item> </li></ul><ul><li><item android:id= &quot;@+id/exitItem&quot; android:title= &quot;exit&quot; /> </li></ul><ul><li></menu> </li></ul><ul><li>public boolean onCreateOptionsMenu (Menu menu){ </li></ul><ul><li>this.getMenuInflater(). inflate ( R.menu.menu , menu); // 正前方 提示:设置界面为 res/menu/menu.xml </li></ul><ul><li>return true ; </li></ul><ul><li>} </li></ul><ul><li>public boolean onOptionsItemSelected (MenuItem item){ </li></ul><ul><li>int id = item.getItemId(); </li></ul><ul><li>switch (id){ </li></ul><ul><li>case R.id.newItem: </li></ul><ul><li>Toast.makeText(this, &quot;new item selected!&quot;, Toast.LENGTH_SHORT).show(); </li></ul><ul><li>break; </li></ul><ul><li>case R.id.exitItem: </li></ul><ul><li>Toast.makeText(this, &quot;exit menu&quot;, Toast.LENGTH_SHORT).show(); </li></ul><ul><li>DisplayUIActivity.this.finish(); </li></ul><ul><li>break; </li></ul><ul><li>} </li></ul><ul><li>return true ; </li></ul><ul><li>} </li></ul>
  50. 50. OptionsMenu <ul><li>硬编码方式 : OptionsMenu 需重写 Activity 的 onCreateOptionsMenu() 、 onOptionsItemSelected() </li></ul><ul><li>public boolean onCreateOptionsMenu (Menu menu){ </li></ul><ul><li>SubMenu fileMenu = menu.addSubMenu(0,0,0,&quot;new&quot;); </li></ul><ul><li>SubMenu editMenu = menu.addSubMenu(0,1,1,&quot;exit&quot;); </li></ul><ul><li>fileMenu.add(0,2,0,&quot;android project&quot;); </li></ul><ul><li>menu.addSubMenu(&quot;search&quot;); </li></ul><ul><li>menu.addSubMenu(&quot;refactor&quot;); </li></ul><ul><li>menu.addSubMenu(&quot;navigate&quot;); </li></ul><ul><li>menu.addSubMenu(&quot;project&quot;); </li></ul><ul><li>return true ; </li></ul><ul><li>} </li></ul><ul><li>public boolean onOptionsItemSelected (MenuItem item){ </li></ul><ul><li>int id = item.getItemId(); </li></ul><ul><li>switch (id){ </li></ul><ul><li>case 0: </li></ul><ul><li>Toast. makeText ( this , &quot;new item selected!&quot;, Toast. LENGTH_SHORT ).show(); </li></ul><ul><li>break ; </li></ul><ul><li>case 1: </li></ul><ul><li>Toast. makeText ( this , &quot;exit menu&quot;, Toast. LENGTH_SHORT ).show(); </li></ul><ul><li>DisplayUIActivity. this .finish(); </li></ul><ul><li>break ; </li></ul><ul><li>} </li></ul><ul><li>return true ; </li></ul><ul><li>} </li></ul>
  51. 51. ContextMenu <ul><li>public void onCreate(Bundle savedInstanceState) { </li></ul><ul><li>super .onCreate(savedInstanceState); </li></ul><ul><li>TextView view = new TextView( this ); </li></ul><ul><li>view.setText(&quot; www.PKbest.CN &quot;); // 正前方 提示:任何 View 均可有 ContextMenu 。需要长按 2 秒 </li></ul><ul><li>this . registerForContextMenu (view); // 正前方 提示:需用此方法注册 </li></ul><ul><li>this .setContentView(view); </li></ul><ul><li>} </li></ul><ul><li>@Override </li></ul><ul><li>public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { </li></ul><ul><li>super .onCreateContextMenu(menu, v, menuInfo); </li></ul><ul><li>menu.add(0,0,0, &quot;new&quot;); // 正前方 提示:与添加 OptionsMenu 一样 </li></ul><ul><li>menu.add(0,1,1,&quot;exit&quot;); </li></ul><ul><li>} </li></ul><ul><li>@Override </li></ul><ul><li>public boolean onContextItemSelected(MenuItem item) { </li></ul><ul><li>switch (item.getItemId()) { </li></ul><ul><li>case 0: </li></ul><ul><li>Toast. makeText ( this , &quot;new item selected!&quot;, Toast. LENGTH_SHORT ).show(); </li></ul><ul><li>return true ; </li></ul><ul><li>case 1: </li></ul><ul><li>Toast. makeText ( this , &quot;exit menu&quot;, Toast. LENGTH_SHORT ).show(); </li></ul><ul><li>return true ; </li></ul><ul><li>default : </li></ul><ul><li>return super .onContextItemSelected(item); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  52. 52. Dialog <ul><li>2 个按钮对话框 xml 布局的对话框 进度对话框 </li></ul><ul><li>前两个都通过 AlertDialog.Builder 创建获得。 </li></ul><ul><li>进度对话框通过 ProgressDialog 创建获得。 </li></ul>
  53. 53. Dialog <ul><li>Builder builder = new AlertDialog.Builder (DisplayUIActivity. this ); </li></ul><ul><li>builder. setTitle (&quot; 正前方提示 &quot;);// 设置标题 </li></ul><ul><li>builder. setMessage (&quot; 需要您重新登录! &quot;);// 设置内容 </li></ul><ul><li>// 正前方 提示:得到自定义对话框。去掉即为带有 2 个按钮的对话框 </li></ul><ul><li>LayoutInflater factory = LayoutInflater. from (DisplayUIActivity. this ); </li></ul><ul><li>final View dialogView = factory.inflate(R.layout. ui_dialog , null ) ; </li></ul><ul><li>builder.setView(dialogView); // 设置自定义对话框的样式 </li></ul><ul><li>builder. setPositiveButton (&quot; 确定 &quot;, new DialogInterface.OnClickListener() { </li></ul><ul><li>public void onClick(DialogInterface dialog, int whichButton){ </li></ul><ul><li>} </li></ul><ul><li>}); </li></ul><ul><li>builder. setNeutralButton (&quot; 退出 &quot;, new DialogInterface.OnClickListener() { </li></ul><ul><li>public void onClick(DialogInterface dialog, int whichButton){ </li></ul><ul><li>} </li></ul><ul><li>}); </li></ul><ul><li>Dialog dialog = builder. create ();// 创建 </li></ul><ul><li>dialog. show ();// 显示对话框 </li></ul><ul><li>// 进度对话框 : 有圆形和长方形两种。也可以通过 setButton() 增加按钮。 </li></ul><ul><li>final ProgressDialog dialog = ProgressDialog. show (DisplayUIActivity. this ,&quot; 请稍等 ...&quot;, &quot; 正在处理 ...&quot;, true ); </li></ul><ul><li>Thread thread = new Thread(){ </li></ul><ul><li>public void run(){ </li></ul><ul><li>try { </li></ul><ul><li>sleep (3000); </li></ul><ul><li>} finally { dialog. dismiss ();// 正前方 提示:取消对话框 } </li></ul><ul><li>} </li></ul><ul><li>}; </li></ul><ul><li>thread.start(); </li></ul><ul><li>dialog.show(); </li></ul>
  54. 54. ImageView&ImageButton <ul><li><ImageView </li></ul><ul><li>android:id= &quot;@+id/pkbestImageView&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;wrap_content&quot; </li></ul><ul><li>android:src= &quot;@drawable/pkbest&quot; /> </li></ul><ul><li>ImageView pkbestImageView = (ImageView) this .findViewById(R.id. pkbestImageView ); </li></ul><ul><li>// 正前方 提示:等价于 XML 配置 android:src=&quot; @drawable / pkbest &quot; </li></ul><ul><li>pkbestImageView.setImageResource(R.drawable. pkbest ); </li></ul><ul><li>//pkbestImageView.setAlpha(alpha);// 设置 Alpha 值 </li></ul><ul><li><ImageButton </li></ul><ul><li>android:id= &quot;@+id/pkbestImageButton&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;wrap_content&quot; </li></ul><ul><li>android:src= &quot;@drawable/pkbest&quot; /> </li></ul><ul><li>ImageButton button = (ImageButton) this .findViewById(R.id. pkbestImageButton ); </li></ul><ul><li>button.setImageDrawable( this .getResources().getDrawable(R.drawable. pkbest ));// 正前方 提示:设置图片 </li></ul><ul><li>button.setOnClickListener( new OnClickListener(){ </li></ul><ul><li>@Override </li></ul><ul><li>public void onClick(View v) { </li></ul><ul><li>Toast. makeText (DisplayUIActivity. this , &quot;clicked me&quot;, Toast. LENGTH_SHORT ).show(); </li></ul><ul><li>} </li></ul><ul><li>); </li></ul>
  55. 55. Gallery <ul><li><?xml version= &quot;1.0&quot; encoding= &quot;utf-8&quot; ?> </li></ul><ul><li><LinearLayout xmlns:android= &quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:id= &quot;@+id/main&quot; </li></ul><ul><li>android:orientation= &quot;vertical&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;fill_parent&quot; > </li></ul><ul><li><ImageButton </li></ul><ul><li>android:id= &quot;@+id/pkbestImageButton&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;wrap_content&quot; </li></ul><ul><li>android:src= &quot;@drawable/pkbest&quot; /> </li></ul><ul><li><Gallery </li></ul><ul><li>android:id= &quot;@+id/pkbestGallery&quot; </li></ul><ul><li>android:layout_width= &quot;fill_parent&quot; </li></ul><ul><li>android:layout_height= &quot;wrap_content&quot; /> </li></ul><ul><li></LinearLayout> </li></ul>
  56. 56. Gallery <ul><li>1. 通过 BaseAdapter 装载图片库 2. 监听 Gallery 的 setOnItemClickListener 事件,得知要显示的图片 3. 通过 ImageView 呈现指定的图片 </li></ul><ul><li>Gallery gallery = (Gallery) this .findViewById(R.id. pkbestGallery ); </li></ul><ul><li>gallery.setAdapter( new PKbestImageAdapter( this )); </li></ul><ul><li>//gallery.setBackgroundResource(R.drawable.pkbest); // 正前方 提示:设置背景图片 </li></ul><ul><li>gallery. setOnItemClickListener( new OnItemClickListener() { </li></ul><ul><li>public void onItemClick(AdapterView<?> parent, View view, int position, long id) { </li></ul><ul><li>Toast. makeText (DisplayUIActivity. this , &quot; 显示第 &quot;+(position + 1)+&quot; 张图片 &quot;, Toast. LENGTH_SHORT ).show(); </li></ul><ul><li>} </li></ul><ul><li>}); </li></ul><ul><li>class PKbestImageAdapter extends BaseAdapter{ </li></ul><ul><li>private Integer[] imageIDs= { R.drawable. pkbest , R.drawable. icon }; </li></ul><ul><li>private Context context = null ; </li></ul><ul><li>public PKbestImageAdapter(Context context){ this .context = context; } </li></ul><ul><li>public int getCount() { return imageIDs.length; } </li></ul><ul><li>public Object getItem( int position) { return position; } </li></ul><ul><li>public long getItemId( int position) { return position; } </li></ul><ul><li>public View getView( int position, View convertView, ViewGroup parent) { </li></ul><ul><li>ImageView image = null ; </li></ul><ul><li>if (convertView == null ) { </li></ul><ul><li>image = new ImageView(context); // 正前方 提示:给 ImageView 设置资源 </li></ul><ul><li>image.setLayoutParams( new Gallery.LayoutParams(120, 120)); // 正前方 提示:设置布局 图片 120*120 显示 </li></ul><ul><li>image.setScaleType(ImageView.ScaleType. FIT_CENTER ); // 正前方 提示:设置显示比例类型 </li></ul><ul><li>} else { image = (ImageView) convertView; } </li></ul><ul><li>image.setImageResource(imageIDs[position]); </li></ul><ul><li>return image; </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  57. 57. ImageSwitcher <ul><li>1. 设置 ViewFactory 为数据源,通过 makeView() 显示图片 2. 通过 setImageResource() 指定图片资源 </li></ul><ul><li>public class ImageSwitcherActivity extends Activity implements OnClickListener, ViewFactory { </li></ul><ul><li>private ImageSwitcher imgSwiter = null ; </li></ul><ul><li>private final static int ID = 100; </li></ul><ul><li>private final static int PREV_BUTTON_ID = 200; </li></ul><ul><li>private int index = 0; </li></ul><ul><li>private Integer[] imageArray = { R.drawable. pkbest , R.drawable. icon , R.drawable. ok }; </li></ul><ul><li>protected void onCreate(Bundle savedInstanceState) { </li></ul><ul><li>super .onCreate(savedInstanceState); </li></ul><ul><li>LinearLayout line = new LinearLayout( this );// 正前方 提示:创建线性布局 </li></ul><ul><li>imgSwiter = new ImageSwitcher( this ); </li></ul><ul><li>line.addView(imgSwiter); // 正前方 提示:将 imgSwiter 视图添加到线性布局 </li></ul><ul><li>imgSwiter.setId( ID ); </li></ul><ul><li>imgSwiter. setFactory( this ) ; // 正前方 提示:设置 imgSwiter 对象数据源 </li></ul><ul><li>imgSwiter. setImageResource ( this .imageArray[index]); </li></ul><ul><li>this .setContentView(line); </li></ul><ul><li>Button prev = new Button( this ); </li></ul><ul><li>prev.setId( PREV_BUTTON_ID ); prev.setText(&quot;prev&quot;); prev.setOnClickListener( this ); </li></ul><ul><li>LayoutParams param = new LayoutParams(100,100); </li></ul><ul><li>line.addView(prev,param); </li></ul><ul><li>} </li></ul><ul><li>public void onClick(View v) { </li></ul><ul><li>switch (v.getId()){ </li></ul><ul><li>case PREV_BUTTON_ID : </li></ul><ul><li>index --; if (index < 0) index = 0; imgSwiter.setImageResource( this .imageArray[index]); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>public View makeView() { return new ImageView( this );// 正前方 提示:图片都是通过 ImageView 来显示的 } </li></ul><ul><li>} </li></ul>
  58. 58. GridView <ul><li>1.XML 布局文件 2. 使用 BaseAdapter (与前的基本上一样)作为数据源 ( 只是将 Gallery.LayoutParams 换成 GridView .LayoutParams ) </li></ul><ul><li><?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?> </li></ul><ul><li><GridView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:id=&quot;@+id/pkbestGridView&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;fill_parent&quot; </li></ul><ul><li>android:numColumns=&quot;auto_fit&quot; 列数自适应 </li></ul><ul><li>android:verticalSpacing=&quot;10dp&quot; </li></ul><ul><li>android:horizontalSpacing=&quot;10dp&quot; </li></ul><ul><li>android:columnWidth=&quot;90dp&quot; </li></ul><ul><li>android:stretchMode=&quot;columnWidth&quot; 缩放模式 (stretchMode=&quot;columnWidth&quot; - 缩放与列宽大小同步 ) </li></ul><ul><li>android:gravity=&quot;center&quot;/> View 组件的对齐方式 ( 居中显示 ) </li></ul><ul><li>this .setContentView(R.layout.gridview); </li></ul><ul><li>GridView gridview = (GridView) this .findViewById(R.id.pkbestGridView); </li></ul><ul><li>gridview.setAdapter( new PKbestImageAdapter( this )); </li></ul><ul><li>// gridview.setBackgroundResource(R.drawable.pkbest); </li></ul><ul><li>gridview.setOnItemClickListener( new OnItemClickListener(){ </li></ul><ul><li>public void onItemClick(AdapterView<?> parent, View view, int position, long id) { </li></ul><ul><li>Toast.makeText(DisplayUIActivity. this , &quot; 您选择第 &quot;+(position+1)+&quot; 号图片 &quot;, </li></ul><ul><li>Toast.LENGTH_SHORT).show(); </li></ul><ul><li>} </li></ul><ul><li>}); </li></ul>
  59. 59. ScrollView <ul><li>卷轴视图是指内容很多时,一屏显示不完,需要通过滚动来显示。 1. 通过 XML 配置 ScrollView 布局。 2. 硬编码动态添加 View 部件。 </li></ul><ul><li><ScrollView xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot; </li></ul><ul><li>android:id=&quot;@+id/pkbestScrollView&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android:scrollbars=&quot;none&quot;> </li></ul><ul><li><LinearLayout </li></ul><ul><li>android:id=&quot;@+id/layout&quot; </li></ul><ul><li>android:orientation=&quot;vertical&quot; </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot;> </li></ul><ul><li><TextView </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android:text=&quot; 正前方 www.PKbest.CN 0&quot;/> </li></ul><ul><li><TextView </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android:text=&quot; 正前方 www.PKbest.CN 1&quot;/> </li></ul><ul><li><TextView </li></ul><ul><li>android:layout_width=&quot;fill_parent&quot; </li></ul><ul><li>android:layout_height=&quot;wrap_content&quot; </li></ul><ul><li>android:text=&quot; 正前方 www.PKbest.CN 2&quot;/> </li></ul><ul><li>…………………………………………………………… </li></ul><ul><li></LinearLayout> </li></ul><ul><li></ScrollView> </li></ul>
  60. 60. 发送 Email <ul><li>使用系统自带 Email 程序,需要配置 email 信息: 需要网络支持 ( 网络连接后在启动模拟器 ) </li></ul><ul><li>Email 账号: www.pkbest.cn@ gmail.com zhenfang_yang@ 163.com </li></ul><ul><li>密码 : ############ </li></ul><ul><li>外发 Pop3: pop.gmail.com 端口: 995 外发 Pop3: pop3.163.com 端口: 110 </li></ul><ul><li>接收 Imap : imap.gmail.com 端口: 993 接收 SMTP : smtp.163.com 端口: 25 </li></ul><ul><li>// 只发送文本邮件 </li></ul><ul><li>Uri uri = Uri.parse(&quot; mailto :www.pkbest.cn@gmail.com&quot;); </li></ul><ul><li>Intent it = new Intent(Intent.ACTION_ SENDTO , uri); // 正前方 提示:不能设置 it.setType(&quot; text/plain &quot;); </li></ul><ul><li>it.putExtra(Intent.EXTRA_TEXT, &quot;The email body content&quot;); </li></ul><ul><li>it.putExtra(Intent.EXTRA_SUBJECT, &quot;The email subject&quot;); </li></ul><ul><li>startActivity(it); </li></ul><ul><li>// 带有 cc 和 bc 的发送方式 </li></ul><ul><li>Intent it = new Intent(Intent.ACTION_ SEND ); </li></ul><ul><li>String[] to = {&quot;www.pkbest.cn@gmail.com&quot; }; </li></ul><ul><li>String[] cc = {&quot;zhenfang_yang@hotmail.com&quot;}; </li></ul><ul><li>String[] bc = {&quot;zhenfang_yang@163.com&quot;}; </li></ul><ul><li>it.putExtra(Intent.EXTRA_EMAIL, to); </li></ul><ul><li>it.putExtra(Intent.EXTRA_CC, cc); </li></ul><ul><li>it.putExtra(Intent.EXTRA_BCC, bc); </li></ul><ul><li>it.putExtra(Intent.EXTRA_TEXT, &quot;The email body text&quot;); </li></ul><ul><li>it.putExtra(Intent.EXTRA_SUBJECT, &quot;The email subject&quot;); </li></ul><ul><li>it.setType(&quot; text/plain &quot;); // 正前方 提示:需要设置 it.setType(); </li></ul><ul><li>startActivity(it); </li></ul><ul><li>//startActivity(Intent.createChooser(it, &quot;Choose Email Client&quot;));// 调用选客户端的界面 </li></ul>
  61. 61. 带附件的 Email <ul><li>Intent it = new Intent(Intent.ACTION_SEND);  </li></ul><ul><li>it.putExtra(Intent.EXTRA_TEXT, &quot;The email body content&quot;);   </li></ul><ul><li>it.putExtra(Intent.EXTRA_SUBJECT, &quot;The email subject text&quot;);    </li></ul><ul><li>it.putExtra(Intent. EXTRA_STREAM ,uri); //&quot;file:///sdcard/mysong.mp3&quot;   </li></ul><ul><li>sendIntent.setType(mimeType); // &quot;audio/mp3&quot;   </li></ul><ul><li>startActivity(Intent.createChooser(it, &quot;Choose Email Client&quot;)); </li></ul><ul><li>以上说明 : </li></ul><ul><li>1. mimeType:  </li></ul><ul><li>图片 ---- &quot;image/*&quot; </li></ul><ul><li>音频 ---- &quot;audio/*&quot; </li></ul><ul><li>视频 ---- &quot;video/*&quot; </li></ul><ul><li>2. uri: 如果是直接读取到文件路径并发送 , 则为 Uri.fromFile(new File(filePath));   </li></ul><ul><li>          如果是从数据库中查循出来的 uri, 则直接传入即可 .  </li></ul>
  62. 62. 监听短信 <ul><li>Android 设备接收到的 SMS 是 pdu 形式的 (protocol description unit) 。 android.telephony.SmsMessage 这个类可以储存 SMS 的相关信息,我们也可以从接收到的 pdu 中创建新的 SmsMessage 实例。 </li></ul><ul><li>public class SmsReceiver extends BroadcastReceiver { </li></ul><ul><li>public void onReceive(Context context, Intent intent) { </li></ul><ul><li>Bundle bundle = intent.getExtras(); </li></ul><ul><li>Object messages[] = (Object[]) bundle.get(&quot; pdus &quot;); </li></ul><ul><li>// 正前方 提示:是 android.telephony.SmsMessage ( 支持 GSM & CDMA ) , 不是 android.telephony. gsm .SmsMessage </li></ul><ul><li>SmsMessage smsMessage[] = new SmsMessage[messages.length]; </li></ul><ul><li>for ( int i = 0; i < messages.length; i++) { </li></ul><ul><li>smsMessage[i] = SmsMessage. createFromPdu (( byte []) messages[i]); </li></ul><ul><li>String telCode = smsMessage[i].getOriginatingAddress(); // 发送者号码 </li></ul><ul><li>String msgBody = smsMessage[i].getMessageBody().toString(); // 短信内容 </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li>订阅方式 : </li></ul><ul><li><receiver android:name= &quot;.tel.SmsReceiver&quot; > </li></ul><ul><li><intent-filter> </li></ul><ul><li><action android:name= &quot;android.provider.Telephony.SMS_RECEIVED&quot; /> </li></ul><ul><li></intent-filter> </li></ul><ul><li></receiver> </li></ul><ul><li>或者 : </li></ul><ul><li>IntentFilter filter = new IntentFilter(&quot;android.provider.Telephony.SMS_RECEIVED&quot;); </li></ul><ul><li>SmsReceiver receiver = new SmsReceiver (); </li></ul><ul><li>registerReceiver (receiver, filter); </li></ul><ul><li><!-- 接收 SMS 权限 --> </li></ul><ul><li><uses-permission android:name= &quot;android.permission.RECEIVE_SMS&quot; /> </li></ul>
  63. 63. 监听电话 <ul><li>监听电话状态需要: </li></ul><ul><li>1. 获取 TelephonyManager service , 添加自己的监听器 </li></ul><ul><li>2. 自己的监听器要继承 PhoneStateListener ,重写 onCallStateChanged() 方法 </li></ul><ul><li>// 正前方 提示获:取电话的 service ,应在 android.intent.action.MAIN activity 中获取 </li></ul><ul><li>TelephonyManager tm = (TelephonyManager) this .getSystemService(Context. TELEPHONY_SERVICE ); </li></ul><ul><li>tm.listen( new PKbestPhoneListener() , PhoneStateListener. LISTEN_CALL_STATE ); // 注册电话通信 listener </li></ul><ul><li>class PKbestPhoneListener extends PhoneStateListener { </li></ul><ul><li>@Override </li></ul><ul><li>public void onCallStateChanged( int state, String incomingNumber) { </li></ul><ul><li>switch (state){ </li></ul><ul><li>case TelephonyManager. CALL_STATE_IDLE : // 无任何状态,电话挂点后仍是空闲状态 </li></ul><ul><li>break ; </li></ul><ul><li>case TelephonyManager. CALL_STATE_OFFHOOK : // 接听电话 </li></ul><ul><li>break ; </li></ul><ul><li>case TelephonyManager. CALL_STATE_RINGING : // 来电 </li></ul><ul><li>break ; </li></ul><ul><li>} </li></ul><ul><li>super .onCallStateChanged(state, incomingNumber); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul><ul><li><!-- 监听电话权限 --> </li></ul><ul><li><uses-permission android:name = &quot;android.permission.READ_PHONE_STATE&quot; /> </li></ul>
  64. 64. MediaPlayer
  65. 65. 播放音乐 <ul><li>获得 MediaPlayer 对象: (注意三者的在 start 之前调用略有不同) </li></ul><ul><li>1. 如果是 res 下资源文件(即与程序一起打包文件) </li></ul><ul><li>player = MediaPlayer. create (this, R.raw.pkbest ); </li></ul><ul><li>player. start (); </li></ul><ul><li>2. 网络文件,使用: </li></ul><ul><li>Uri uri = Uri.parse(&quot; http://www.PKbest.CN /media/sexy.mp3&quot;); </li></ul><ul><li>player = MediaPlayer. create (this, uri ); </li></ul><ul><li>player. prepare ();    </li></ul><ul><li>player. start (); </li></ul><ul><li>3.sdcard 文件 </li></ul><ul><li>MediaPlayer player = new MediaPlayer(); </li></ul><ul><li>player. setDataSource (&quot; /sdcard/sexy.mp3 &quot;); </li></ul><ul><li>player. prepare ();    </li></ul><ul><li>player. start (); </li></ul><ul><li>// 播放音乐 </li></ul><ul><li>MediaPlayer player = new MediaPlayer(); </li></ul><ul><li>player.reset(); // 正前方 提示:设置 idle 状态 </li></ul><ul><li>player. setDataSource (&quot; /sdcard/sexy.mp3 &quot;); // 正前方 提示: sdcard 下文件使用 setDataSource 方法 </li></ul><ul><li>player.prepare(); </li></ul><ul><li>player.start(); </li></ul><ul><li>player.setLooping( true ); </li></ul><ul><li>// 停止播放 </li></ul><ul><li>if (player.isPlaying()){ </li></ul><ul><li>player.stop(); </li></ul><ul><li>} </li></ul>
  66. 66. 参考资源 <ul><li>http://androidappdocs.appspot.com/ </li></ul><ul><li>http://www.linuxgraphics.cn/gui/ </li></ul><ul><li>http://www.coolapk.com/docs/ </li></ul>
  67. 67. Thanks <ul><li>本人能力有限,有不足之处,请多指教! </li></ul><ul><li>thanks </li></ul><ul><li>杨喜山 </li></ul><ul><li>2011-08-27 </li></ul>
  68. 68. 广告 <ul><li>正前方最近活动: </li></ul><ul><li>手机 课 程: Android3.2 、 iPhone4 </li></ul><ul><li>javaEE 课程: struts2.1 、 spring2.5 、 hibernate3.3 、 oracle 、 JS </li></ul><ul><li>web 技术 : pkbest.js 类库 </li></ul><ul><li>网络技术 : http 协议攻破、网络数据抓取、 B/S 软件外挂 </li></ul><ul><li>框架产品 :数据库持久化产品、无需配置的 MVC 框架、智能类库 </li></ul><ul><li>定制产品 :根据用户的需求,提供合理简便的解决方案、产品 </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×