APP下载

基于Android的日历提醒软件的设计与实现

2011-06-14

中原工学院学报 2011年3期
关键词:闹铃课表文件夹

高 亮

(中原工学院,郑州 450007)

近年来,Google智能手机平台Android得到了手机行业及客户的普遍认可[1],呈爆炸性的趋势发展,为移动运营商、手机制造商、软件开发商及客户提供了无限的发展空间[2],使市场上不断涌现出大量的基于Android平台的软件和增值服务.目前,在Google Market上已存在较多版本的日历提醒软件,但大多是通用软件.本文提到的这款软件是为教师和学生等校园人员量身定做的,它在实现提醒类型及铃声的自定义、按设定进行闹钟提醒功能的同时,还实现了课程表管理及其定时提醒.

1 Android平台的体系结构

Android平台自下而上共分4层:操作系统层、运行时库和其他库层、应用框架层和应用程序层[3],如图1所示.

图1 Android平台体系结构

(1)操作系统层:Android实际以Linux作为系统内核,在手机物理硬件与Android软件栈之间处理核心系统服务.

(2)Android运行时库和其他库层:包括一些核心的C/C++库,供系统的各种组件使用.本设计多次用到的操作数据库的SQLite库就属于该层.

(3)应用框架层:为应用程序提供系统API.UI组件就是其中一个重要的部分.

(4)应用程序层:采用Java语言结合XM L开发的各种应用软件,包括Android平台自带的浏览器、联系人、电话等.

