赞
踩
基于Android平台的个人日历的设计与开发
摘要
个人日历是基于Android平台开发的,运行在Android手机平台的个人日程管理软件。本文是对基于Android平台的个人日历的设计与开发。
首先,本文介绍了软件开发的背景与特点。然后,本文介绍了软件所使用的关键技术,包括Android、fragment、service、activity。再然后,介绍日历的设计与开发,包括系统需求分析、功能设计、框架设计、界面设计、数据层设计以及各部分功能的实现。最后本文对全文进行总结,总结设计实现过程中遇到的问题、系统的不足、优势与自己的收获。
关键词:个人日历、Android、日程管理
The designationand development of personal calendar based on the Android platform
Abstract
Personal calendar is a personal schedule management software developed on the Android platform, running on the Android platform. This paper is to design and develop of personal calendar based on the Android platform.
First, this paper introduces the background and characteristics of software development. Then, this paper introduces the key technologies of software use, including Android, fragments, service, activity. Then, introduces the design and development of calendar, including system requirements analysis, functional design, framework design, interface design, the data layer design and the realization of the function of each part. Finally this paper summarizes the full text, summarizes the problems in the implementation process of design, advantages and disadvantages of the system and the deficiency of the harvest of their own.
Keyword: Personal calendar, Android, schedule management
1.绪论51.1.课题背景51.2.研发现状51.3.软件研究意义51.4.研究内容与方法62.相关技术与知识72.1.开发平台Android72.2.MVC开发模式72.3.局部界面fragment72.4.Web service82.5.Localservice82.7.线程92.8.开发平台介绍93.个人日历的设计103.1.需求分析103.2.功能设计123.3.数据层设计153.4.界面布局设计204.个人日历的实现234.1.数据层实现234.2.界面实现354.3.Web服务434.4.本地服务464.5.日程同步484.6.屏幕旋转后的Activity数据保存504.7.Activity向Fragment传递数据504.8.Fragment之间通信515.总结535.1.遇到的问题与解决535.2.软件的优势与不足545.3.本章小结546.总结55参考文献56致谢56
本系统用软件工程化思想和方法开发软件,对软件进行了软件计划、需求分析、设计和实现。
根据设计文档实现软件。
Android应用是基于模型控制器视图(Model-View-Controller,简称MVC)的架构模式进行设计的。 在MVC设计模式中,应用的任何对象归根结底都是模型对象、视图对象以及控制对象中的一种。
本软件要求将办公自动化平台(OA)系统中涉及日程的项目推送到手机终端软件中。其基本的数据相关流程如图3-1-1所示。
图 3-1-1 日历系统结构图
本系统可能在下列情况下出现故障,待相关问题解决后,本系统能够重新正常运行:
设备需求情况将分别从前台手机端和后台服务端说明:
需要一台性能较好的服务器(操作系统Windows 2003 Server,内存4G、硬盘512G、双网卡),安装数据库服务器和IIS服务器,其上运行后台同步程序和Web服务。
服务器端开发所用到的支持软件包括:
个人日历系统包含手机端(Android)和服务器端两部分组成。
系统的总体结构图如下图所示:
信息系统的内网通过SOA应用服务器的80端口连接到InterNet网,再通过无线加密通信将信息送到Android手机上。
SOA是一种面向服务的软件架构,是当前先进的软件结构。SOA对外以80为服务端口,易于配置防火墙。SOA架构借用现有的HTTP应用服务器的并发控制,可靠、安全。
用一览表及框图的形式说明本系统的系统元素(各层模块、子程序、公用程序等)的划分,扼要说明每个系统元素的标识符和功能,分层次地给出各元素之间的控制与被控制关系.
Android端手机软件的程序结构图为:
Android程序由手机界面显示程序、手机服务程序两部分组成。手机主程序完成主日历视图、新建日程视图、日程查看视图、假期查看视图;手机后台服务程序则完成状态栏提醒、桌面插件更新、后台数据更新等功能。
手机主视图界面由月视图、周视图、日视图、三个视图组成。这三个视图共享一个Android Activity,当用户切换视图时动态生成视图单元格。
日历信息获取过程:
表名:ColorConfig(配置表) | |||
---|---|---|---|
字段名 | 类型 | 说明 | 约束 |
id | Integer | 本地数据库索引ID | 自增、主键 |
isUse | Integer | 是否使用该配置 | |
userID | String | 用户ID | |
userName | String | 用户名 | |
userStatus | String | 用户状态 | 默认值:状态未知 |
NAMESPACE | String | webservice的默认名字空间 | 默认值:http://tempuri.org/ |
timeOut | int | web服务的网络超时时间 | 默认值:5000 |
imei | String | 手机字串标识 | |
WEBSERVICE_URL | String | web服务网址 | |
WorkListDataBarBarColor | int | 列表项中 日期栏的背景色 | 默认值:Color.DKGRAY |
Calendar_WeekBgColor | int | 周视图背景颜色 | 默认值:Color.WHITE |
Calendar_DayBgColor | int | 日视图背景颜色 | 默认值:Color.WHITE |
isHoliday_BgColor | int | 假期单元格颜色 | 默认值:0xFF6CAAD9 |
unPresentMonth_FontColor | int | 非本月日期单元格字体颜色 | 默认值:Color.GRAY |
isPresentMonth_FontColor | int | 本月日期单元格字体颜色 | 默认值:Color.BLACK |
isToday_BgColor | int | 几天单元格背景颜色 | 默认值:0xFFD3D3D3 |
special_Reminder | int | 提醒三角形颜色 | 默认值:Color.RED |
Calendar_WeekFontColor | int | 星期视图字体颜色 | 默认值:Color.BLACK |
DayHourCellFontCell | int | 日视图小时字体大小 | 默认值:16 |
FontSize | int | 自动字体大小 | 默认值:25 |
FontSizeTitleSmall | int | 小字体大小 | 默认值:12 |
FontSizeTitleBig | int | 标题字体大小 | 默认值:20 |
DayHourHeight | int | 日视图单元格高度 | 默认值:35 |
toShowLunar | Boolean | 是否显示农历 | 默认值:false |
MaxQueryCntOfWorkItemList | int | 查询最多的项目数 | 默认值:20 |
该表是程序运行过程中常用到的一些变量的配置的存储。
表名:CalendarItem(日程表) | |||
---|---|---|---|
字段名 | 类型 | 说明 | 约束 |
id | Integer | 数据库自建ID | 自增、唯一、非空 |
CalendarId | String | 日历ID | 主键 |
YearID | int | 年,用于重复项计算 | 默认值:-1 |
MonthID | int | 月,用于重复项计算 | 默认值:-1 |
WeekID | int | 周,用于重复项计算 | 默认值:-2 |
DayID | int | 日,用于重复项计算 | 默认值:-1 |
HourOfDay24 | int | 小时,用于重复项计算 | 默认值:-1 |
Topic | String | 日程主题 | |
StartTime | String | 日程开始时间 | |
EndTime | String | 日程结束时间 | |
IsWholeDay | String | 是否为整天任务 | 默认值:“否” |
Place | String | 日程地点 | |
Repeat | Integer | 是否重复(0表示不重复,1表示按天重复,2表示按周重复,3表示按月重复,4表示按年重复) | 默认值:-1 |
Remind | Integer | 提醒时间,设计单位为 (分钟) | 默认值:-2 |
CreatTime | String | 创建时间 | |
Creator | String | 创建者 | |
SendEmail | String | 是否发送邮件提醒 | 默认值:“否” |
CompletedTime | String | 完成时间 | |
CalendarType | String | 日历类型,暂定为整数类型(自建日历,企业日历) | |
AlterTime | String | 最后更新时间(初始值等于创建时间,用于同步) | |
Note | String | 备注 | |
IsCompleted | String | 是否完成 | |
Priority | String | 紧急程度 | 默认值:一般 |
Charger | String | 负责人 | |
PersonList | String | 相关人 | |
IsDeleted | String | 是否删除 | |
haveReminded | int | 是否被提醒过,不需要和远程同步,0: 没有提醒过,1:已经提醒 |
该表用于存储日程信息,以CalendarId为主键,存储时按照StartTime、EndTime、ID排序。
表名:UpdateHistory(更新历史) | |||
---|---|---|---|
字段名 | 类型 | 说明 | 约束 |
id | Integer | 自建ID | 主键 |
updateID | String | 更新历史ID | |
AlterTime | String | 最后同步时间 | 默认值:2000/01/01 00:00:00 |
Click_CI_ID | String | 界面点击的日程项ID值 |
该表用来保存更新历史,用于同步日程信息使用。
本系统中,设计了表:Table_UserManager(人员表)、Table_CalendarManage (日历表) 、Table_User_CalendarRelation (人员、日历关系表)来存储日历系统中涉及到的相关人员、日历项及日历项涉及到的人员等信息。各表的结构定义分别如下:
表Table_UserManager(人员表) | |||
---|---|---|---|
字段名 | 类型 | 说明 | 是否允许空 |
UserId | int | 人员编号 | 否 |
Name | varchar(60) | 姓名 | |
SubCompany | varchar(60) | 分部名称 | |
Department | varchar(60) | 部门名称 | |
Job | varchar(60) | 岗位名称 | |
varchar(60) | 电子邮箱 | ||
RegisterTime | datetime | 修改时间 | 否 |
Status | int | 状态 | 否 |
IMIE1 | varchar(300) | 手机1标识 | |
IMIE2 | varchar(300) | 手机2标识 | |
IMIE3 | varchar(300) | 手机3标识 |
表Table_CalendarManage(日历表) | |||
---|---|---|---|
字段名 | 类型 | 说明 | 是否允许空 |
CalendarId | varchar(30) | 日历ID,主键 | 否 |
Topic | varchar(60) | 主题 | |
StartTime | datetime | 起始时间 | |
EndTime | datetime | 结束时间 | |
IsWholeDay | varchar(2) | 是否整天(是,否) | |
Place | varchar(60) | 地点 | |
Repeat | int | 是否重复(0表示不重复,1表示按天重复,2表示按周重复,3表示按月重复,4表示按年重复) | |
Remind | int | 提前提醒时间(以分钟为单位) | |
CreatTime | datetime | 创建时间 | |
Creator | varchar(50) | 创建者 | |
SendEmail | varchar(2) | 是否发送邮件(是,否) | |
IsCompleted | varchar(2) | 是否完成(是,否) | |
CompletedTime | datetime | 完成时间 | |
Source | varchar(50) | 日历来源(OA、项目管理) | |
CalendarType | varchar(50) | 日历类型(自建日历,企业日历) | |
AlterTime | datetime | 最后更新时间(初始值等于创建时间,用于同步) | 否 |
Priority | varchar(10) | 优先级(紧急、报警、一般) | |
Charger | varchar(50) | 负责人 | |
Note | varchar(200) | 备注 | |
IsDeleted | varchar(2) | 是否删除(是,否) | |
Examinor | varchar(10) | 审核人 | |
ExaminAdvice | varchar(200) | 审核意见 | |
ExaminTime | datetime | 审核时间 | |
表Table_User_CalendarRelation(人员、日历关系表) | |||
字段名 | 类型 | 说明 | 是否允许空 |
UserId | int | 人员编号 | 否 |
CalendarId | varchar(30) | 日历Id | 否 |
AlterTime | datetime | 修改时间 | 否 |
IsDeleted | varchar(2) | 是否删除(是,否) |
注:表Table_CalendarManage和表Table_User_CalendarRelation之间通过字段CalendarId来关联,是一对多的关系。生成日历时,先在日历表Table_CalendarManage中插入日历信息记录,然后再在表Table_User_CalendarRelation中生成人员的关联信息。删除日历时,先从表Table_User_CalendarRelation中删除有关记录,当不存在与CanlendarId关联的人员信息时,将日历记录从Table_CalendarManage中删除。
日视图
桌面插件
Android使用ORMLite操作数据库
代码如下:
/**
* 管理底层的数据服务,比如从数据库刷新、写回数据库数据等
* @author GW
*/
public class DbAdapter {
private DatabaseHelper databaseHelper = null;
Context parent;
/**
* 构造函数
* @param context
*/
public DbAdapter(Context context) {
this.parent = context;
calItemList.clear();
databaseHelper = getHelper();
if (databaseHelper != null) {
try {
calItemDao = databaseHelper.getCalItemDao();
configDao = databaseHelper.getConfigDao();
updateHistoryDao = databaseHelper.getUpdateHistoryDao();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* 析构函数
*/
@Override
protected void finalize() {
releseHelper();
}
/**
* 获取默认的配置信息
* @return
*/
public ColorConfig getUsingConfig() {
try {
List<ColorConfig> config_list;
config_list = configDao.queryForEq("isUse", 1);
if (config_list.size() > 0) {
config = config_list.get(0);
} else {
config = new ColorConfig();
newOrUpdateColorConfig(config);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return config;
}
public UpdateHistory getLastUpdateTime() {
try {
List<UpdateHistory> update_list;
update_list = updateHistoryDao.queryForEq("updateID", "888");
if (update_list.size() > 0) {
updateHistory = update_list.get(0);
} else {
updateHistory = new UpdateHistory();
updateHistory.updateID = "888";
newOrUpdateLastUpdateTime(updateHistory);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return updateHistory;
}
}
Dao<T,V>
包含两个泛型,第一个泛型表DAO操作的类,第二个表示操作类的主键类型
主要方法:create:插入一条数据
createIfNotExists:如果不存在则插入
createOrUpdate:如果指定id则更新
queryForId:根据id查找
update 查找出数据
delte 删除数据
queryBuilder() 创建一个查询生成器:进行复杂查询
deleteBuilder() 创建一个删除生成器,进程复杂条件删除
updateBuilder() 创建修条件生成器,进行复杂条件修改
表dbo.Table_CalendarManage 设计如下
表 dbo.Table_IMEI设计如下
表 dbo.Table_User_CalendarRelation设计如下
表dbo.Table_UserManage设计如下
运行结果:
运行结果:
在月、周、日这三个试图中使用ViewPager,把一个Fragment作为一页,这样左右滑动就可以查看上一个和下一个。
单纯的使用mViewPager.getAdapter().notifyDataSetChanged()并不能刷新页面。在调用notifyDataSetChanged()时,都会调用getItemPosition(Object object)方法,该方法会查看viewpager的所有item,为每个item返回一个状态值,若是POSITION_NONE,那么该item会调用destroyItem(ViewGroup container, int position, Object object)方法,然后重新生成,如果是POSITION_UNCHANGED,就不会重新生成,而默认返回值是POSITION_UNCHANGED,所以我们要想实现ViewPager页面刷新就要改写getItemPosition(Object object)方法。
解决办法:
@Override
public int getItemPosition(Object object) {
// 刷新前 现在 后共三页
if((position_Month -((MonthMainFragment)object).viewIndex)<1
&& (position_Month -((MonthMainFragment)object).viewIndex)>-1
return POSITION_NONE;
else return POSITION_UNCHANGED;
}
周视图和日视图构建方法同上
运行结果:
运行结果:
在Android平台调用Web Service需要依赖于第三方类库ksoap2,它是一个SOAP Web service客户端开发包。Web Service需要完成注册和注销用户、同步日程信息两个功能。
public class WSHelper {
//配置项
ColorConfig config = new ColorConfig();
//数据管理器
DbAdapter dba = null;
//构造函数
public WSHelper() {
if (dba == null) {
dba = new DbAdapter();
config = dba.getUsingConfig();
}
}
//从服务器获取新的日程
public int ReadWorkItemFromServer(String LastUpdateTime, String imei) {
int ret = -1;
SoapObject result;
WebServiceCall wsCall = new WebServiceCall(config.NAMESPACE,
config.WEBSERVICE_URL, "GetCalendarByUA", config.timeOut);
wsCall.request.addProperty("IMEI", imei);
wsCall.request.addProperty("alterTime", LastUpdateTime);
try {
result = (SoapObject) wsCall.callWebMethod();
ret = dba.InsertManyCIS(result);
} catch (Exception e) {
ret = -1;
}
return ret;
}
}
系统启动本地服务时先调用onCreate()方法,再调用 onStart()方法,最后在关闭服务时调用 onDestroy()方法。这个过程和创建Activity的过程类似,在启动时调用onCreate()方法进行一次初始化。程序调用Context.startService()来打开服务,调用 Context.stopService()来中止服务。
//获取状态通知栏管理,
//其中创建的 nm 对象负责“发出”与“取消” Notification。
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification nf = new Notification();
//设置通知的声音、图标、主题、标记
nf.defaults |= Notification.DEFAULT_SOUND;
nf.icon = R.drawable.ic_launcher;
nf.tickerText = "日历有提醒!";
nf.flags |= Notification.FLAG_AUTO_CANCEL;
//设置点击通知页面跳转的数据、跳转的页面
b.putString(WorkItemCheckFragment.EXTRA_WORKITEM_ID, ciList.get(i).getCalendarId());
CalendarItemLab.get(this).setCalendarItems((ArrayList<CalendarItem>) ciList);
intent.setClass(LocalService.this,WorkItemCheckPagerActivity.class);
intent.putExtras(b);
pd = PendingIntent.getActivity(LocalService.this, 0,
intent, PendingIntent.FLAG_CANCEL_CURRENT);
//设置显示在通知下拉框中的信息
//参数分别为:Context,标题,内容,PendingIntent。
nf.setLatestEventInfo(LocalService.this, ciList.get(i)
.getTopic(), CalendarBuilder
.getHourMinuteString(ciList.get(i).getStartTime()),pd);
notifyList.add(nf);
//发送通知栏消息
nm.notify((int) ciList.get(i).notifyTime.getTimeInMillis(),nf);
代码如下:
FragmentManager fm = getSupportFragmentManager();
Fragment MainDateBarfragment = fm
.findFragmentById(R.id.MainDateBarContainer);
((MainDateBarFragment) MainDateBarfragment).setTopDate(calShowDate);
优势:
不足:
参考文献
[1] Bill Phillips Brian Hardy等,Android编程权威指南[M]. 北京:人民邮电出版社,2014.
[2] 李刚等.疯狂Android讲义(第2版). 北京:电子工业出版社,2013.
[3] Zigurd Mednieks等.Android程序设计(第2版). 北京:机械工业出版社,2014
[4] 明日科技. Android从入门到精通.北京:清华大学出版社,2012
[5] (美)迈耶.Android 4 高级编程(第3版). 北京:清华大学出版社,2014
[6] 何孟翰.Google AndroidSDK开发实战演练[M].北京:人民邮电出版社,2012.
[7] 高凯等.Android智能手机软件开发教程[M].北京:国防工业出版社,2012.6.
[8] 徐炳文.佳木斯大学学报(自然科学版).基于J2ME的手机教务课表查询系统设计与实现[J/OL],2010-1(28).
[9] 徐炳文.天津师范大学学报(自然科学版).基于四层架构J2ME移动课表查询系统的开发设计 [J/OL],2011-4(31).
[10] 王中华等.宜春学院学报.Android手机理财软件的实际和实现 [J/OL],2011-12(33).
[11] Gasolin.深入浅出Android手持设备应用程序设计.北京:电子音像出版社,2010.
[12] 张新柱等.齐齐哈尔大学学报.基于Android手机终端信息查询系统的设计 [J/OL],2012-7(28).
[13] Marziah Karch.Android for work:productivity dor professionals[M].USA:
Apress.2010,97~114.
[14] 基于Android的课程表提醒程序.百度百科.http://wenku.baidu.com/view/83d0e6b969dc5022aaea0036.html
[16] 赵洛育,刘洪利. android开发实战经验. 北京:清华大学出版社,2012.
[17] 王金柱,王翔,闫秀华,张雪娇. android学习精要. 北京:清华大学出版社,2012
致谢
致谢
经过将近两个月的学习与实践,本次毕业设计也接近了尾声。通过毕业设计的锻炼,我不仅学到了很多关于android应用开发的知识还体会到在设计开发程序中应有的态度。当然这些知识经验的获得与老师和同学的热心帮助是分不开的。在这里我向他们表示真挚的感谢。 在这里首先要感谢我的导师王晓辉老师。导师的专业水平,治学严谨的态度和科学研究的精神深令我敬佩,并将积极 影响我以后的学习和工作。虽然老师平日工作繁忙,但是老师针对我的问题总是细心的指导,他给我提供了很多创意性的想法,打开了我的思路。
最后要感谢我的母校——华北电力大学,是母校给我们提供了优良的学习环 境。感谢那些曾给我授过课的每一位老师,是你们教会我专业知识。在此,我再 说一次谢谢!谢谢大家!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。