day 1 Android应用程序开发教程 - Android 介绍


Android应用程序开发教程 陈操(Kelvin Chan) chencao0524@gmail.com 关于本教程 Day 1! Day 2! Day 3 Day 4! Android入门基础 Android User Interface! Android Data Storage! Android Network & Graphics! Practice First Android Application/ Debug/Log! Practice Advanced User Interface Practice File/SQLite Data Storage! Practice HTTP GET/POST XML/JSON Graphics! ANDROID入门基础 Day 1 议程  Android简介  安装Android开发环境  第一个Android应用程序  Android应用程序结构  调试Android程序 Android历史  2005年,Google收购Android公司  Android公司成立仅22个月  2007年,组成“开放手机联盟”  Motorola、HTC、Samsung、LG、Intel、nVdia、SiRF、HP、Skype、 KUPA Map 以及中国移动在内的34家技术和无线应用的领军企业  2007年,发布Android的第一个版本  2008年,发布世界上第一款Android系统的手机T-Mobile G1  Google和运营商T-Mobile共同发布,  2010年,Google位列移动领域十大最具创新力公司榜首  美国著名商业杂志《Fast Company》 Android is growing 不包括iTouch 和 iPad(不是智能手机)! Android特性   应用程序框架   支持组件的重用与替换   Dalvik 虚拟机   专为移动设备优化   集成的浏览器   基于开源的WebKit 引擎   优化的图形库   包括定制的2D图形库,3D图形库基于OpenGL ES 1.0 (硬件加速可选)   SQLite   结构化的数据存储   多媒体支持   包括常见的音频、视频和静态图像格式 (如 MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF)   GSM 电话技术 (依赖于硬件)   Bluetooth,EDGE,3G和 WiFi (依赖于硬件)   照相机,GPS,指南针和加速度计(依赖于硬件)   丰富的开发环境   包括设备模拟器,调试工具,内存及性能分析图表,和Eclipse集成开发环境插件 Android系统架构   应用层   该层由运行在Dalvik虚拟机上的应用程序(主要 由Java语言编写)组成。例如,日历、地图 、浏览器、联系人管理。所有的应用程序都 是使用JAVA语言编写。   应用框架层   该层主要由View、内容提供器(Content Providers)、资源管理器(Resource Manager)、通知管理器(Notification Manager)、活动管理器(Activity Manager)等API框架组成。   程序库   该层由C/C++语言编写的库组成,主要包括C语 言标准库、多媒体库、SGL、OpenGL ES、 SQLite、Webkit、Dalvik虚拟机等。是对应 用框架层提供支持的层。   Android运行库   包括了一个核心库,该核心库提供了JAVA编程 语言核心库的大多数功能。提供了Dalvik虚 拟机环境。   Linux内核层   该层主要包括驱动、内存管理、进程管理、网 络协议栈等组件。目前Android的版本基于 Linux 2.6内核。 什么是Dalvik虚拟机  Android并非使用Java虚拟机器(JVM),而是自行发展 的Dalvik虚拟机器(Dalvik virtual machine, Dalvik VM)  JVM  .java→ .class→jar Dalvik VM  .java→.class→.dex→.apk  每个应用程序产生一个Linux处理程序(Linux Process),并在单一的Dalvik VM当中执行。  确保每一个应用程序之间都是相互独立而彼此不影响。 Android各版本使用情况 Bruce Scharlau, University of Aberdeen, 2010 运行Android程序  真机  模拟器  Android X86  真正的操作系统  http://www.androidx86.org  平板(Android 3.0) Android按键布局 真机上运行Android 模拟器上运行Android PC上运行Android 平板上运行Android 安装Android开发环境  安装JDK(建议JDK 6以上)  获取和安装Eclipse  http://www.eclipse.org  获取和安装Android SDK  http://developer.android.com/sdk  把SDK解压到合适位置  获取和安装Android Developer Tools  https://dl-ssl.google.com/android/eclipse  启动 Eclipse,选择window->preferences,在打开的视图左边点 击android,在右边的SDK Location中选择Android SDK所在位置 在Eclipse中指定Android SDK 指定Android SDK位置 开发第一个Android应用   打开Eclipse,新建项目(点击File→New → Project),在项目列表中展开 Android目录,选择Android Project,如下图: 开发第一个Android应用 选择应用运行的Android版本 项目名称 开发第一个Android应用 指定应用名称 指定应用的启动类 指定最低兼容的Android版本 开发第一个Android应用   点击“finish” 完成项目的创建   点击工具栏上Android形状的虚拟设备管理器(简称“AVD“),如下: 打开Android虚拟设备管理器 开发第一个Android应用   点击Available packages可下载升级到最新的包 打开Android虚拟设备管理器 1、虚拟设备管理器 2、已安装的包 3、可用的包 4、设置 5、关于 开发第一个Android应用  在打开的虚拟设备管理器中创建虚拟设备: 指定设备名称 指定设备运行的SDK版本 指定屏幕规格 指定sdcar大小或位置 设置其他硬件资源,比如内存 开发第一个Android应用  在项目上右键点击Run As→Android Application,如下图: 开发第一个Android应用   1、创建布局文件(可选)   2、创建Activity类   3、在manifest中注册并配置 Android应用程序结构  Android应用程序是由以下四种组件构成:  活动(Activities)  广播接收器(Broadcast Receivers)  服务(Services)  内容提供器(Content Providers)  并不是每个Andorid应用程序都必须这四种组件,有 些可能由这些组件的组合而成 AndroidManifest.xml包含必要的配置信息,以便将 它适当地安装到设备。它包括必需的类名和应用程序 能够处理的事件类型,以及运行应用程序所需的许可。 Android应用程序结构 Android应用程序结构 Views 指列表,网 格,文本框,按钮 等视图,也包括内 嵌浏览器 Content Providers 使应用 程序能访问其他应 用程序的数据(比 如联系人),或者 公开自己的数据 Resource Manager提供 资源文件的访问,比如本 地化文本,图形以及布局 文件 Notification Manager 让 应用在状态栏中显示自定 义的警告 Activity Manager 管理应 用程序的生命周期,提供 通用的导航堆栈 Android应用程序结构 Broadcast receivers 能触发 Intent启动一个应 用程序 Data storage 为应 用程序提供数据访 问支持,通过 Shared Preferences (hash map),文件或数据 库共享数据 Services 没有UI界面,运 行在后台,用于更新数据或 触发事件 Intents 指定什么动作意图 将要被执行 Activity 是应用程序的展现 层:一个Activity即一个屏幕, Views为Activity提供UI Android应用程序目录结构 code images files UI layouts constants Autogenerated resource list Android应用程序目录结构 其他应用程序 有生命周期 屏幕 应用处理的内容 后台应用 比如音乐播放器 Views manifest Activity Intents Service Notifications ContentProviders AndroidManifest描述文件 应用图标 应用名称 此Activity为第一个运行 声明别的应用程序调用时,所需要拥有的权限 声明访问受保护系统或调用其他应用程序的权限 声明兼容的Android版本 AndroidManifest内容   应用程序的java包名   应用程序的各种组件  Activity  Service  BroadcastReceiver  ContentProvider   声明应用程序访问受保护系统或调用别的应用程序时拥有的权限  发送短信  使用网络   声明应用程序被别的应用程序调用时,对其他应用程序要求的权限   应用程序兼容的Android最低版本   应用程序需要链接的库 活动(Activity)  应用程序的表示层  通常就是一个单独的屏幕  都继承于基类android.app.Activity  每一个活动都被实现为一个独立的类  活动类将会显示由视图控件组成的UI,并对 事件做出响应  当打开一个新的屏幕时,之前一个屏幕会被 置为暂停状态并且压入历史堆栈中 活动(Activity)生命周期   运行状态   对用户可见   位于屏幕前台时,当前任务堆栈的顶部 ,响应用户操作   暂停状态   失去焦点但仍然对用户可见(如右图)   保留着所有的状态和成员信息并保持和 窗口管理器的连接   系统处于极低内存时仍然可以杀死这个 Activity   停止状态   对用户是不可见的   完全被另一个Activity覆盖   保留所有的状态和成员信息   其它地方需要内存,则系统经常会杀死这 个Activity 活动(Activity)生命周期 活动(Activity)生命周期 方法 描述 是否可 销毁? 下一个被 调用方法 onCreate()! Activity第一次创建时调用,可以进行初始化设置:创建Views,绑定数据到lists等。如果 是第一次创建,onStart()方法随后调用,如果是stopped后重启动,onRestart()随后调用。! No onStart() ! onRestart()! 当Activity从stopped状态后重启动调用,onStart()随后调用。! No onStart() onStart()! 当Activity对用户可见时调用。如果Activity在前台,其后调用onResume();如果Activity被 隐藏,则调用onStop()! No onResume() or onStop() ! onResume()! 当Activity要与用户交互时调用,此时Activity位于栈顶,可以接受用户输入。其后总是调 用onPause()! No onPause() onPause()! 当系统要resume一个其他的Activity时调用,此方法常被用于持久化数据、停止动画或其 他占用CPU资源的东西。由于下一个Activity在这个方法返回之前不会resume,所以实现 这个方法执行要尽可能快。 如果Activity重回到前台调用onResume(),如果Activity退出则调用onStop()! Yes onResume() or onStop() onStop()! 当另一个Activity resume并遮盖此Activity,此Activity不可见时调用。新的Activity启动、其 他Activity被切换至前台、当前Activity被销毁时都可能会调用此方法。 如果Activity重回前台调用onRestart(),如果Activity退出则调用onDestory()! Yes onRestart() or onDestroy() onDestroy()! Activity被销毁前调用的最后一个方法,! Yes nothing 活动(Activity)生命周期   Activity的完整生命周期   自第一次调用onCreate()开始,直至调用onDestroy()为止。Activity在onCreate()中设置所有“ 全局”状态以完成初始化,而在onDestroy()中释放所有系统资源。例如,如果Activity有一个线 程在后台运行从网络上下载数据,它会在onCreate()创建线程,而在 onDestroy()销毁线程。   Activity的可视生命周期   自onStart()调用开始直到相应的onStop()调用结束。在此期间,用户可以在屏幕上看到Activity ,尽管它也许并不是位于前台或者也不与用户进行交互。在这两个方法之间,我们可以保留用来向 用户显示这个Activity所需的资源。例如,当用户不再看见我们显示的内容时,我们可以在onStart ()中注册一个BroadcastReceiver来监控会影响UI的变化,而在onStop()中来注消。onStart() 和 onStop() 方法可以随着应用程序是否为用户可见而被多次调用。   Activity的前台生命周期   自onResume()调用起,至相应的onPause()调用为止。在此期间,Activity位于前台最上面并与用 户进行交互。Activity会经常在暂停和恢复之间进行状态转换——例如当设备转入休眠状态或者有新 的Activity启动时,将调用onPause() 方法。当Activity获得结果或者接收到新的Intent时会调用 onResume() 方法。关于前台生命周期循环的例子请见PPT下方备注栏。 Activity和Task   一个应用程序可以有多个Activity   多个Activity顺序的排列在“back stack”中(类似堆栈,后进先出)   应用程序可以调用其他应用程序的Activity   发送邮件   组装一个action为“send”的Intent,对此感兴趣的Activity会接受并响应   多个Activity可以支持接受同一个Intent(用户选择)   位于同一个Task中   当用户点击桌面应用程序图标时   如果已经存在Task,则恢复到前台,堆栈top位置的Activity显示   如果不存在Task,则设置为“main”的Activity做为Root Activity显示   当用户点击back键时,Task中位于top位置的Activity弹出,且被销毁   当用户开启另一个Task或者点击Home键时,原Task转移到后台   后台的Activities处于stopped状态   后台的Activities可以重新回到前台显示   系统会在必要时回收后台资源   Activity可以在不同的Task中被实例化多次 Activity和Task 注意:位于后台的Task随时可能被销毁,因此对 于不希望丢失数据的重要程序,需要考虑通过 onSaveInstanceState() 保存Activity的状态。 Activity和Task 管理Task  Android默认在同一个Task的back stack 中新建和运行Activities(后进先出)  一些特殊需求  让新Activity在新Task中运行  重用之前的Activity实例  Android允许根据特殊需求定义Activity 的运行模式 定义运行模式  使用manifest配置文件  使用intent flags  四种模式  standard:默认  singleTop:多实例,Activity位于top时可重用  singleTask:单实例,可新建Task,Task中可有多个 Activity  singleInstance:单实例,所在Task只包含自身唯一实例 singleTop运行模式 可重用 不可重用 singleTask运行模式 Intent和Intent Filters  Intent是Activity之间的粘合剂  Intent包含了各种信息  显式Intent  明确指出了目标组件名称  多用于应用程序内部传递消息  比如:一个Activity启动一个Service  隐式Intent  没有明确指出目标组件名称  用于在不同应用程序之间传递消息  Intent解析:Intent Filters Intent组成   组件名称   显式Intent   如果没有指定组件名称,即为隐式Intent。Android通过Intent内的其他信息和已注册的 IntentFilter的比较来选择合适的目标组件   Action(动作)   描述Intent所触发的动作名称字符串   ACTION_CALL   Data(数据)   描述Intent要操作的数据URI和数据类型   tel://086 020 32123442   Category(类别)   描述Intent的类别   CATEGORY_LAUNCHER   Extra   Intent中额外的信息   EXTRA_BCC 解析Intent  只有隐式Intent需要通过IntentFilter解析  解析依据Intent中三个因素  Action  中至少要有一个  如果Intent的action有值,则必须匹配才通过;无值则通过  Data  type和scheme必须匹配  如果指定authority或path,也必须匹配  Category  Intent中的所有Category必须与中的完全匹 配 添加新的Activity  新建一个继承Activity的类:SecondActivity 添加新的Activity  在AndroidManifest.xml文件中添加上述Activity的配置代码 打开SecondActivity,不传数据   HelloActivity   增加一个Button打开SecondActivity   使用startActivity(Intent intent) 打开SecondActivity,传递数据   HelloActivity   使用Bundle对象作载体   或直接调用intent.putExtras(String name, String value) 数据载体Bundle  类似Map,存放key-value键值对  常用类型存取方法  getString(String key)  getInt(String key)  putString(String key, String value)  putInt(String key, int value)  ⋯⋯  Bundle内部使用了HashMap类型的变量存放 putXxx()方法放入的值  常用于不同Activity间传递数据  也可作为同一Activity不同生命周期转换的数据载体 打开SecondActivity,传递数据   修改SecondActivity中的方法,接收数据   在LogCat中打印结果 获取SecondActivity关闭后返回 数据   修改HelloActivity中的方法   使用startActivityForResult(Intent intent, int requestCode)打开SecondActivity  请求码可以自己定义   使用onActivityResult(int requestCode, int resultCode, Intent data)获得返回数据  requestCode为请求码,即调用startActivityForResult()传递过去的值  resultCode为结果码,结果码用于标识返回数据来自哪个新Activity 获取SecondActivity关闭后返回 数据  修改SecondActivity  增加一个Button关闭自身  通过setResult(int resultCode, Intent intent)设置返回 数据 请求码和结果码的作用  请求码作用  请求码的值由用户自己设定  可能有多个按钮需要请求另外的Activity关闭后返回的数据  onActivityResult()方法需要知道返回数据是由哪个按钮 请求,以便做业务处理  结果码作用  结果码的值可由用户自己设定  startActivityForResult()方法可能被使用多次,打开不 同的新Activity  onActivityResult()方法需要知道返回数据来自哪个新 Activity,或根据不同结果码处理业务 Activity相关总结  创建Activity  startActivity()  startActivityForResult()  关闭Activity  finish()  给Activity设置UI  setContentView()  在manifest中声明   Activity的生命周期 Service  必须在manifest中声明  具有较长的生命周期  Serivice运行在后台  音乐播放器  进程管理器  没有UI界面  不阻塞其他应用运行 Broadcast Receivers  异步接收广播Intent  发送广播Intent  对外部事件作出响应  邮件、短信、电池电量低、网络可用  不能显示UI,只能通知  通过NotificationManager  广播Intent可以被订阅了此Intent的多个Broadcast Receivers所接  通过IntentFilter  类似JMS中的Topic消息接收者 ContentProviders共享数据  应用程序之间共享数据  联系人信息  音乐播放列表  操作数据  增删改查  系统本地的ContentProvider  Browser  CallLog  Contacts  MediaStore  Settings 调试:DDMS的使用   使用LogCat查看日志   Log.d(String tag, String msg)   Log.i(String tag, String msg)   Log.w(String tag, String msg)   Log.e(String tag, String msg) 调试:DDMS的使用 调试:DDMS的使用  使用LogCat过滤日志  直接使用filter  创建自定义filter 调试:DDMS的使用   操作sdcard   Pull a file from the device   Push a file onto the device 学习Android的方法  阅读SDK自带的docs  对照源码运行模拟器中的ApiDemo  在Eclipse中为SDK关联上源码 练习:用LogCat跟踪生命周期 发布Android应用 导出 发布Android应用 1、创建keystore 2、填写key相关信息 3、选择apk导出位置 发布Android应用到Market   需要拥有google帐号   需要$25注册费用 ANY QUESTION?
还剩71页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

huangqj83

贡献于2013-10-27

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf