版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1绪论近年来,除了互联网的迅猛发展,另一个急速发展起来的前沿技术就不得不说智能手机以及其应用软件的高速发展。智能手机以个人计算机以及运营商的服务器为处理终端,并利用一些前沿技术如人工智能、人机接口技术、传感技术、多媒体技术、计算机图形学等高度并行的实时计算技术来实现人机的交互。其中以个人版的智能手机的应用软件等一系列的手机应用软件发展尤为迅速。当今无论是工作人群还是在校学生,所面临的压力都是十分巨大的,而一些繁杂的事务记忆也使我们身心疲劳,日历提醒软件可以让我们在百忙的生活学习中从一些繁杂的事务记忆中解脱出来,它可以准确地提醒我们一些关键事务的处理时间段,而这样一款可以随时随地在手机上应用的提醒软件,其魅力是不可估量的。1.1课题背景及设计意义智能手机应用软件是近年来十分活跃的技术领域,目前市场上安卓智能手机的实用人群还是十分多的,手机几乎成为了我们日常工作以及其他生活娱乐的必需品,所以在安卓平台上开发的手机应用软件有着十分广阔的市场,既然安卓的应用软件面向的是广大的普通用户,而不是对软件开发以及计算机的一系列了解十分透彻的专家,所以设计出来的软件一定要简单而且易使用,所以在手机软件设计时,一定要注意软件使用的简单性以及通俗性。手机的多任务处理是一个十分重要的环节,在一些日常的短信以及通话等行为中,手机的一些软件应该支持后台的运行以及一些优先级的处理,这就需要日历提醒软件能够在工作时考虑到手机当前程序的一个运行状况,这样才能更好地处理一些应用软件在使用时的一些优先级问题,保证其进程能够在后台完美地运行,从而达到应用程序之间的良好切换。最后就是十分简洁的操作界面以及简单的操作方式,还有十分美观的界面背景,以及一些人性化的提示和个性设计也是十分重要的,所以在设计的过程中一定要注意一些细节方面的东西,这样日历提醒软件的设计才能更加完美和实用。1.2国内外移动应用开发的背景目前智能手机的迅速发展以android以及苹果的IOS为主要领头,谷歌在2012年的开发者大会上发布了android4.1操作系统,到目前为止已经更新到了4.4.2版本,谷歌的android自2010年来呈现了突飞猛进的发展势头,其用户数量也是呈现高速地增长。对于android本身来言,其开放式的开源性是其最主要的特点,这个特点使得以前由少数软件商垄断系统软件平台的状况得到了极大地改善,让更多的民间开发商加入进来,增加了客户使用的体验,因此也具有十分广阔的发展空间。1.3本论文的主要内容本论文主要通过对日历提醒软件做一个详细系统的设计,从开发环境的搭建到最后的系统测试,每个步骤都写出了基本的方法和一些代码,最终实现了哪些功能等都做了详细的介绍,例如:开发环境的搭建以及系统概要设计时的一些思想,还有在详细设计时实现的功能,通过上述内容,最终软件实现了两个主要功能,即日程管理功能和课程管理功能。这两个功能的实现,基本上解决了软件设计时提出的问题,而通过对软件的设计,我们从中也学习到了很多的知识和技能。2Android及开发环境介绍2.1android系统自身的特点Android是基于Linux操作内核的系统,android的语言是基于Java语言的,其中还涉及一些C以及C++语言。如果使用者本身对Java语言十分地熟悉,那使用起来会比较得心应手。android是基于Eclipse平台做开发,并且使用androidSDK插件来辅助开发,而且具有丰富的源代码模型,在源码上的处理上也比较良好,这样就使得开发者在开发软件时的难度降低。2.2android系统自身的功能特征(l)应用程序架构:android在应用程序架构中拥有多种不同的基础组件,在使用起来可以通过调用这些组件,来减少开发所需要的时间和精力。Dalvik虚拟机器:Google使用自主开发的代号为Dalvik的虚拟机,它既保证了在API方面的兼容性,而且使手机运行效率更高,占用的资源更少。集成的浏览器:android具有内建的集成浏览器,它是以WebKit这个开源浏览引擎为基础开发的浏览器,还有Safari,Midori,Epiphany等目前都在使用。集成浏览器在浏览网页时,可以达到比较出色的效果,提高用户体验。绘图能力得到优化:一般程序用到的绘图分为2D和3D方面,OpenGLES1.0规范的类库在3D方面被采用,而在2D方面,SGL则被广泛采用。这两种引擎十分地快捷,并且支持硬件加速。数据库SQLite:这是一种轻型的数据库,它能够提供结构化的数据存储,它支持多种的操作系统,例如Windows、Linux、Unix等,同时也兼容PHP,Java等语言,它本身还是开放式的关联式资料库,虽然它本身并不是很大,但是他支持的SQL语句却不逊色于其他的开源数据库,它小巧轻量的设计,使它更适用于手机。支持多种多媒体:主要支持多种用于播放的媒体文件,例如MP3等多种音频音乐文件,还支持统一资源识别地址URI--Web上可用的每种资源:-HTML文档、图像、视频片段、程序等。另外还支持JPG、PNG、GIF等多种图像格式。GSM技术:GSM是GlobalSystemForMobileCommunications的缩写,就是全球移动通信系统,它是由欧洲电信标准组织ETSI制订的一个数字移动通信标准,也是第二代移动通信技术,他提供了一个在全球各地都可以使用的移动电话网络标准,让用户一部手机可以畅通全球。GSM技术是在手机硬件方面的展现,也是开发Android程序时的主要特点之一。蓝牙、EDGE、3G、Wi-Fi、GPS以及4G网络:这些高端前沿的技术以及科技都是手机硬件方面的体现,也是未来在开发Android应用程序时所应该突出的特点之一。2.3android的构成及其工作机制Android在开发时都是通过框架与底层进行交互,对于一个Android应用程序来说,主要是由Activity、IntentReceiver、Service、ContentProvider四部分组成,但也不是每个应用程序都有这四个部分,当使用程序时,需要在AndroidManifest.xml这个文件中进行一些配置,而这个配置文件则是每个Android应用程序所必须的,它可以对程序的组件进行定义。Android应用的构成和工作流程如图2-1所示:图2-1Android应用的构成和工作流程在Android中还包含着一些C和C++的类库,Android中的不同组件可以来使用这些类库,开发时也可以通过应用程序框架来使用这些功能。一些核心类库列表:surfaceManager:它的主要功能是存取、显示系统及管理。它可以通过在显示与存取操作间的互动等一系列的动作来实现2D与3D多应用程序之间的无接缝整合。(2)3Dlibraries:它主要是按照openGLES1.0的规范定义的3D绘图引擎,它可以将3D功能的处理显示做到最佳化。(3)SGL:主要是处理有关显示2D方面的绘图引擎。(4)MediaFramework:以packetVideo公司的OpenCORE为基础所拓展的支持大量当下流行的音频格式(MPEG4、MP3等)和静态图片(JPG、PNG、GIF等)的多媒体类库。(5)FreeType:主要是用来显示点阵图和处理向量字形的。(6)SSL:secureSocketsuyer,就是“安全套接层”,是为网络通信提供安全及数据完整性的一种安全协议。SSL协议是位于TCP/IP协议与各种应用层的协议之间的,被广泛地用于Web浏览器与服务器之间的身份认证和加密数据的传输。(7)SQLite:这是一种轻型的数据库,它能够提供结构化的数据存储,能够做为所有应用程序使用的轻量级关系数据库的引擎。(8)webKit:它是一个开源的浏览器引擎,可以构建Android浏览器和内嵌的web视图,同时具有高效稳定,兼容性好,且源码结构清晰,易于维护等特点。(9)libc:它是针对Linux嵌入式装置进行最佳化调整的一个BSD标准C类库。Android本身虽然是用Java语言来进行开发的,但它并不是使用Java的组件来运行的,它是由谷歌自行研发的核心类库以及Dalvik虚拟机等组件来运行程序。2.4如何搭建开发环境2.4.1JDK的安装开发Android应用程序的时候,仅有Java运行环境是不足以开发Android应用程序的,需要完整的JDK,且需要1.5或者1.6以上的版本。首先我们需要安装JDK,可以从/technetwork/java/jacase/downloads/index.html来下载JDK6并且安装。(《Android移动应用设计与开发》中开发环境的配置非常详细)。下一步,我们要设置JAVA_HOME环境变量来指向JDK的安装目录。右击“计算机”→“属性”→“高级系统设置”→“环境变量”。然后点击“新建”添加JAVA_HOME变量。如图2-2所示:图2-2JAVA_HOME环境变量的配置接下来配置环境变量CLASSPATH,步骤和上一步类似,变量名为CLASSPATH,变量值指向JDK目录下的LIB文件夹,同样,最后还需要编辑环境变量Path,变量值指向JDK安装目录下的BIN文件夹。这样环境变量基本上配置完成。2.4.2Eclipse的安装在《Android移动应用设计与开发》中提到:Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,他只是一个框架和一组服务,用于通过插件组件构建开发环境。从这段话中可以了解到,仅仅只有Eclipse平台是不够的,我们还需要多种的插件来配合开发。Eclipse有多种版本,可以从网上下载到,一般电脑是WIN7的32位系统,安装完成后,我们首次启动Eclipse时,我们需要给他定一个工作区间,例如F:/Eclipse。接下来就是其他组件的安装了。2.4.3AndroidSDK的安装AndroidSDK是开发安卓应用程序时的一个必须安装的组件。AndroidSDK可以从/sdk下载。下载上SDK后,接下来需要将它解压,其中的一个tools目录,最后需要将它添加到PATH中。安装界面如图2-3:图2-3AndroidSDK的安装界面2.4.4ADT的安装Eclipse中ADT这个插件对于开发Android应用程序来说具有巨大的帮助,它本身带有一些工具可以对Android应用程序进行创建、测试及调试。它需要Eclipse中的InstallNewSoftware工具来执行安装。在安装ADT的最后一步是将它指向AndroidSDK。点击菜单选择Preferences,然后选择Android节点将SDKLocation字段替换为AndroidSDK的路径,最后点击下Apply按钮即可完成操作。最终运行效果如图2-4:图2-4开发环境配置完成效果图3日历提醒软件的需求分析3.1系统的需求分析3.1.1需求分析的过程需求分析的任务不是确定软件本身要怎么样完成它的工作,而是确定软件本身需要完成哪些工作,一般可以总结为四个步骤:(1)需求获取:调查研究。对于不同软件的开发方法,在进行需求时会有所不同,但是一般都必须做到充分的调查研究,对目标系统的运行环境、功能等要与用户取得一致的意见。(2)需求提炼:分析建模。这个阶段的主要任务是建立分析模型,把来自用户的问题加以分析,并抽象建立起目标的分析模型。例如数据流图、实体联系图、控制流图、状态转换图、用例图等。(3)需求描述:编写SRS。为了使需求描述具有统一的风格,可以采用已有的模板,例如国际标准IEEE标准830-1998或者中国国家推荐标准GB9385中描述的模板,也可以根据自己项目软件的特点形成自己的SRS模板。(4)需求验证。由分析员和用户一起对需求分析的结果进行严格的审查和验证,确保需求说明可作为软件设计和最终系统验收的依据。3.1.2需求分析的方法需求分析的方法具有许多种,简单地介绍几种方法:功能分解方法:功能分解方法可以说是最早的分析方法,这个方法是将一个系统看成是由若干功能组成的一个整体,每个功能又可以分成若干个子功能,这个方法体现了“自顶向下,逐步求精”的思想,最后分析的结果一般已经是系统程序结构的一个雏形,实际上它已经很难与软件设计明确分离,难以适应用户的需求变化。结构化分析方法:结构化分析方法是一种从问题空间到某种表示的映射方法,由数据流图来表现软件的功能,这种方法比较简单、实用,适用于处理数据领域的问题,也符合传统软件工程思想。信息建模方法:信息建模方法局势从数据的角度来对现实世界建立模型,也就是现实系统的一个抽象,所以他必须能够反映实际,而且还必须高于实际。它主要依赖的工具就是实体-联系图,即E-R图。E-R图是面向对象分析的基础,但它本身对数据不是封闭的,不支持继承性和消息传递机制。面向对象的分析:面向对象的分析就是把E-R图中的概念与面向对象程序设计语言中的概念结合在一起的分析方法。在该方法中采用了实体、关系和属性等信息模型分析中的概念,同时采用了封闭、类结构和继承性等面向对象程序设计语言中的概念。3.2日历提醒软件系统的需求分析功能需求:系统需要具有日历的模块,然后是具有记事本的功能,能够在对应的日期上做一些记录,还有需要具备一个闹钟的功能,能够在合适的时间进行提醒;课程管理方面需要有一个记录每节课程时间的模块其他的功能和日程管理功能类似。性能需求:软件需要能够识别手机的系统时间,在适当的时间做到提醒,反应的误差最好不超过1分钟,占用手机的内存应当在2%左右。环境需求:软件需要在安卓手机上能够运行流畅,支持4.0以上的安卓系统,对于现阶段流行的智能手机要做到能在其上运行稳定。用户界面需求:具有简洁易懂的操作界面,并且具有比较美观的可视界面,还需要具有一定的快捷操作功能,例如长时间点击或者双击直接对事件进行添加、删除等操作。其他功能需求:在提示功能方面可以做一些多方面的选择,根据用户的需要选择铃声或者是震动提示。4日历提醒软件的概要设计4.1日历提醒软件的初步需求本软件是基于Android语言设计的一款手机上的日历提醒软件,它为本软件的使用者提供一些日常事务管理方面的服务,例如重要事件的提醒或者课程的提醒,它包括日历的查看,日历上重要事件的查看等以及一些操作,如事件的增加与删除、日程的修改与删除、以及软件的一些设置还有相关信息的查看等功能。本软件可以帮助人们对自己生活中的一些事务起到提醒的作用,释放忙碌人群对琐碎事务的记忆,方便工作人群或者学生们的生活。4.2日历提醒软件的概要设计4.2.1日历提醒软件的功能模块说明日历查看模块:需要拥有一套完整的日历界面,包括年、月、日以及星期几,而且在点击某个确切的日期时,要能够显示出当前是否添加了一些事件的提醒,对已经拥有事件记录的日期要有特殊的标记。日程管理模块:在日程管理模块中要包含总的日程显示以及单击对应日期时可以查看当前记录的一些活动或者事件,可以添加新的事件,也可以对当前已经具有的事件做到修改或者删除,在记录拥有一些事件的日期后,需要在日历上面加以一定的标识,用来提醒用户事件的日期,或者方便用户对现有事件作出一定的修改或者删除。课程管理模块:在课程管理模块中需要有星期的标识,在某一天记录课程时,需要对这门课程的时间有一定的显示,还有作业的情况方面的提醒,其他的增添删除操作基本同日程管理模块类似。设置界面模块:其中包含了一些对界面的设置以及对日程的设置选项。关于信息模块:其中包含了一些本软件的设计信息及使用的一些基本信息。4.2.2日历提醒软件的功能结构图首先在设计时可以根据日历提醒软件中的几个大模块:日历查看模块、日程管理模块、课程管理模块、设置界面模块、关于信息模块来绘制出本软件总体的一个功能模块图,如图4-1所示,总体的结构图反映了本系统各个模块之间的联系和总体情况。日历显示日历模块日历显示日历模块总日程显示单一日程显示总日程显示单一日程显示任务模块任务模块类型设置设置模块主界面日历系统类型设置设置模块主界面日历系统关于模块关于信息关于模块关于信息图4-1系统总体功能模块图日期显示节假日显示阴历日期显示日历显示然后在总体的功能模块图完成后,就是各个模块的详细功能结构图,在日历模块的界面显示上,可以分为如下几个部分,见图4-2:日期显示节假日显示阴历日期显示日历显示图4-2日历显示模块图接下来就是日程模块的结构图,里面应该包含有重要日程的显示,日程的添加和删除等,以及事件的记录,见图4-3:删除日程书写日程时间书写日程内容选择日程类型选择删除日程书写日程时间书写日程内容选择日程类型选择日程显示日程显示图4-3日程界面模块课程界面课程查看课程删除课程增加课程设置对于一些在校的学生,我们还设置了一个课程管理的模块,方便学生们对自己课程课程界面课程查看课程删除课程增加课程设置的一些时间、地点等做一些提醒安排,详细见图4-4:图4-4课程界面功能模块图以上就是本系统的一个初步的设计,其中它可以方便的显示出当前日期以及当前日期内的一些日程安排,或者显示出当前日期内有什么样的课程安排,同时,也可以让用户能够随时对自己的日程进行查看、修改、添加或者删除,而这些人性化的设置,为本系统增色不少。接下来就是整个软件最重要的部分了,也就是详细设计阶段。5日历提醒软件的详细设计详细设计最主要的目的就是确定如何实现在概要设计中具体的功能和要求,也就是经过这一阶段,需要得出对目标功能的精确描述,详细一点就是为软件结构图中的每一个模块编写相应的代码和算法。详细设计的目的不仅仅是要在逻辑上正确地实现每个模块的功能,最重要的就是在设计处理的过程中应该尽可能的简洁易懂。5.1本软件日历界面的设计和实现(1)第一步:系统需要建立一个布局文件来显示年月日,采用TextView类,对应在日历的CalendarActivity文件中加入函数来添加年月日等信息。接下来需要编写一个作为日历显示的CalendarView类,其中使用重载的方法来定义几个具有不同参数的CalendarView用于不同的情况。接下来在的工作就是在CalendarActivity这个类中实例化CalendarView并且使用CalendarView其中的一个方法CalendarView(this,getResources(),jumpMonth,jumpYear,year_c,month_c,day_c);然后书写方法来添加头部的年份等信息。接下来通过动态化的方法来实现对页面的头部进行布局,接着建立一个可以对值进行改变的StringBuffer类型的参数textDate,并对其进行append操作,添加到年月日的参数里,对月闰年的判断,是通过一个条件函数calV.getLeapMonth()的值来进行判断的,最后对界面使用setText方法来赋值到界面上,最后一步就是使用动态布局模式对界面进行一些美化操作。(2)第二步:需要对日历界面中的主体,也就是日期部分的显示要完成。首先在CalendarActivity文件初始化实例对象时加入动态添加布局文件,并将此方法命名为addGridView,然后在这个方法中进行动态化布局,GridView可以将一系列的空间组织成二维网格的形式显示出来,所以这里比较适合对日期的界面进行布局。首先还是动态化布局的建立,这里可以实例化GridView为gridView参数进行,在这里还需要添加GridView控件的列为7,列宽为46,然后加上判断屏幕大小的条件,这就需要加入取得屏幕大小的对应函数,如果是800*480屏幕的话,需要将列宽设置为69,接下来对水平和竖直的间距、取值边框、设置居中等进行一系列的操作。在这个方法里面还需加入个OnTouch方法,用来将gridView中的触摸事件回传给gestureDetector,进行下面的触摸操作,即:@Override publicbooleanonTouch(Viewv,MotionEventevent){ returnCalendarActivity.this.gestureDetector .onTouchEvent(event); } });日历的布局创建完成后,需要在里面填上具体的日期。就对当前显示的界面来说,需要建立几个对应的参数来显示和传接数据。比如在函数开始时就String[]dayNumber=newString[49];这是作为对GridView控件内进行标记序列的,可以对接下来的条件语句进行判断,还有就是对界面内的一些控件名进行实例化,然后是对页面属性值进行动态化设置。接着在对日期中的第一行就是周一、周二等的这行,设置出字的颜色以及背景图案,而这行的位置需要通过对参数position(对应编号)进行判断是否在7以内。接下来就是当前月份的信息显示,这也需要用条件函数来判断是否是当前月(也就是判断参数position是否在范围内),然后对当天的日期进行一个标记,可以设置当天的日期背景为图片current_day_bgc,字体的颜色为白色。通过上面的这些步骤,我们就基本完成了日历界面中的一些初步设置。(3)最后,由于市场上现在用的手机大都是触摸屏幕,也就是说日历菜单需要通过我们的触摸来进行翻页,所以需要在总体布局下建立一个ViewFlipper类(这个类可以实现屏幕的切换),然后然后实例化手势gestureDetector并取得布局中ViewFlipper用于下面的调用。接下来书写手势的方法主要是onFling的方法,这个方法可以实现页面的向左或者向右滑动的操作,而这个操作可以用条件语句来实现:由滑动两点的x坐标的值进行差值计算,如果是起点减去终点大于120时着向左滑动,反之则向右滑动。在滑动操作开始,并且已切换一面后就需要载入新的一张日历页面,这里又会用到参数calV,当向右滑动时则将参数calV所代表的函数CalendarView里的jumpMonth加1,代表下一个月;当向左滑动时则将参数calV所代表的函数CalendarView里的jumpMonth减1,代表上一个月。这样,我们的软件的界面可以说是大体上完成。在日历界面的显示中,我们除了一些基本的日期显示外,还应该在日期的头部页面上有每年每月的显示,而在LunarCalendar方法里面就包括干支纪年等信息。同样的其他信息,也是通过字节数组来储存的。在闰年判断函数SpecialCalendar中可以对每月天数,或者每月的第一天是星期几进行判断。闰年是通过传回年值并通过函数进行判断,最后传回布尔值;而每月的天数是用switch进行判断并赋值给月份天数的参数;对每月的第一天为星期几则是使用如下代码:publicintgetWeekdayOfMonth(intyear,intmonth){ Calendarcal=Calendar.getInstance(); cal.set(year,month-1,1); dayOfWeek=cal.get(Calendar.DAY_OF_WEEK)-1; returndayOfWeek;}日历的界面完成如图5-1所示:图5-1日历提醒软件的界面5.2本软件任务界面的设计5.2.1任务界面的数据库准备本软件的任务界面主要包含主界面的日程显示以及对应日期内的任务显示,还有任务的添加与删除等。首先任务界面所涉及到的就是日程数据的存储,以下先做介绍。数据库表的建立:主要建立了两个表:schedule表(日程的表)和scheduletagdate(标记日期所需的表)。Android提供了标准的数据库创建方式。建立DBOpenHelper类继承到SQLiteOpenHelper,实现onCreate和onUpgrade两个方法。首先对schedule表进行建立,在其中包括日程及日程类型的ID,日程重复类型的ID,日程的正文内容和日程时间这几个参数,在创建时需要填写上参数名、参数类型及主键等。db.execSQL("CREATETABLEIFNOTEXISTSschedule(scheduleIDintegerprimarykeyautoincrement,scheduleTypeIDinteger,remindIDinteger,scheduleContenttext,scheduleDatetext)");接下来是对scheduletagdate表的建立,在这个表中包括了标记的ID、年信息、月信息、日信息、日程ID这几个参数。db.execSQL("CREATETABLEIFNOTEXISTSscheduletagdate(tagIDintegerprimarykeyautoincrement,yearinteger,monthinteger,dayinteger,scheduleIDinteger)");建立完表后是继续写入onUpgrade方法,这个方法在数据库升级时会被触发,以便于软件升级时更新表结构。publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){ db.execSQL("DROPTABLEIFEXISTSschedule"); db.execSQL("DROPTABLEIFEXISTSscheduletagdate"); onCreate(db);}(2)再分别建立ScheduleVO和ScheduleDateTag,里面分别写了表里面各个数据的get(表示获取某个变量值)和set(表示设置某个变量值)方法,以便于调用。(3)建立ScheduleDAO文件,这个文件是用来写数据库的查找、删除等方法。首先是需要实例化DBOpenHelper用于数据库数据的get与set。 privateDBOpenHelperdbOpenHelper=null; publicScheduleDAO(Contextcontext){ dbOpenHelper=newDBOpenHelper(context,"schedules.db"); }下面就是对表中数据的操作了,包括了保存日程信息、查询某一条日程信息、查询所有的信息、删除日程、将日程标记的日期保存到数据库中。(1)保存日程信息:首先需要从日程添加页面里获取日程类型的ID、日程重复类型的ID、日程的正文内容、日程时间这几个参数,接下来使用ContentValues类(这个类是一个键值对,是用来存储名值对,它的名一般是String类型,而值都是基本类型)来NEW一个参数,然后用这个参数的PUT方法将这些参数放入到数据库中。values.put("scheduleTypeID",scheduleVO.getScheduleTypeID());values.put("remindID",scheduleVO.getRemindID()); values.put("scheduleContent",scheduleVO.getScheduleContent()); values.put("scheduleDate",scheduleVO.getScheduleDate());最后调用添加方法insert。 db.insert("schedule",null,values);然后需要用到moveToFirst方法来判断是否为空,从而进行一系列相关操作。(2)查询某一条日程信息:本系统的设计是通过对日程的点击来查看当前日期内的详细信息,也就是根据日程的ID来查看。Androidsqlite的查询方法是query方法,查询语句是:db.query("schedule",newString[]{"scheduleID","scheduleTypeID","remindID","scheduleContent","scheduleDate"},"scheduleID=?",newString[]{String.valueOf(scheduleID)},null,null,null);然后还需要加上判断语句,用cursor.moveToFirst()判断curor是否为空值,不为空则就给cursor赋值,为空则直接cursor.close()来关闭。(3)查询所有的日程信息:由于日程信息可能不止一个,所以返回的值设为数组形式,查询依旧是采用query方法,这里的where的相关语句设为null值,其他的与查询一条日程信息的语句基本相同。(4)删除日程:删除日程需要将日程及对应日期上的标记一起删除,这样管理起来比较容易,使用的语句是delete。db.delete("schedule","scheduleID=?",newString[]{String.valueOf(scheduleID)});db.delete("scheduletagdate","scheduleID=?",newString[]{String.valueOf(scheduleID)});(5)将日程标志日期保存到数据库中:这是为了将日期上标识的信息存储到数据库中,基本方法与第一步保存相仿,就是数据使用的是数组形式。for(inti=0;i<dateTagList.size();i++){//以for循环的方式进行 dateTag=dateTagList.get(i); ContentValuesvalues=newContentValues(); values.put("year",dateTag.getYear()); values.put("month",dateTag.getMonth()); values.put("day",dateTag.getDay()); values.put("scheduleID",dateTag.getScheduleID()); db.insert("scheduletagdate",null,values); }(6)只查询当前日程的日期:这个查询的语句是通过当前的年和月信息来得到日程标记上的所有信息,同样是使用query语句进行查询,只是改变了里面的查询参数,方法基本与上面的类似。(7)当点击一个gridview中item时,查询出此日期上所有的日程标记(scheduleID):通过点击后得到对应的年月日信息,然后用query方法得到此日程标记的ID,从而得到相关的日程信息。query("scheduletagdate",newString[]{"scheduleID"},"year=?andmonth=?andday=?",newString[]{String.valueOf(year),String.valueOf(month),String.valueOf(day)},null,null,null);(8)关闭数据库。判断后直接关闭当前数据库。 if(dbOpenHelper!=null){ dbOpenHelper.close();5.2.2日程添加界面(1)日程添加界面的布局:建立一个名称是schedule的空布局文件,在这使用相对布局RelativeLayout,这样可以比较清晰地将每一个框框组合起来,看起来更加美观。<com.pwp.borderText.BorderTextViewandroid:id="@+id/scheduleTop" android:gravity="center" android:layout_width="fill_parent" android:layout_height="40dp" android:background="@drawable/top_day" android:textStyle="bold" android:clickable="true" android:textColor="#000000" android:text="编辑日程"/>下面就是日程类型以及重复类型这两个类型的选择的点击框,在相对布局中需要自己设置这两个点击框的位置,先建立日程类型的文本框,以layout_below来将这个文本框放在标题框(用id来定位标题框)下面,同时则需要特殊设定的参数:android:layout_below="@id/scheduleTop" android:layout_width="160dp" android:layout_height="40dp"android:drawableRight="@drawable/schedule_type"然后是添加日程重复方式的文本框,利用layout_toRightOf来实现,然后放在日程类型文本框的右边,相应的也要将位置设于标题框下方,其他与上面的基本相似:android:layout_toRightOf="@id/scheduleType"android:drawableRight="@drawable/schedule_type"接下来还有时间的点击修改框、日程文本框及最后的保存及取消的按钮,实现的效果图如图5-2:图5-2日程添加界面的效果5.2.3总日程的界面任务界面的布局:在任务界面的布局中采用的是动态布局的方法:protectedvoidonCreate(BundlesavedInstanceState){ //TODOAuto-generatedmethodstub super.onCreate(savedInstanceState); dao=newScheduleDAO(this); sv=newScrollView(this); params.setMargins(0,5,0,0); layout=newLinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.setBackgroundResource(R.drawable.schedule_bk); layout.setLayoutParams(params); sv.addView(layout); setContentView(sv); }接下来创建放日程信息的textview,这个文本框用于存放日程的所有信息,包括时间、日程类型、日程重复类型、日程内容等信息。publicvoidcreateInfotext(StringscheduleInfo,intscheduleID){ finalBorderTextViewinfo=newBorderTextView(this,null); info.setText(scheduleInfo); info.setTextColor(Color.BLACK); info.setBackgroundColor(Color.WHITE); info.setLayoutParams(params); info.setGravity(Gravity.CENTER_VERTICAL); info.setPadding(10,5,10,5); info.setTag(scheduleID); layout.addView(info);(2)调用数据库查找方法并取得所有日程信息,并且判断是否为空,如不为空则显示所有日程:publicvoidgetScheduleAll(){ schList=dao.getAllSchedule(); if(schList!=null){ for(ScheduleVOvo:schList){ Stringcontent=vo.getScheduleContent(); intstartLine=content.indexOf("\n"); if(startLine>0){ content=content.substring(0,startLine)+"..."; }elseif(content.length()>30){ content=content.substring(0,30)+"..."; } scheduleInfo=CalendarConstant.sch_type[vo.getScheduleTypeID()]+"\n"+vo.getScheduleDate()+"\n"+content; scheduleID=vo.getScheduleID(); createInfotext(scheduleInfo,scheduleID); } }else{ scheduleInfo="没有日程"; createInfotext(scheduleInfo,-1); } }设置监听的方法来跳转到ScheduleInfoView并显示单条任务信息:当选择这些日程中的一个时,则会跳转到这个日程所对应的单一日程的显示界面,也就是在日程显示的每一个框中添加一些日程或者事件,点击后则会跳转到相应的界面,并且显示信息。info.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ StringschID=String.valueOf(v.getTag()); StringscheduleIDs[]=newString[]{schID}; Intentintent=newIntent(); intent.setClass(ScheduleActivity.this,ScheduleInfoView.class); intent.putExtra("scheduleID",scheduleIDs); startActivity(intent); } }); }最后的显示效果如图5-3:图5-3总日程效果图5.2.4对现有日程及日期的标记这个设计主要是为了方便用户,让用户可以非常直观地看到在哪天会有一些保存的日程,可以更加方便地查看已经记录的事件。日期标记的实现:使用数据库中scheduletagdate表里的数据来判断是否需要标记:if(schDateTagFlag!=null&&schDateTagFlag.length>0){ for(inti=0;i<schDateTagFlag.length;i++){ if(schDateTagFlag[i]==position){ textView.setBackgroundResource(R.drawable.mark); } }}(2)保存任务时标记的存储:在保存任务时,可以将本次任务的相关信息存入scheduletagdate中用于日期的标记,从而在日期上显示出明显的标识。intschduleID=dao.save(schedulevo); setScheduleDateTag(remindID,scheduleYear,tempMonth,tempDay,scheduleID);效果如图5-4:图5-4现有日程的标记5.2.5课程管理的界面(1)对于这个界面头部菜单栏的制作其实是对软件的可操作性进行一些提升,采用TabHost+RadioGroup相结合的方法来制作头部菜单栏。使用TabHost布局来实现底部菜单栏的位置,接着采用LinearLayout的线性布局来布置具体内容,然后通过TabWiget来实现内部选项卡。在主界面的菜单选项上,可以使用RadioGroup来建立,在这个布局中可以容纳四个RadioButton的单选按钮,这样在选择时也就只有一个RadioButton的按钮能被选择,同时默认了第一个按钮被选中的情况。接下来就可以在RadioButton设置内部的文字,然后在其顶部上添加一些图片,代码如下:<RadioButton android:text="@string/main_date" android:drawableTop="@drawable/tab_date" android:id="@+id/radio_button0" android:checked="true" style="@style/main_tab_bottom"/>从上面的代码中可以看出,菜单栏上的每个选项卡实现样式的方式都是调用了style上的main_tab_bottom,然而其背景background的值是@drawable/btn_bg,而btn_bg也不是一个普通的背景图片,而是一个xml文件,这个文件可以实现菜单选项卡切换时的,背景也随之切换,从而更加地美观,代码是通过android的selector来实现,这里是通过不同的条件来判断哪一个item被使用,其中包含了一些属性值,比如焦点是否获得、事件是否响应、点击是否实现。其代码如下:<selectorxmlns:android="/apk/res/android"><itemandroid:state_focused="true"android:state_enabled="true"android:state_pressed="false"android:drawable="@drawable/btn_bg_s"/><itemandroid:state_enabled="true"android:state_pressed="true"android:drawable="@drawable/btn_bg_s"/><itemandroid:state_enabled="true"android:state_checked="true"android:drawable="@drawable/btn_bg_d"/></selector>在主页面的布局制作完成后,需要在src/com.manage.activity下的MainPage文件中OnCreate(这个方法是对Activity实例对象进行初始化的)中调用该布局,这样,顶部菜单栏的布局已经算是基本完成了,但是其中还没有内容,接下来需要在tabHost中添加tab内容。可以通过Intent的方式新建个mDate,这样可以实现页的面跳转,然后用tabHost通过addTab的方法添加对应TabSpec的值和各个属性,最后使用RadioGroup的选择操作函数,通过switch方法来对按钮的功能进行实现,每个case项中通过tabHost.setCurrentTabByTag特定的值来实现页面上的跳转。效果如图5-5:图5-5课程管理的头部菜单栏(2)课程的日程界面ScheduleInfoView的设计:这里的设计与总日程基本相似,不再累述,完成效果如图5-6:图5-6课程管理界面(3)课程时间设置界面的布局:首先写一个ScheduleAddActivity类来调用布局和书写方法:新增界面的上方有两个TextView是用来选择类型的,另一个时间的显示框可以用来显示时间或者修改时间。实现选择类型的方法以其中一个为例:首先取得TextView的位置并进行实例化,便于后面的使用。scheduleType=(BorderTextView)findViewById(R.id.scheduleType);点击时跳到选择界面并传值,跳转的时候需要获得原来界面上的日程类型,这里需要在点击触发效果的方法上将数据传到类型选择页面上去,用于显示它的默认值。 scheduleType.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ schText=scheduleText.getText().toString(); Intentintent=newIntent(); intent.setClass(ScheduleAddActivity.this,ScheduleTypeView.class); intent.putExtra("sch_remind",newint[]{sch_typeID,remindID}); startActivity(intent); } });然后需要一个新建ScheduleTypeView文件来实现跳转后的界面。这里是存储ScheduleTypeView和ScheduleRemindView里面选项的value值。这个页面是通过实例化来实现布局的:LinearLayout.LayoutParamsparams=newLinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT); cc=newCalendarConstant(); layout=newLinearLayout(this); layout.setOrientation(LinearLayout.VERTICAL); layout.setBackgroundResource(R.drawable.schedule_bk); layout.setLayoutParams(params);实例化布局里的组件为后面使用时做准备,用于给这些组件添加各项参数。group=newRadioGroup(this); btSave=newBorderTextView(this,null); btCancel=newBorderTextView(this,null); textTop=newBorderTextView(this,null);接下来有个从ScheduleAddActivity传来的值,是日程新增界面里的日程类型的已选择的ID值,用来选择RadioGroup的默认选项Intentintent=getIntent(); intsch_remind[]=intent.getIntArrayExtra("sch_remind"); if(sch_remind!=null){ sch_typeID=sch_remind[0]; remindID=sch_remind[1]; } for(inti=0;i<cc.sch_type.length;i++){ radio=newRadioButton(this); if(i==sch_typeID){ radio.setChecked(true); } radio.setText(cc.sch_type[i]); radio.setId(i); radio.setTextColor(Color.BLACK); group.addView(radio); }将RadioGroup加入到布局中去:layout.addView(group);最终效果如图5-7:图5-7课程时间设置界面(4)在ScheduleInfoView界面上有对课程的删除操作,只要长按课程就会出现删除选项,删除后后会跳转回主界面。删除课程的界面如图:publicbooleanonLongClick(Viewv){ finalStringscheduleID=String.valueOf(v.getTag()); newAlertDialog.Builder(ScheduleInfoView.this).setTitle("删除日程").setMessage("确认删除").setPositiveButton("确认",newOnClickListener(){ publicvoidonClick(DialogInterfacedialog,intwhich){ dao.delete(Integer.parseInt(scheduleID)); Intentintent1=newIntent(); intent1.setClass(ScheduleInfoView.this,MainPage.class); startActivity(intent1); } }).setNegativeButton("取消",null).show();完成的效果如图5-8:图5-8删除课程时的界面6日历提醒软件的系统测试在设计完成的最后一步,就是软件测试部分了。在《软件工程-原理、方法和工具》中软件测试的部分写到:软件测试是保证软件质量的关键,它是对需求分析、设计和编码的最终复审,并且软件测试工作量约占整个项目开发工作量的40%左右。由此可见,在软件设计完成后,软件的测试工作才是保证软件高质量运行的前提。6.1日程管理方面的测试在上面提到过本系统主要分为两个任务版块,日程管理和课程管理版块。首先对日程管理版块的功能进行一下测试。在日程管理中首先需要实现能够选定日期然后写入事件,如图6-1:图6-1选定日期当需要后面的月份的某一天进行事件记录时,可以点击菜单按键,来指定某一天的日期,如图6-2:图6-2指定日期接下来写入事件,如图6-3:图6-3写入事件最后则是看对应事件是否能够在规定时间起到提示作用,如图6-4:图6-4对事件的提醒日程管理的功能可以说基本实现了,接下来是课程管理。6.2课程管理方面的测试在课程管理方面,主要也是需要能够正常的记录课程,从而起到按时提醒的功能。首先需要选择选择星期几,以星期二为例,如图6-5:图6-5课程管理的界面选择接下来写入课程信息,如图6-6:图6-6写入课程信息在主页面显示如下,如图6-7:图6-7课程在主页面的显示同样,打开菜单,我们可以选择清空所有课程来重新进行课程的编辑,如图6-8:图6-8清空所有课程这样我们课程管理的基本功能也实现了,通过对本系统的测试,也是完成了整个软件设计的最后一个部分。结论经过艰苦的一段学习和制作,自己的毕业设计——基于Android的日历提醒软件的设计与实现终于完成了,实现了模拟器上的操作以及手机上的操作,在设计刚开始时,自己通过任务书对自己的设计有了初步的认识,然后通过对android知识的进一步学习,自己也掌握了android的一些知识以及平台的运用。在设计刚开始时,可以说是遇到了非常多的困难和问题,最终通过自己的不断尝试以及询问老师同学寻求帮助,自己也是解决了非常多的难点,在这个过程中,我受益匪浅,我学到了许多课本中无法学习到的知识,并通过这些知识解决了设计中的一些问题。我发现只有自己动手去实践,去做一些东西时,才会发现自己在哪些方面学得不好,才能发现自己的问题所在,然后不断地去解决问题,只有这样才能不断地学习和进步。这个设计虽然最终完成了,但是其中还存在一些设计自己不是很满意,但是对于自己第一次做一个完整的android软件来说,这次做的还是比较成功的,只有自己不断地学习,不断地摸索和尝试,自己也才能学到更多的知识,自己在将来的学习或者工作中更好地完成任务。虽然有一些设计不太满意,但是通过指导老师耐心地带领与指导,我通过这次设计可以说是得到了一次非常好的锻炼机会,让自己在平时所学到的知识得到了一定的发挥,也让自己通过这次的设计学到了很多的知识和技能,深刻地认识到了一个软件的开发过程,从这个过程中自己也发现所有事情的成功都不是一蹴而就的,都需要不断地摸索和尝试,不断地解决各种各样的问题,这样才能最终完成。在刚开始做这个设计时,自己可以说是毫无头绪,感觉自己学了很多东西,但是都用不到,但是在指导老师耐心地指导下,自己一点一滴不断地摸索,一次一次不断地尝试,不断地寻求老师和同学的帮助,并且通过网上的各种资料最终完成了这个设计,通过这次经历,也让我了解到只有不断地坚持,才能最终完成任务。总之,这次毕业设计让我学到了非常多的知识,最主要的是让我学习到了如何解决问题,通过这次设计,我发现自己无论在今后的学习还是工作中都需要一颗坚持不懈的心,只有坚持下去,问题才会通过自己的努力解决。参考文献Tracy,K.W.;MobileApplicationDevelopmentExperiencesonApple’siOSandAndroidOS;IEEEpotentials;2012,31(4)XiaoxiaoMa;BoYan;GuanlingChen;ChunhuiZhang;KeHuang;JillDrury;LinzhangWang;DesignandImplementationofaToolkitforUsabilityTestingofMobileApps;Mobilenetworks&applications
;2013,18(1)(missing);SecureMobileApplicationsDevelopment:AndroidAppSecurity;SCmagazine;2012,23(1SUPPL.)江凌云王新琴;Ubuntu12.10中Android开发环境的搭建;期刊论文;2013,
13(3)于洋;基于Android平台的应用程序开发概述;期刊论文;2012,
(6)沈爱涛程涛;基于Android平台的应用系统开发环境研究;期刊论文;2013,
(7)韩超梁泉;《Android系统原理及开发要点详解》;电子工业出版社;2010年1月肖丹丹;浅析移动互联技术以及发展趋势;期刊论文;2013,
(41)罗欢;浅析Android应用软件的黑盒测试方法;期刊论文;2013,
(5)姚昱旻刘卫国;Android的架构与应用开发研究;期刊论文;2008,
17(11)孙卫琴李洪成;《Tomcat与Java
Web开发技术详解》;电子工业出版社,2010.黄宏程胡敏陈如松;《Android移动应用设计与开发》;人民邮电出版社,2012年9月李东生崔东华李爱萍等:《软件工程-原理、方法和工具》;机械工业出版社,2009年1月致谢作者在设计(论文)期间都是在王峥老师全面、具体指导下完成进行的。王峥老师渊博的学识、敏锐的思维、民主而严谨的作风使学生受益匪浅,并终生难忘。感谢闫宇帅老师等在毕业设计工作中给予的帮助。感谢我的学友和朋友对我的关心和帮助。外文原文及翻译AndroidApplicationFundamentals AndroidapplicationsarewrittenintheJavaprogramminglanguage.TheAndroidSDKtoolscompilethecode—alongwithanydataandresourcefiles—intoan
Androidpackage,anarchivefilewithan
.apk
suffix.Allthecodeinasingle
.apk
fileisconsideredtobeoneapplicationandisthefilethatAndroid-powereddevicesusetoinstalltheapplication. Onceinstalledonadevice,eachAndroidapplicationlivesinitsownsecuritysandbox:TheAndroidoperatingsystemisamulti-userLinuxsysteminwhicheachapplicationisadifferentuser.Bydefault,thesystemassignseachapplicationauniqueLinuxuserID(theIDisusedonlybythesystemandisunknowntotheapplication).ThesystemsetspermissionsforallthefilesinanapplicationsothatonlytheuserIDassignedtothatapplicationcanaccessthem.Eachprocesshasitsownvirtualmachine(VM),soanapplication'scoderunsinisolationfromotherapplications.Bydefault,everyapplicationrunsinitsownLinuxprocess.Androidstartstheprocesswhenanyoftheapplication'scomponentsneedtobeexecuted,thenshutsdowntheprocesswhenit'snolongerneededorwhenthesystemmustrecovermemoryforotherapplications.Inthisway,theAndroidsystemimplementsthe
principleofleastprivilege.Thatis,eachapplication,bydefault,hasaccessonlytothecomponentsthatitrequirestodoitsworkandnomore.Thiscreatesaverysecureenvironmentinwhichanapplicationcannotaccesspartsofthesystemforwhichitisnotgivenpermission. However,therearewaysforanapplicationtosharedatawithotherapplicationsandforanapplicationtoaccesssystemservices:It'spossibletoarrangefortwoapplicationstosharethesameLinuxuserID,inwhichcasetheyareabletoaccesseachother'sfiles.Toconservesystemresources,applicationswiththesameuserIDcanalsoarrangetoruninthesameLinuxprocessandsharethesameVM(theapplicationsmustalsobesignedwiththesamecertificate).Anapplicationcanrequestpermissiontoaccessdevicedatasuchastheuser'scontacts,SMSmessages,themountablestorage(SDcard),camera,Bluetooth,andmore.Allapplicationpermissionsmustbegrantedbytheuseratinstalltime.ThatcoversthebasicsregardinghowanAndroidapplicationexistswithinthesystem.Therestofthisdocumentintroducesyouto:1、Thecoreframeworkcomponentsthatdefineyourapplication.2、Themanifestfileinwhichyoudeclarecomponentsandrequireddevicefeaturesforyourapplication.3、Resourcesthatareseparatefromtheapplicationcodeandallowyourapplicationtogracefullyoptimizeitsbehaviorforavarietyofdeviceconfigurations.ApplicationComponents ApplicationcomponentsaretheessentialbuildingblocksofanAndroidapplication.Eachcomponentisadifferentpointthroughwhichthesystemcanenteryourapplication.Notallcomponentsareactualentrypointsfortheuserandsomedependoneachother,buteachoneexistsasitsownentityandplaysaspecificrole—eachoneisauniquebuildingblockthathelpsdefineyourapplication'soverallbehavior.Therearefourdifferenttypesofapplicationcomponents.Eachtypeservesadistinctpurposeandhasadistinctlifecyclethatdefineshowthecomponentiscreatedanddestroyed.Herearethef
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年中国橡胶助剂行业市场深度分析及前景趋势与投资研究报告
- 2024-2030年中国棉纶切片行业产销需求分析及发展策略研究报告
- 《民间借贷诉讼中的证明责任分配问题研究》
- 2024年金属顶投式垃圾桶项目可行性研究报告
- 新媒体传播与影响力塑造考核试卷
- 2024-2030年中国无车承运人行业竞争策略及投资模式分析报告
- 2024至2030年车削件项目投资价值分析报告
- 2024-2030年中国接触器行业发展前景预测及运营模式分析报告
- 2024-2030年中国批发业市场经营模式及投资前景展望报告
- 2024至2030年特亮地板漆项目投资价值分析报告
- 建筑施工单位三级教育培训表格
- 音乐秋天多么美-课件完整版
- 德语语音课件
- 物业管理组织机构框架图
- 复合材料 第八章 先进复合材料课件
- 河北省张家口市各县区乡镇行政村村庄村名居民村民委员会明细
- 六年级美术上册第13课生活与科幻课件1浙美版
- 暮光之城 英文介绍
- 六年级英语Module-4-The-natural-world-Unit-11-Trees-The-bird-and-the-tree市级优质课课件
- 气管切开术Tracheotomy课件
- 应变超声心动图
评论
0/150
提交评论