基于Android的日历系统.docx
《基于Android的日历系统.docx》由会员分享,可在线阅读,更多相关《基于Android的日历系统.docx(49页珍藏版)》请在冰豆网上搜索。
基于Android的日历系统
第一章引言
1.1项目背景
现在的智能手机已经非常普遍,而且其在生活中所占据的分量以及发挥的作用也是越来越重要,而且,查看时间、日期等功能也越来越完善。
基于Android操作系统的智能手机具有非常完善的数据读取功能,这样的优势就可以非常方便的设计日历。
同时,Android操作系统源代码都是公开的,可以在很多平台免费获取相应的资源,所以这些信息就可以很轻易的得到。
很多用户都需要一个日历系统,方便随时方便的查询时间日期等,这也是所有手机都具有的基本功能。
在开发新的日历系统时,一定要保证具有稳定的性能以及很好的客户体验,很好的将这些系统打造成日常生活不可或缺的产品以及方便稳定的工具,这样的生活助手在生活中一定具有很广阔的市场前景,同时也要保证外形美观,功能丰富。
本文主要阐述了Android操作系统的开发环境,发展现状以及主要组成模块等,对于该系统的开发应用程序进行了分析,还阐述了其在将来市场环境中具有前景以及不足进行了分析。
本次开发的操作系统,可以实现查看日期等基本功能,还可以查询指定日期以及将相应的日期进行阳历与农历的转换。
对于日期的管理,可以设置相应的跳转功能,也可以制定日期提醒,设备备忘录等。
1.2选题意义
本文开发的日历系统基于Android操作系统,能够实现原来设计的基本功能,包括查询日期以及显示制定日期等,而且能够针对阳历转换为相应的农历日期,还有日期管理功能。
对于特殊节日的管理,系统也有相应的应对功能;对于日期的管理,可以设置相应的跳转功能,也可以制定日期提醒,设备备忘录等。
该系统人机界面良好,操控性能好。
第二章Android操作系统简介
2.1Android操作系统基本结构
Android操作系统可以划分为四层结构,从最底层开始依次是应用层、应用框架层、系统运行库层以及Linux内核层,基本结构如图1-1.
图2-1Android操作系统基本结构
(1)应用层(App1ication)
应用层主要用来与用户进行交互,也就是一个人及操作界面,允许用户通过点击等动作完成相应的操作。
Android系统也自带一些基础性的应用和操作,比较常用的包括Home,Contacts以及Phone等。
设计时可以依据这些应用框图完成相应的设计工作,主要有API程序等。
这些基础性的应用程序需要在宣传之后,才能获得相应的推广,从而得到形影的用户群体。
(2)应用框架层(App1cationFramework)
一般系统设计者在Android操作系统上开发相应的API程序,这就需要系统能够有很好的使用,所有的功能都可以复,基于这种研发体系,就可以开发很好的操作系统,将这些系统应用在Android操作系统上。
在开发应用程序时需要用到的组件包括:
1)UI组件,也就是前台操作的UI界面,常用的空间包括List,Table等,这些都是最基本的组件。
2)内容服务器组件,这一组件的主要作用就是提供一系保证数据连接或者交换的服务,或者实时共享这些数据,最常见的就是电话本、短消息等功能,一些其他的应用程序也可以基于此组件完成通讯录或者短息的访问,比如说,支付宝可以自动读取联系人。
3)资源管理器组件,这一组件一般完成的功能是识别图片、字体的格式以及ID数据等,这些资源和数据可以对系统的资源进行进一步的管理或者享用。
4)消息通知管理组件,该组件对于该系统上所有通知进行管理,提示用户查看相应的数据信息,常用的包括微信好友信息的提醒,此时系统的呼吸灯能够显示相应的闪烁频率,提醒用户查看消息。
5)活动管理组件,该组件可以保证所有的应用程序都能够在其生命周期内完成数据的控制与管理,所有的连接都在规定时间内有效,一般所有的组件都对应相应的窗格,这是软件进行交互的基础,是界面变化的基础。
6)窗口管理组件,该组件完成了全部应用窗体的开启的管理。
7)位置管理组件,该组件的基本功能是借助GPS完成客户的定位信息。
8)电话管理组件,该组件针对手机上所有的通话数据进行保存以及采集。
9)包管理组件,该组件的功能如期名字一样,可以对系统中全部的应用系统进行管理。
(3)系统运行库层(Libraries)
系统运行库层(主要是操作系统最底层的操作,不用过多介绍。
1)系统C库模块:
该模块一般是从系统自带的模块库里查询相应的标准数据,完成BSD的集成,这些数据可以作为嵌入式系统开发的备份文件。
2)媒体库模块。
该模块主要是进行媒体文件的解码、播放等操作,能够解码的格式包括MP3,MP4,JPEG,MPEG4等。
3)界面管理模块:
该模块可以需要显示的所有子界面进行管理。
4)WebKit模块:
该模块可以保证浏览器具有充足的引擎工作,这样就可以保证操作系统具有足够的空间嵌入视图信息。
5)SGL底层的2D图形引擎。
6)OPENGL|ES模块:
该模块主要是保证系统能够实现3D的效果,借助一些高品质的心态可以保证系统具有一些加速功能。
7)FreeType模块:
该模块具有一些矢量显示功能和图文等。
8)SQLite模块:
该模块可以适用于全部的应用窗体,功能非常强大,一般都是在关系型数据库中显示的比较多。
9)CoreLibraries模块:
该模块的主要作用就是基于Java平台开发相应的数据库,完成相应的数据处理功能。
10)Da1vikVM模块:
该模块可以保证操作系统保持虚拟机状态,这样便于计算机能够开发相应的JVM功能。
(4)Linux内核层(LinuxKernel)
系统的内核层一般是保证系统操作的稳定性以及安全性,对系统的硬件以及软件进行管理,设置相应的网络堆栈,创建相应的模型服务。
只有了解了Android操作系统的基本特点,才有可能更好的开发基于此系统的软件和程序,在深入了解了此系统之后就可以在开发软件以及系统的过程中,不走或者少走弯路,开发更加完美的系统。
2.2Android系统组件
总的说来,基于安卓操作系统的应用程序分为四种:
Activity、BroadcastIntentReceiver、Service以及ContentProvide。
需要注意的是,个别的操作系统是不具有完整的4组件构成,所有的组件一般都要列在AndroidMani-fest.xm1中,这样就方便系统中制定形影的功能和条件,Activity是最基础的类别,这是一个非常常用而且能够单独显示的组件,一般作为单独的类别显示。
系统中所有用到的类都必须从主类中继承过来。
所有视图的显示都是基于用户控制界面显示相应的视图控制组件,这样就可以及时给出响应,一般广播类型接收器都以外部数据接口为对接类型,这样的接口还有Webservice,这样也可以获得相应的数据接口。
(1)Activity简介
应用软件的开发一般是将Activity组件作为单独额页面显示,通常情况下可以针对所有的页面功能进行显示。
(2)Service简介
这一程序应该是具有一定的寿命时间,所有的程序都执行在这些程序,最后的程序属于监视类型。
(3)BroadcastReceiver简介
该模块功能主要是广播接收器,主要是将系统中的信息等进行识别或者是发送,一半需要使用的方法是sendBroadcast()方法,才可以快速的传递信息和数据。
(4)ContentProvider简介
该模块主要是借助相应的数据程序将一些数据程序供应给相应的数据程序,这在数据交换过程中使用的频率最高,也可以进行信息的共享。
Android操控系统的很多数据都是显示为图片或者视图,可以支持ContentProvider的设定,一般处于系统的底层端口。
这些数据访问也需要被授权,在访问以及共享数据的时候,一定要以方便用户使用为最高标准。
2.3Android主要控件
(1)EditText
主要函数:
setText/getText设置/获取文本内容
setHint设置缺省显示内容
(2)RadioGroup,RadioButton
RadioButton的isChecked()判断是否被选中
获取选中RadioButon的ID:
设置RadioGroup.setOnCheckedChangeListener方法
publiconCheckedChanged(RadioGroupgroup,intcheckedId)//checkedId是选中RadioButton的ID。
(3)CheckBox
isChecked()判断是否被选中
setOnCheckedChangeListener方法监视选中状态改变情况
(4)Spinner
a,显示数据
b,设置下拉列表的风格(可选)
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
c,监听选项选择变更事件
setOnItemSelectedListener设置监听去
Spinner.OnItemSelectedListener类须实现以下两个方法
publicvoidonItemSelected(AdapterView
>parent,Viewview,intposition,longid)//view选中项实例,position选择项在adapter中的位置
publicvoidonNothingSelected(AdapterView
>arg0)
d,设置选中项
Spinner.setSelection(position)//索引从0开始
getSelectedItemPosition()
getSelectedItem()//该值toString()则为选中内容的字符串
getSelectedItemId()
getSelectedView()
(5)AutoCompleteTextView
setAdapter设置数据adapter
(6)DatePicker,TimePicker
a,DatePicker
b,TimePicker
c,获取系统当期时间和日期
Calendar.getInstance()返回Calendar
Calendar.get(intfield)---field可以为Calendar.YEAR/Calendar.MONTH/Calendar.DAY_OF_MONTH/Calendar.HOUR_OF_DAY/Calendar.MINUTE
(7)ImageView/ImageButton
主要方法
setImageResource设置显示图片
setAlpha设置Alpha
invalidate强制更新
setScaleType(ScaleTypest)设置图片显示方式,st是一枚举
setAdjustViewBounds设置是否调整控件适应图片大小
setBackgroundResource设置背景
(8)GridView(表格显示一系列图片)
显示数据
setAdapter(ListAdapteradapter)设置数据适配器.
数据适配器可以继承自BaseAdapter,该类publicViewgetView(intposition,ViewconvertView,ViewGroupparent)返回当前选择的视图(ImageView)
选项选中监听setOnItemSelectedListener
getSelectedView()返回当前选中的视图
(9)ListView
a.显示数据setAdapter(ListAdapteradapter)
adapter可为newSimpleCursorAdapter/SimpleAdapter(Contextcontext,intlayout,Cursorc,String[]from,int[]to)
layout用来显示数据的模板.显示一列可用android.R.layout.simple_list_item_1两列可用android.R.layout.simple_list_item_2
多列则需要自己实现xml视图布局文件
b.动态增删数据
adapter.notifyDataSetChanged()
c.数据(可用ArrayList构造数据)
from':
to用来显示对应列的空件id
第三章基于Android的日历应用
3.1需求分析
3.1.1系统目标
本次系统开发是设计一个日历系统,并在安卓平台上应用,包括查询日期以及显示制定日期等,而且能够针对阳历转换为相应的农历日期,还有日期管理功能。
对于特殊节日的管理,系统也有相应的应对功能;对于日期的管理,可以设置相应的跳转功能,也可以制定日期提醒,设备备忘录等。
3.1.2功能需求描述
开发的日历系统需要实现的基本功能如下所示:
(1)能够方便高效的查询日期,包括年月日、节日、阴历等。
(2)对于国内外传统节日以及八卦节日都能够提前查询或者显示。
(3)管理日程,或者定期查询、删改一些数据信息等。
(4)将阳历日期与阴历日期进行转换。
(5)提前查看指定日期。
(6)定位日期功能。
3.1.3界面需求分析
用户界面是用户进行操作的界面,借助该界面可以对系统进行操作,不过这些数据应该与客户的需求相关,用户的满意才是系统能够生存的基础,一定要具有良好的人机界面。
(1)人机界面良好,方便查看,所有信息显示清晰。
(2)信息显示丰富,当天信息应包括一些特殊信息以及针对此信息的提醒。
(3)当月信息与前后月信息区别显示。
(4)查询功能丰富。
3.1.4运行需求分析
要求日历系统能够安装方便,运行平稳,在运行过程中保持平稳流畅,而且能够自适应频幕尺寸。
3.2系统概要设计
3.2.1系统功能结构
这次开发的系统可以在主界面上设置显示当时的日期,在副界面上显示转换功能,也有一些日期管理、跳转等设置,对于日期的定位,需要设置相应的日期,最后的主界面如图3-1。
图3-1日历系统功能结构
3.3系统主界面的设计和实现
3.3.1系统的日历界面
系统主界面默认选择日历界面在头部菜单栏下方。
(1)首先是建立一个布局文件,上面一部分是显示年月日、生肖和农历的干支纪年。
使用的是一个TextView类,对应的在日历的CalendarActivity文件中加入函数来添加头部的年份等信息。
在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,即:
//将gridview中的触摸事件回传给gestureDetector
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
returnCalendarActivity.this.gestureDetector
.onTouchEvent(event);
}
});
创建完日历的布局后,是在里面添加上具体的日期。
就当前显示的页面来说,是建立几个对应的参数,用来显示或传接数据。
例如在函数开始时就String[]dayNumber=newString[49];这是作为对GridView控件内进行标记序列的,用于下面条件语句的判断等,还有就是界面内的一些控件名的实例化。
然后是动态化的对页面进行属性值的设置。
下一步是当前月信息的显示,这也需要条件函数来判断是否为当前月,也是来判断参数position是否在范围内。
在这个月中还需对当天来一个特殊化。
设置当天日期的背景为图片current_day_bgc。
并设置字色为#000000。
在这些操作外,还需要得到一些数值来用于日期数据的插入,在这里建立了个getCalendar方法,如判断是否为闰年的函数返回值isLeapyear,某月的总天数,某月的第一天是星期几,上个月总天数。
在这方法中再执行方法getweek,用来得出以后需要标记的日期,这个在后面来介绍。
通过上述的步骤基本完成了日历界面中的初步建设。
(3)由于日历菜单需要能通过手势触摸来进行翻页,所以要在总体布局下建立一个ViewFlipper类。
这个类是用来实现屏幕的切换效果的。
先是在布局中建立这个类。
实例化手势gestureDetector,取得布局中ViewFlipper。
这样就可以用于下面的调用。
然后是书写书写手势的各个方法。
最主要的是onFling的方法实现页面的向左及向右滑动的操作。
由IF语句来实现,由滑动开始直接输的x坐标的值进行差值计算。
当差值大于120时着向左滑动。
在滑动操作开始,就需要载入新的一张日历页面。
这里又会用到参数calV,当onFling方法实现时,会将参数calV所代表的函数CalendarView里的jumpMonth加1,代表下一个月。
当向右滑动时则将参数calV所代表的函数CalendarView里的jumpMonth减1,代表上一个月。
为了完整性剩余的手势函数只是写了方法未使用。
3.3.2系统的日历特色显示
这里我肯还需要做干支纪年和节假日阴历显示。
这里有两个方法,分别是LunarCalendar和SpecialCalendar。
在LunarCalendar里面包括干支纪年,阴历,生肖,节假日等信息。
例如生肖则是建立一个字节数组来记录十二生肖,并且用函数来传回参数对应的生肖。
finalpublicStringanimalsYear(intyear){
finalString[]Animals=newString[]{"鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"};
returnAnimals[(year-4)%12];
}
同样的其他信息,如节假日的名称,也是通过字节数组来储存的。
在SpecialCalendar是闰年的判断函数、天数。
最后是对每月的第一天星期的判断。
闰年通过传回年值通过函数进行判断,并传回布尔值。
每月的天数用switch进行判断赋值给月份天数的参数。
对每月的第一天为星期几的判断并指定。
//指定某年中的某月的第一天是星期几
publicintgetWeekdayOfMonth(intyear,intmonth){
Calendarcal=Calendar.getInstance();
cal.set(year,month-1,1);
dayOfWeek=cal.get(Calendar.DAY_OF_WEEK)-1;
returndayOfWeek;
}
3.4系统任务界面的设计
任务界面包括任务主界面(所有日程的显示)和对应日期任务的显示,任务的添加等。
在任务界面涉及到日程的数据存储,所以先介绍下关于日程的数据存储以及有日程的日期存储(为日历界面的标记服务)。
3.4.1任务界面的数据库准备
(1)数据库里表的建立
分别建立了schedule表(日程的表)和scheduletagdate(标记日期所需的表),
Android提供了标准的数据库创建方式。
建立DBOpenHelper类继承到SQLiteOpenHelper。
实现onCreate和onUpgrade两个方法。
OnCreate方法是用于初次使用软件时生成数据库,onUpgrade方法是用于升级软件时更新数据库表结构。
首先是schedule表的建立。
表中包括四个参数。
如下图3-2所示。
建立时对应需要写上参数名、参数类型、主键等。
图3-2schedule所包含的参数
db.execSQL("CREATETABLEIFNOTEXISTSschedule(scheduleIDintegerprimarykeyautoincrement,scheduleTypeIDinteger,remindIDinteger,scheduleContenttext,scheduleDatetext)");
图3-3是scheduletagdate表的建立。
在这个表中包括以下参数。
图3-3scheduletagdate所包含的参数
db.execSQL("CREATETABLEIFNOTEXISTSscheduletagdate(tagIDintegerprimarykeyautoincrement,yearinteger,monthinteger,dayinteger,scheduleIDinteger)");
}
建立完表后是继续写入onUpgrade方法,这个方法会在数据库升级时被触发,以便于软件升级时更新表结构。
(2)再分别建立ScheduleVO和ScheduleDateTag,里面分别写了表里面各个数据的get(表示获取某个变量值)和set(表示设置某个变量值)方法,以便于调用。
(3)建立ScheduleDAO文件,这个文件是用来写数据库的查找、删除等方法。
首先是需要实例化DBOpenHelper用于数据库数据的get与set。
privateDBOpenHelperdbOpenHelper=null;
publicScheduleDAO(Contextcontext){
dbOpenHelper=newDBOpenHelper(context,"schedules.db");
}
下面就是对表中数据的操作了。
包括了保存日程信息、查询某一条日程信息。
查询所有的信息、删除日程、将日程标记的日期保存到数据库中。
(1)保存日程信息,先是从日程添加页面里获取日程类型的ID、日程重复类型的ID、日程正文内容、日程日程时间这几个参数,然后是使用ContentValues类(这个类