(本文介绍的日历提醒软件即属于应用程序层,它会调用应用框架层提供的各种API达到既定的功能效果.

2 功能划分

本软件分为4个模块,分别是提醒类型及铃声管理模块、课表参数设置模块、普通提醒管理模块和课表设定模块.软件运行主界面如图2所示.

(1)提醒类型及铃声管理模块.可通过本模块定制用户需要的提醒种类及其铃声,可对提醒的种类进行增、删及查看操作,可以选择手机内任何路径下的音乐文件作为提醒铃声进行设定.

图2 软件运行主界面

(2)课表参数设置模块.可通过本模块设置与课表相关的参数,如学期起始日期、每天的课程节数、每节的上课时间、每节课闹铃提醒时机等信息,以便在设定课表后,根据这些参数自动制定闹铃时间.

(3)普通提醒管理模块.除课程提醒之外的其他提醒统称普通提醒.在本模块中可对普通提醒进行增、删和查看操作,设定提醒的时间、类型、内容及提醒周期.在保存提醒的一瞬间,程序会根据当前的设定,自动创建闹钟.

(4)课表设定管理模块.本模块专门用于设定课表,可设定每门课程每次课的上课时间(周次和节次).在设定周次时,可以批量设定,例如,可以以“1-10”的方式标示从第1周至第10周,或以“1,3,5,7,9”的方式标示1、3、5、7、9周,但是,“-”符号不得与“,”符号混用.本模块具有对课表的增、删和查看功能.同普通提醒管理模块一样,在保存课表的一瞬间,程序会根据当前设定的课表参数,结合当前课表信息的详细内容,自动计算闹铃时间和周期,并创建闹钟.

3 数据库设计

本软件采用的数据库是Android平台内嵌的SQLite数据库.本软件涉及到的数据库主要关系模式如下:

提醒类型(提醒类型编号、提醒类型名称、铃声);

课表参数(参数名称、参数值);

普通提醒(提醒编号、提醒名称、提醒类型编号、提醒时间、提醒周期);

课表设定(课表编号、课程名称、上课周次范围、上课节次).

4 关键技术

4.1 Activity间数据的传递

在本软件中涉及到大量的A ctivity间数据传递的需求.如点击日历中的某个日期,打开普通提醒管理模块或查看课表时,需要将当前选中的日期传递到新的Activity中,以便在新的Activity中依照当前选中的日期,来显示该日期的提醒信息或课表信息.

实现从一个Activity向另一个Activity传递数据需要利用Intent对象.具体做法如下:

(1)首先在源Activity中用以下代码实现数据的传送:

Intent intent=new Intent();//创建一个Intent对象

intent.setC lass(CalendarActivity.this,SetNotify.class);//设置intent所对应的源Activity对象及目标Activity类

intent.putExtra("the Date",this Month.get(Calendar.YEAR)+"-"+(this Month.get(Calendar.MONTH)+1)+"-"+this Month.get(Calendar.DAY_OF_MONTH));//将当前选中的时间,以"the Date"为名设为参数,待传递

Calendar Activity.this.start Activity(intent);//启动目标Activity,并将参数传递给目标Activity

(2)在目的Activity中用以下代码实现数据的获取:

Intent intent=get Intent();

the Date=intent.get String Extra("the Date");//获取theDate参数内的值

4.2 SQLite数据库的访问与操作

在Android平台下访问SQLite数据库的方法较简单,可以使用openOrCreateDatabase函数创建或打开数据库,并使用该函数返回的SQLiteDatabase对象的execSQL函数方法执行非查询SQL语句,使用rawQuery方法执行查询语句,并返回游标对象Cursor来遍历查询结果中的数据.

4.3 自定义ListV iew的布局

在Android平台下,List View默认的显示样式如图3所示.

图3 ListView默认的显示样式

从图3可见,默认状态下,ListView显示的数据每行只能显示2个信息——主显信息(大号字)与非主显信息(小号字).如果需求复杂起来,比如图4所示的普通提醒列表界面需要每行显示4个信息——提醒名称、提醒时间、提醒类型及提醒周期,这时,默认的ListView布局就无法满足需求了.

图4 普通提醒列表界面

要设计图4所示的ListView显示效果,需要自定义ListView的布局样式文件,然后在创建ListAdapter对象时,应用此布局文件构造对象.例如本软件自定义的布局文件名为forlistview.xml,内含5个Text-View,名称分别为notiid(用户存储提醒信息的主键)、no ticontent(提醒名称)、typename(提醒类型)、notitime(提醒时间)和noticycle(提醒周期),其中notiid设置为不可见的.核心代码如下:

List A dapter adapter=new Simple Cursor Adapter(this,R.lay out.for listview,cur,

new String[]{"_id","notiContent","typenam e","notiTime","notiCycle"},new

int[]{R.id.notiid,R.id.noticontent,R.id.typename,R.id.notitime,R.id.noticycle});//利用布局文件及游标对象创建ListAdap ter对象.

lv.setAdapter(adapter);//将数据绑定到List-V iew中并显示

4.4 显示并访问手机内的文件

本软件在设定提醒类型时,可以为各提醒类型指定手机系统内任何位置的音乐文件作为提醒铃声,因此需要为用户提供浏览系统目录结构的功能界面,如图5所示.

图5 系统目录结构浏览界面

实现该目录结构浏览功能的具体思路如下:

(1)为ListView设计2个辅助布局文件directory_list.xml和file_row.xml,前者用于设定显示空文件夹的效果,后者用于设定显示文件和文件夹的效果.

(2)设计bindListView函数,用于向ListV iew中绑定当前所选目录下的文件及文件夹列表.

private void bind ListView(File[]files){

items=new A rrayList<String>();

items.add("返回上一层");

for(File file:files)//遍历每一个文件或文件夹

items.add(file.getPath());//将遍历到的文件或文件夹路径添加到items集合

A rrayAdapter<String>fileList=new A rray-A dapter<String>(this,

R.layout.file_row,items);//以item s为源构造适配器

setListAdapter(fileList);//向ListView中绑定数据}

(3)通过File对象的listFiles函数获取当前文件夹下的所有文件及文件夹的集合,并将该集合作为参数传递给bindListView函数,以显示这些文件和文件夹信息.

(4)监听ListView的onListItemC lick事件.首先通过file对象的isDirectory函数判断当前选中的内容是文件夹还是文件;如果是文件夹,就获取该文件夹下的子文件及文件夹的集合,并将其作为参数传递给bind ListView函数以继续显示这些子文件和文件夹,否则,将选中的音乐文件的路径更新到数据库中.

4.5 闹钟的实现

在Android平台下实现闹铃功能需要使用Alarm Manager类,对应Alarm Manager有一个Alarm-Manager Service服务程序,该服务程序用于提供闹铃服务.应用程序只要注册一个闹铃,Alarm Manager Service就会适时设置即将触发的闹铃给闹铃设备,并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,Alarm Manager Servie服务程序就会发出广播,接下来就由广播接受者BroadCastReceiver来处理闹铃事件,所以实现闹铃功能需要以下3个基本步骤:

步骤一:设计一个继承BroadcastReceiver类的子类,重写其onReceive方法,该方法就是接受到闹铃广播时要触发的方法,在该方法中可以控制闹铃事件来临时要做的事情,如开启一个线程播放闹铃音乐,并弹出对话框,提问用户是否关闭闹铃.在弹出对话框时要注意的一点是,在BroadcastReceiver类中无法直接使用AlertDialog,应将AlertDialog放在Activity中,再在BroadcastReveiver中用startActivity启动这个Activity,而且启动这个Activity所使用的Intent应调用set-Flags方法,指定其标记为Intent.FLAG_ACTIVITY_NEW_TASK,说明此次启动的Activity是新的任务.

步骤二:注册闹铃.首先使用Pending Intent的getBroadcast方法来调用步骤一中创建的类作为目标组件;接着利用getSystemService(ALARM_SERVICE)获取Alarm Manager;最后依次调用A larm-M anager的set方法注册闹铃,用setRepeating方法设置闹铃周期.

步骤三:在需要关闭闹铃的位置调用Alarm-Manager的cancel方法,取消闹铃.

5 结 语

本文介绍了在Android平台下开发日历提醒软件的一般方法,重点介绍了本软件的设计思路及在开发本软件过程中所使用到的Android下的关键技术,这些技术都是开发Android平台下应用软件的常用知识点.本软件为校园用户提供了一款便利的手机软件,目前已进入试用阶段.

[1] 王希贝.Android开源手机与知识产权保护浅析[J].中国发明与专利,2010(11):68-69.

[2] 贾理华,乐燕芬,施伟斌.基于Android平台简易即时通讯的研究与设计[J].常州工学院学报,2010(4):51-53.

[3] 杨丰盛.Android应用开发揭秘[M].北京:机械工业出版社,2010.

猜你喜欢

闹铃课表文件夹
日出
学生出招解决”日课牌“问题
如果我是校长
Fast Folders,让你的文件夹四通八达
开闹钟的老人
开闹钟的老人
摸清超标源头 大文件夹这样处理
调动右键 解决文件夹管理三大难题
不容忽视的空文件夹
各地区学生课表