资源描述
单击此处编辑母版标题样式,编辑母版文本样式,第二级,第三级,第四级,第五级,2021/12/2 Thursday,#,Android,开发项目实战,课程内容,contents,简易计算器,基于离线数据的天气应用,-,天气预报(一),天天爱读书手机阅读器,基于本地图库的图片应用,-,幻彩手机相册,学习监督器,简易网络音乐播放器,6,5,4,3,2,1,课程内容,contents,新闻客户端,基于网络通信的天气应用,-,天气预报(二),商务通讯录,蓝牙打印机,基于,socket,的,Bmop,即时通讯,易行打车,9,8,7,10,11,12,课程内容,contents,课程考核,Examination,本课程共计,12,章,,每周更新一次,按时提交作业,完成作业互评,完成,线上考核,在完成度和考核都达标后,可以取得本课程的达标证书。,项目一,简易计算器,目录,contents,目录,contents,项目导读,教学目标,1.1,总体设计,1.2,详细设计,6,5,4,3,2,1,7,1.3,代码实现,1.4,关,键知识点解析,1.5,问题与讨论,项目导读,1,、,要求使用,Android,原生开发技术实现一款具有加、减、乘、除运算功能的计算器应用,;,2,、,用户可以按数学运算法则,输入数字和运算符号,进行运算,运算结果可以参与下一次运算,运算结果支持,12,位显示,;,3,、,支持正值、负值、小数的运算,;,4,、,支持非法输入的验证及提示,;,5,、,支持退格以修改数据,;,6,、,支持清屏和重置,;,7,、,支持展示最近几次的计算记录,;,从简易计算器项目入手,,学习,一套较完整的简易计算器项目的建设流程,模拟企业级原生移动应用开发的主要环节,从项目总体分析、功能模块拆分,操作流程分析,功能及界面设计、编码等多个重要环节对项目进行讲述,项目虽小,但依然能够体验到企业级移动应用开发的基本方式方法。,教学目标,1,、掌握基础界面布局;,2,、掌握输入控件、按钮控件;,3,、控件,OnClick,事件的多种实现方式;,4,、使用百分比技巧进行布局;,1,)拥有友好的计算器界面友好,便于用户方便使用;,2,)显示,12,位结果,具有基本的加、减、乘、除功能;,3,)能够判断用户输入运算数是否正确;,4,)支持小数运算;,5,)具有退格功能,能够删除最后一个输入;,6,)具有清除功能,即,C,;,7,)具有结果存储功能,能够显示存储器状态,支持触屏手机;,根据项目需求进行分析,整个程序除总体模块外,主要分为输入模块、显示模块以及计算模块这三大部分,应实现以下功能:,总体分析(,1.1.1,),总体设计,根据总体分析结果,可以总结以下功能模块:,功能模块框图(,1.1.2,),总体设计,根据总体分析结果,及功能模块框图,梳理出系统主要流程:,系统流程图(,1.1.3,),总体设计,主界面是程序操作过程中必不可少的,它是与用户交互中的重要环节。通过主界面,用户可以调用系统相关的各个模块,使用系统中实现的各个功能。,界面设计(,1.1.4,),总体设计,模块描述(,1.2.1,-1,),详细设计,总体模块,总体模块需要完成的任务主要就是系统的程序启动类,需要负责整个系统的生命周期。,同时还要在模块中完成菜单栏的所有功能,即退出程序,记忆数据,显示数据,清除记忆数据这四个功能。,模块描述(,1.2.1,-2,),详细设计,输入模块,输入模块主要的任务是描述计算器键盘以及实现键盘的监听,即当用户点击按键或者屏幕的时候监听器会去调用相应的处理办法或其它相应处理模块。,本模块还需要为系统提供了一个较为直观的键盘图形用户界面。,模块描述(,1.2.1,-3,),详细设计,计算模块,计算模块的设计是本次系统设计中的重点,当输入模块的监听传到计算模块中时,计算模块就要根据相应的方法进行进一步的处理。,模块描述(,1.2.1,-4,),详细设计,显示模块,显示模块需要对计算器的计算区域进行展示,使用户能够看到整个计算器的画面。该区域的显示信息包括用户输入的数据以及最终的计算结果和一些其它信息。同时本模块还将提供调用和设置显示的具体方法。,根据系统功能设计,本系统仅需一个,Activity,类,系统的几个功能实现方式基本相同,因此系统可以按照一个包规划,在包中设计不同的方法支持不同的功能。,系统包及其资源规划(,1.2.2,),详细设计,根据之前的分析和功能划分情况,梳理出系统主要流程:,主要方法流程设计(,1.2.3,),详细设计,系统主界面是系统进入后显示的界面,该界面包括一个,ScrollView,,两个,TextView,,若干个,Button,。,显示界面布局(,1.3.1,),代码实现,在工程的,res/layout,目录下,创建一个名称为“,activity_main.xml”,的布局文件(部分代码示例如下所示),布局文件外层是,RelativeLayout,,内层嵌套,LinearLayout,完成布局管理。该布局文件中有一个,ScrollView,中放置了一个,TextView,,用于显示计算记录,另外一个,TextView,用于显示输入数值和计算结果,十九个,Button,用于用户输入和计算操作控制。,控件设计实现(,1.3.2,),代码实现,LinearLayout,android:layout_width=match_parent,android:layout_height=match_parent,android:layout_centerHorizontal=true,控件事件处理方法实现(,1.3.3,),代码实现,MainActivity,的创建;,数值输入响应方法,addNumber(),;,运算符输入响应方法,doCalc(),;,清除操作符输入响应方法,delNumber(),;,数值计算方法实现(,1.3.4,),代码实现,加减乘除计算;,开方运算响应方法;,负数操作;,关键知识点解析(,1.4,),1.4.1,、在程序中创建菜单;,1.4.2,、基础界面布局;,1.4.3,、设置程序名称和图标;,1.4.4,、常用文本输入控件及按钮;,1.4.5,、为按钮增加多种样式,selector,;,1.4.6,、多分辨率适配利器,LinearLayout,;,问题与讨论(,1.5,),1,、程序如何适应不同的分辨率。,2,、按钮有几种不同的状态,如何通过配置,XML,格式布局文件实现在不同状态下显示不同背景图片。,项目二,基于离线数据的天气应用,-,天气预报(一),目录,contents,目录,contents,项目导读,教学目标,2.1,总体设计,2.2,详细设计,6,5,4,3,2,1,7,2.3,代码实现,2.4,关,键知识点解析,2.5,问题与讨论,项目导读,1,、根据所选城市显示其天气信息;,2,、可以选择并收藏多个城市,选择多城市后,天气信息可以通过手势再不同城市之间切换;,3,、根据雨、雪、阴、晴等天气情况,分别显示不同的图标;,通过对天气预报应用开发过程的学习,进一步掌握移动应用开发的重要思想,在注重项目总体分析、功能模块拆分,操作流程分析,功能及界面设计的同时,们进一步增加了程序架构设计的介绍,架构设计在整个应用的实现过程中起到了举足轻重的作用,学习本章时,希望读者能够初步体会到架构设计的概要。,教学目标,1,、简单程序的架构设计,2,、掌握,ListView,和,GridView,控件的用法,3,、掌握,ViewPager,控件的用法,4,、为何匿名内部类可以直接访问外部类的成员和其方法?,5,、自定义,Adapter,天气预报应用应实现以下功能:界面友好,方便使用,显示城市名、当日温度区间、天气情况、实时温度及实时天气的图标,还能够显示未来几天的天气情况;可添加城市,添加新城市后,能显示新城市的天气,并支持不同城市间天气信息页的切换。,本应用基于离线的天气信息数据,数据保存在程序代码中。,整个程序除总体模块外,主要分为用户界面模块、数据管理与控制模块以及基础架构模块这三大部分。在整个系统中总体模块控制系统的生命周期,用户界面模块部分负责显示城市天气数据、天气状态图标以及各个城市间的显示切换,数据管理与控制模块主要提供数据管理功能,数据管理与控制模块为用户界面模块提供数据,同时数据管理与控制模块接受并保存用户界面模块产生的数据。,总体分析(,2.1.1,),总体设计,根据总体分析结果,可以总结以下功能模块:,功能模块框图(,2.1.2,),总体设计,根据总体分析结果,及功能模块框图,梳理出系统启动的主要流程:,系统流程图(,2.1.3,),总体设计,根据程序功能需求,可以规划出软件的主要界面包括启动应用程序页面、设置界面、显示界面。,界面设计(,2.1.4,),总体设计,模块描述(,2.2.1,-1,),详细设计,基础架构模块,基础架构模块主要提供程序架构、所有,Activity,公用的父类、所有,Activity,公用的方法,包括自定义风格,dialog,、自定义提示框等功能。,模块描述(,2.2.1,-2,),详细设计,用户界面模块,用户界面模块主要的任务是显示天气信息以及实现与用户的交互,即当用户点击按键或者屏幕的时候监听器会去调用相应的处理办法或其它相应处理模块。,模块描述(,2.2.1,-3,),详细设计,数据管理与控制模块,数据管理与控制模块主要提供数据获取、数据解析、数据组织、数据缓存功能。,数据管理与控制模块和用户界面模块可以调用基础架构模块的一些通用方法,数据管理与控制模块为用户界面模块提供数据,同时数据管理与控制模块可以接受并保存用户界面模块产生的数据。,在系统的各个模块的实现方式和流程设计完成后,就可以对系统主要的包和资源进行规划,划分的原则主要是保持各个包相互独立,耦合度尽量低。,系统包及其资源规划(,2.2.2,),详细设计,根据之前的分析和功能划分情况,梳理出系统主要流程:,主要方法流程设计(,2.2.3,),详细设计,系统主界面是系统进入后显示的界面,该界面包括一个,PageView,,一个,ListView,,若干个,TextView,。,城市设置界面是系统用于设置在主界面显示的城市,设置界面中显示了,34,个大城市的名称,用户可以设置选择,该界面包括一个,GridView,。,显示界面布局(,2.3.1,),代码实现,activity_base.xml,在工程的,res/layout,目录下,创建一个名称为“,activity_base.xml”,的布局文件,布局文件是,RelativeLayout,布局管理。该布局文件中放置了一个,TextView,和两个,Button,,,TextView,用于显示页面标题,一个,Button,用于显示标题栏左侧的返回按钮,默认为隐藏,一个,Button,用于显示标题栏右侧的城市按钮,用于显示选择城市页面。,控件设计实现(,2.3.2,-1,),代码实现,Button,android:id=+id/back_btn,activity_main.xml,在工程的,res/layout,目录下,创建一个名称为“,activity_main.xml”,的布局文件,布局文件外层是,LinearLayout,,内层嵌套,LinearLayout,完成布局管理。该布局文件中放置了三个,TextView,,分别用于显示城市、天气和实时温度,,ListView,用于显示未来几天的天气情况。,控件设计实现(,2.3.2,-2,),代码实现,readHeight)/,超出范围了,则不做翻页,return false;,mPageWidget.abortAnimation();,mPageWidget.calcCornerXY(e.getX(),e.getY();,pagefactory.onDraw(mCurPageCanvas);,if(mPageWidget.DragToRight()/,左翻,try,pagefactory.prePage();,关键知识点解析(,3.4,),3.4.1,、,Android,的,Touch,事件处理机制;,3.4.2,、掌握自定义控件;,自定义,View,的属性;,在布局文件中使用上述自定义的属性;,在,View,的构造方法中获得,attr.xml,中的自定义的属性;,重写,onMesure,;,重写,onDraw,;,问题与讨论(,3.5,),1,、在,AndroidMenifest.xml,中使用什么标签来设置,ContentProvider,。,项目四,基于本地图库的图片应用,-,幻彩手机相册,目录,contents,目录,contents,项目导读,教学目标,4.1,总体设计,4.2,详细设计,6,5,4,3,2,1,7,4.3,代码实现,4.4,关,键知识点解析,4.5,问题与讨论,项目导读,1,、可浏览手机相册中的图片;,2,、图片切换特效实现;,3,、图片旋转,缩放实现;,4,、媒体播放器实现,;,在企业级,Android,应用开发中,针对图片的处理和优化是应用中必不可少的功能,也是初学者经常遇到且无从解决的难点,熟练的掌握图片的各种操作及优化方法,可以使应用的体验和性能大幅提升,因此,作为,Android,应用,UI,开发技术中的重中之重,我们在本章中要学习完整的图库应用开发,进一步掌握图片的加载、剪裁、缩放、压缩等功能实现方法。,教学目标,1,、学习读取图库中的图片方法;,2,、图片处理方法;,3,、媒体播放器调用;,功能模块框图(,4.1.1,),总体设计,根据总体分析结果,可以总结以下功能模块:,根据总体分析结果及功能模块框图,梳理出系统启动的主要流程:,系统流程图(,4.1.2,),总体设计,根据程序功能需求,可以规划出软件的主要界面,包括图片表格列表界面、详细查看界面,。,界面设计(,4.1.3,),总体设计,模块描述(,4.2.1,-1,),详细设计,基础架构模块,基础架构模块主要提供程序架构、所有,Activity,公用的父类、所有,Activity,公用的方法,包括自定义风格,dialog,、自定义提示框等功能。,模块描述(,4.2.1,-2,),详细设计,用户界面模块,用户界面模块主要的任务是显示书籍列表和详细页,以及实现与用户的交互,即当用户点击按键或者屏幕的时候监听器会去调用相应的处理办法或其它相应处理模块。,本模块包括书籍列表、详细阅读、设置管理等功能。,文件结构,在系统的各个模块的实现方式和流程设计完成后,就可以对系统主要的包和资源进行规划,划分的原则主要是保持各个包相互独立,耦合度尽量低。,系统包及其资源规划(,4.2.2,-1,),详细设计,命名空间,示例设置了多个命名空间,分别用来保存用户界面、后台服务的源代码文件。,系统包及其资源规划(,4.2.2,-2,),详细设计,命名空间,说明,.cucsi.android.app,该包下放置应用程序主要,Activity,.cucsi.android.app.directory,该包下放置文件浏览器的相关代码,.cucsi.android.app.gallery.cursor,该包下放置照片管理器的数据适配器,.cucsi.android.app.imagedetail,该包下放置图片查看相关代码,.cucsi.android.app.queries,该包下放置数据查询相关代码,.cucsi.android.util,该包下放置重新实现的部分,Android,原生类,.cucsi.android.widget,该包下放置自定义小控件,.cucsi.database,数据库操作,.cucsi.io,该包下放置文件输入输出操作相关代码,.cucsi.util,该包下放置通用工具类,源代码文件,系统包及其资源规划(,4.2.2,-3,),详细设计,资源文件,Android,的资源文件保存在,/res,的子目录中,,/res/drawable,目录中保存的是图像文件,,/res/layout,目录中保存的是布局文件,,/res/values,目录中保存的是用来定义字符串和颜色的文件。,系统包及其资源规划(,4.2.2,-4,),详细设计,资源目录,文件,说明,drawable,ic_launcher.png,程序主图标,image_loading.png,加载过场,layout,activity_dir_choose.xml,目录选择布局,activity_gallery.xml,相册基本布局,activity_gallery_filter.xml,相册过滤布局,activity_image_view_pager.xml,图片显示布局,dialog_about.xml,关于信息的对话框布局,dialog_edit_name.xml,名称编辑的对话框布局,dialog_scanner_status.xml,查询器状态对话框布局,fragment_directory.xml,文件展示的,Fragment,布局,fragment_gallery.xml,相册展示的,Fragment,布局,grid_item_gallery.xml,相册展示的网格适配器子项布局,list_item_directory_child.xml,目录展示列表的二级子项布局,list_item_directory_parent.xml,目录展示列表的一级子项布局,values,arrays.xml,数组声明,colors.xml,颜色声明,dimens.xml,屏幕适配相关参数声明,strings.xml,字符串声明,styles.xml,样式声明,主要方法流程设计(,4.2.3,),详细设计,图片显示列表页面是系统进入后显示的界面,该界面包括若干个,ImageView,。,显示界面布局(,4.3.1,),代码实现,访问系统图库首先需要通知系统负责处理用户选择图库的,Activity,,因此需要使用,Intent,,这里需要说明的是需要对版本小于,19,和大于等于,19,的,Intent,分别处理。,读取手机图库方法实现(,4.3.2,),代码实现,private void selectPicFromLocal(),Intent intent;,if(Build.VERSION.SDK_INT 19),intent=new Intent(Intent.ACTION_GET_CONTENT);,intent.setType(image/*);,else,执行完上述代码后,系统将开启用户选择图库的,Activity,供用户选择图片,选择完毕后,需要回调,onActivityResult,方法,因此我们接下来需要来学习,onActivityResult,的写法:,protected void onActivityResult(int requestCode,int resultCode,Intent data),super.onActivityResult(requestCode,resultCode,data);,if(resultCode=RESULT_OK)/,清空消息,if(requestCode=PICK_IMAGE_REQUEST_CODE)/,发送本地图片,if(data!=null),Uri selectedImage=data.getData();,当,Android,将图片加载至内存中时,开发者必须要考虑图片在内存中所占的空间,同时为了避免内存泄露,图片使用后应第一时间释放,一旦加载的图片超过内存能容纳的先定,应用就会发生内存溢出而崩溃。,通常,内存中位图(,Bitmap,)的大小,=,图片长度,x,图片宽度,x,一个像素点占用的字节数,无论减少图片长度、宽度或者每像素占用的字节,都可以降低位图的尺寸。,图片压缩(,4.3.4,),代码实现,名称,位深,位图格式,说明,ALPHA_8,8,位,Alpha,位图,该格式下一个像素点占用,1,个字节,它没有颜色,只有透明度,ARGB_4444,16,位,ARGB,位图,该格式下一个像素点占,4+4+4+4=16,位,,2,个字节,RGB_8888,32,位,ARGB,位图,该格式下一个像素点占,8+8+8+8=32,位,,4,个字节,RGB_565,16,位,RGB,位图,该格式下没有透明度,一个像素点占,5+6+5=16,位,,2,个字节,使用,Android,提供的媒体播放器(,MediaPlayer,)(,4.3.5,),代码实现,Android,提供媒体播放器封装了播放音频和视频的能力,可以满足应用中基本的音视频播放需求,我们调用过程分解为如下步骤:,1,、创建,MediaPlayer,实例;,2,、设置要播放的资源文件:,(,1,)用户在应用中事先置入的,resource,资源,(,2,)存储在,SD,卡或其他文件路径下的媒体文件,(,3,)网络上的媒体文件,3,、对播放器的进行控制;,关键知识点解析(,4.4,),4.4.1,、图片加载到内存,OOM,;,4.4.2,、,大量图片的缓存处理;,问题与讨论(,4.5,),1,、怎么读取手机图库?,2,、图像特效处理方法都有哪些?,3,、如何使用,LruCache,提升应用程序性能和效率?,项目五 学习监督器,目录,contents,目录,contents,项目导读,教学目标,5.1,总体设计,5.2,详细设计,6,5,4,3,2,1,7,5.3,代码实现,5.4,关,键知识点解析,5.5,问题与讨论,项目导读,1,、通过使用,Service,组件在后台监控网络状态,当用户在学习期间,一旦使用手机网络,学习监督应用便会进行警告;,2,、用户可以设置学习的时间段,而一旦时间被设置后,则不能轻易取消,如果要退出监督模式,需要先接受应用的惩罚;,本章从学习监督器项目入手,为读者呈现一套较完整的基于,Activity,和,Service,组件的项目建设流程,本章着重对,Android,中,Service,组件的基本用法进行介绍,继而对,Service,组件的进阶用法进行讲解。,教学目标,1,、掌握启动,(start)Service,的方法,2,、掌握绑定(,bind,),Service,的方法,3,、掌握,Service,与,Activity,直接交互通信的方法,4,、掌握在前台运行服务,5,、学会管理服务的生命周期,6,、使用,AIDL,进行进程间通信,7,、掌握,MediaPlayer,的用法,根据项目需求进行分析,学习监督器本身的功能比较简单,每次启动时,首先展示一个欢迎页面,短暂停留后,将进入应用主界面,主界面中可以设定起始时间和结束时间,在此时间范围内,学习监督器将对用户进行上网行为监督,一旦用户开启网络链接,无论,4G,网络还是,Wifi,网络,学习监督器都会发现并且对用户进行警告,警告包括巨大声音的音乐和持续不停的震动,直至用户关闭网络,警告行为将停止。,总体分析(,5.1.1,),总体设计,根据总体分析结果,可以总结以下功能模块:,功能模块框图(,5.1.2,),总体设计,图,5-1,功能模块图,图,5-2,后台监控方法图,图,5-3,监督提醒方法图,根据总体分析结果,及功能模块框图,梳理出系统启动的主要流程:,系统流程图(,5.1.3,),总体设计,根据需求,至少应该有两个主要界面,即时间设置页面和监督提醒页面,同时,考虑到应用的完整性,还需要设计欢迎页和帮助说明页面。,界面设计(,5.1.4,),总体设计,欢迎界面设计图,时间设置界面设计图,监督提醒界面设计图,帮助说明界面设计图,对应界面设计图,本系统至少需要四个,Activity,类,欢迎界面对应,SplashActivity,,时间设置界面对应,MainActivity,,监督提醒界面对应,PunishActivity,,帮助说明界面对应,GuideActivity,。,系统包及其资源规划(,5.2.1,),详细设计,时间设置,Activity,设计(,5.2.2,),详细设计,时间设置,Activity,作为应用的主,Activity,,负责与用户交互的主要环节,包括接收用户设置的时间、保存时间、初始化后台服务等。,设置时间可以考虑使用,Android,原生,TimePicker,控件,也可以使用包含,TimePicker,的,TimePickerDialog,弹出框。,保存时间的设置信息可以使用,Android,的,SharedPreferences,进行简单文本信息的存储与读取。,初始化后台服务有两种方式,启动服务(,startService,)和绑定服务(,bindService,),实现后台服务的组件叫做,Service,,作为可以在后台执行长时间运行操作而不提供用户界面的应用组件,,Service,一般由其他应用组件(,Activity,、,Service,、,BroadcastReceiver,)启动,即使应用被用户切换到后台,服务仍将在后台继续运行。,服务分为启动服务(,startService,)和绑定服务(,bindService,),前者是由应用组件调用,startService(),方法发起的,绑定服务是由应用组件调用,bindService(),方法发起的,此时服务将处于“绑定”状态,只有当服务与某个组件绑定成功时,绑定服务才能运行,这种服务提供了一个,C/S,接口,允许绑定服务的组件与服务进行交互、发送请求、获取结果。例如,播放音乐、执行网络或文件,I/O,操作 或与,ContentProvider,交互时,都需要绑定服务的组件与启动后的服务进行数据交互。,后台服务设计(,5.2.3,),详细设计,系统主界面使用,LinearLayout,进行布局,其中,使用了,TimePicker,控件用于设置监督的起始时间和结束时间,其主要代码如下:,显示界面布局(,5.3.1,),代码实现,TextView android:id=+id/start android:layout_height=wrap_content,android:layout_width=wrap_content,android:textSize=20sp,要创建服务,我们必须创建,Service,的子类,继承,Service,类,同时重写部分回调方法,用来对服务生命周期中的关键事件进行处理。要重写的几个重要回调方法包括:,构建一个服务(,5.3.2,),代码实现,onStartCommand(),onBind(),onCreate(),onDestroy(),public class MonitorService extends Service,static final String TAG=MonitorService;,Override,public void onCreate(),super.onCreate();,Override,public IBinder onBind(Intent arg0),/,仅通过,startService,方式启动服务而不需要绑定服务时,,onBind,方法可以返回,null,return null;,创建启动,Service,(,5.3.3,),代码实现,服务启动之后,其生命周期即独立于启动它的组件,并且可以在后台无限期地运行,即使启动服务的组件已被销毁也不受影响。因此,服务应通过调用,stopSelf(),结束工作来自行停止运行,或者由另一个组件通过调用,stopService(),来停止它。,应用组件(如,Activity,)可以通过调用,startService(),方法并传递,Intent,对象(指定服务并包含待使用服务的所有数据)来启动服务。服务通过,onStartCommand(),方法接收此,Intent,。,Override,public int onStartCommand(Intent intent,int flags,int startId),Log.e(TAG,onStartCommand()has been invoked!);,monitorNetwork();,return super.onStartCommand(intent,flags,startId);,监控网络变化(,5.3.4,),代码实现,当系统网络发生变化时,(Wifi,切换、,4G,切换等,),,系统会向应用程序发送广播,应用程序可以通过注册广播接收器来接收通知,我们可以在,MonitorService,中注册一个专门用了接收系统统网络变化的广播接收器,代码如下:,/,注册广播接收者进行网络状态的监听,private BroadcastReceiver mReceiver=new BroadcastReceiver(),Override,public void onReceive(Context context,Intent intent),String action=intent.getAction();,if(action.equals(ConnectivityManager.CONNECTIVITY_ACTION),Log.e(tag,nwtwork changed);,monitorNetwork();,;,时间比较(,5.3.5,),代码实现,private boolean compareTime(),final Calendar c=Calendar.getInstance();,int currentHour=c.get(Calendar.HOUR_OF_DAY);/,获取当前的小时数,int currentMinute=c.get(Calendar.MINUTE);/,获取当前的分钟数,startHour=sharedPreferences.getInt(startHour,8);,startMinite=sharedPreferences.getInt(startMinite,0);,endHour=sharedPreferences.getInt(endHour,23);,endMinute=sharedPreferences.getInt(endMinute,0);,Log.e(TAG,currentHour:+currentHour);,Log.e(TAG,currentMinute:+currentMinute);,countTime1=startHour*60+startMinite;,countTime2=endHour*60+endMinute;,Log.e(TAG,get countTime1,:,+countTime1);,Log.e(TAG,get countTime2,:,+countTime2);,int nowCountTime=currentHour*60+currentMinute;,Log.e(TAG,get currentTime,:,+nowCountTime);,if(countTime1countTime2),当用户进行监控时间范围后,,MonitorService,将进行当前时间和用户设置时间的比较,如果当前时间在用户设置时间的范围内,则返回,true,,否则返回,false,,代码如下:,创建绑定,Service,(,5.3.6,),代码实现,private final IBinder mBinder=new LocalBinder();,public class LocalBinder extends Binder,public MonitorService getService(),return MonitorService.this;,Override,public IBinder onBind(Intent intent),return mBinder;,1.,首先在,MonitorService,类中,创建一个,Binder,实例;,2.,从,onBind(),回调方法返回此,Binder,实例;,3.,在客户端中,从,onServiceConnected(),回调方法接收,Binder,,并使用提供的方法调用绑定服务。,使用,Activity,作为,Dialog,(,5.3.7,),代码实现,Activity,和布局本身的创建并没有什么特别,要点在于,AndroidManifest.xml,清单文件中,android:theme,节点的设置,需要对该节点设置合适的,style,,设置方法如下:,其中引用的,theme01,需要在,values/styles.xml,中进行定义,这个自定义的样式需要继承,android,系统的对话框样式,android:style/Theme.Dialog,,定义方法如下:,通过这种方式,我们便可以创建创建,Dialog,效果的,Activity,。,关键知识点解析(,5.4,),5.4.1,、在前台运行服务;,5.4.2,、,Service,的生命周期;,5.4.3,、避免系统回收,Service,;,问题与讨论(,5.5,),1,、程序如何适应不同的分辨率。,2,、按钮有几种不同的状态,如何通过配置,XML,格式布局文件实现在不同状态下显示不同背景图片。,项目六 简易网络音乐播放器,目录,contents,目录,contents,项目导读,教学目标,6.1,总体设计,6.2,详细设计,6,5,4,3,2,1,7,6.3,代码实现,6.4,关,键知识点解析,6.5,问题与讨论,项目导读,1,、从网络接口获取音频文件列表数据,解析后生成音频列表并显示。,2,、实现音频文件的下载和播放;,学习网络交互相关技术需要首先解决如下两个问题:,由于,Android,系统禁止在,UI,主线程中进行网络交互等耗时操作,因此网络交互通常需要在工作线程中进行,这就需要掌握某些线程间消息传递的机制,为,UI,主线程与工作线程直接建立信息交互的渠道。,数据在网络间传递的过程中,一般采用,JSON,、,XML,等格式传递,在这个过程中,我们一般需要学习数据解析的相关技术。,教学目标,1,、学习使用,AsyncTask,在后台线程运行的同时进行,UI,界面刷新。,2,、学习使用和读取资产文件夹(,assets,)中的文件。,3,、学习利用,HttpUrlConnection,工具进行网络通信。,4,、学习将网络文件下载到手机存储。,5,、本地文件缓存机制初步学习。,6,、,Xml,数据解析,-,使用,DocumentBuilder,解析,XML,。,7,、掌握媒体播放器,MediaPlayer,类的使用。,8,、了解,Service,组件的基本使用方式。,9,、了解,BroadcastReceiver,组件的基本使用方式。,10,、掌握,Activity,与,Service,通信的基本方法。,11,、掌握,Service,通知,Activity,并刷新,UI,界面的方法。,手机铃声应用应实现以下功能:铃声列表显示,铃声文件下载到本地,铃声播放试听;播放铃声包括在线播放和下载播放。,整个程序除总体模块外,主要分为用户界面模块、数据管理与控制模块、网络通信模块以及基础架构模块这四大部分。在整个系统中总体模块控制系统的生命周期,用户界面模块部分负责界面显示,数据管理与控制模块主要提供数据管理功能,网络通信模块负责与服务器通信,基础架构模块提供各项基础功能,供其它模块调用。,总体分析(,6.1.1,),总体设计,根据总体分析结果,可以总结以下功能模块:,功能模块框图(,6.1.2,),总体设计,根据总体分析结果,及功能模块框图,梳理出系统启动的主要流程:,系统流程图(,6.1.3,),总体设计,本应用是显示铃声的应用,支持铃声文件下载到本地,铃声播放试听。软件的主要界面包括铃声列表、铃声下载按钮、铃声播放按钮。,界面设计(,6.1.4,),总体设计,模块描述(,6.2.1,-1,),详细设计,基础架构模块,基础架构模块主要提供程序架构、所有,Activity,公用的父类、所有,
展开阅读全文