高 亮
(中原工學(xué)院,鄭州 450007)
近年來,Google智能手機(jī)平臺(tái)Android得到了手機(jī)行業(yè)及客戶的普遍認(rèn)可[1],呈爆炸性的趨勢發(fā)展,為移動(dòng)運(yùn)營商、手機(jī)制造商、軟件開發(fā)商及客戶提供了無限的發(fā)展空間[2],使市場上不斷涌現(xiàn)出大量的基于Android平臺(tái)的軟件和增值服務(wù).目前,在Google Market上已存在較多版本的日歷提醒軟件,但大多是通用軟件.本文提到的這款軟件是為教師和學(xué)生等校園人員量身定做的,它在實(shí)現(xiàn)提醒類型及鈴聲的自定義、按設(shè)定進(jìn)行鬧鐘提醒功能的同時(shí),還實(shí)現(xiàn)了課程表管理及其定時(shí)提醒.
Android平臺(tái)自下而上共分4層:操作系統(tǒng)層、運(yùn)行時(shí)庫和其他庫層、應(yīng)用框架層和應(yīng)用程序?qū)覽3],如圖1所示.
圖1 Android平臺(tái)體系結(jié)構(gòu)
(1)操作系統(tǒng)層:Android實(shí)際以Linux作為系統(tǒng)內(nèi)核,在手機(jī)物理硬件與Android軟件棧之間處理核心系統(tǒng)服務(wù).
(2)Android運(yùn)行時(shí)庫和其他庫層:包括一些核心的C/C++庫,供系統(tǒng)的各種組件使用.本設(shè)計(jì)多次用到的操作數(shù)據(jù)庫的SQLite庫就屬于該層.
(3)應(yīng)用框架層:為應(yīng)用程序提供系統(tǒng)API.UI組件就是其中一個(gè)重要的部分.
(4)應(yīng)用程序?qū)樱翰捎肑ava語言結(jié)合XM L開發(fā)的各種應(yīng)用軟件,包括Android平臺(tái)自帶的瀏覽器、聯(lián)系人、電話等.
(本文介紹的日歷提醒軟件即屬于應(yīng)用程序?qū)?它會(huì)調(diào)用應(yīng)用框架層提供的各種API達(dá)到既定的功能效果.
本軟件分為4個(gè)模塊,分別是提醒類型及鈴聲管理模塊、課表參數(shù)設(shè)置模塊、普通提醒管理模塊和課表設(shè)定模塊.軟件運(yùn)行主界面如圖2所示.
(1)提醒類型及鈴聲管理模塊.可通過本模塊定制用戶需要的提醒種類及其鈴聲,可對(duì)提醒的種類進(jìn)行增、刪及查看操作,可以選擇手機(jī)內(nèi)任何路徑下的音樂文件作為提醒鈴聲進(jìn)行設(shè)定.
圖2 軟件運(yùn)行主界面
(2)課表參數(shù)設(shè)置模塊.可通過本模塊設(shè)置與課表相關(guān)的參數(shù),如學(xué)期起始日期、每天的課程節(jié)數(shù)、每節(jié)的上課時(shí)間、每節(jié)課鬧鈴提醒時(shí)機(jī)等信息,以便在設(shè)定課表后,根據(jù)這些參數(shù)自動(dòng)制定鬧鈴時(shí)間.
(3)普通提醒管理模塊.除課程提醒之外的其他提醒統(tǒng)稱普通提醒.在本模塊中可對(duì)普通提醒進(jìn)行增、刪和查看操作,設(shè)定提醒的時(shí)間、類型、內(nèi)容及提醒周期.在保存提醒的一瞬間,程序會(huì)根據(jù)當(dāng)前的設(shè)定,自動(dòng)創(chuàng)建鬧鐘.
(4)課表設(shè)定管理模塊.本模塊專門用于設(shè)定課表,可設(shè)定每門課程每次課的上課時(shí)間(周次和節(jié)次).在設(shè)定周次時(shí),可以批量設(shè)定,例如,可以以“1-10”的方式標(biāo)示從第1周至第10周,或以“1,3,5,7,9”的方式標(biāo)示1、3、5、7、9周,但是,“-”符號(hào)不得與“,”符號(hào)混用.本模塊具有對(duì)課表的增、刪和查看功能.同普通提醒管理模塊一樣,在保存課表的一瞬間,程序會(huì)根據(jù)當(dāng)前設(shè)定的課表參數(shù),結(jié)合當(dāng)前課表信息的詳細(xì)內(nèi)容,自動(dòng)計(jì)算鬧鈴時(shí)間和周期,并創(chuàng)建鬧鐘.
本軟件采用的數(shù)據(jù)庫是Android平臺(tái)內(nèi)嵌的SQLite數(shù)據(jù)庫.本軟件涉及到的數(shù)據(jù)庫主要關(guān)系模式如下:
提醒類型(提醒類型編號(hào)、提醒類型名稱、鈴聲);
課表參數(shù)(參數(shù)名稱、參數(shù)值);
普通提醒(提醒編號(hào)、提醒名稱、提醒類型編號(hào)、提醒時(shí)間、提醒周期);
課表設(shè)定(課表編號(hào)、課程名稱、上課周次范圍、上課節(jié)次).
在本軟件中涉及到大量的A ctivity間數(shù)據(jù)傳遞的需求.如點(diǎn)擊日歷中的某個(gè)日期,打開普通提醒管理模塊或查看課表時(shí),需要將當(dāng)前選中的日期傳遞到新的Activity中,以便在新的Activity中依照當(dāng)前選中的日期,來顯示該日期的提醒信息或課表信息.
實(shí)現(xiàn)從一個(gè)Activity向另一個(gè)Activity傳遞數(shù)據(jù)需要利用Intent對(duì)象.具體做法如下:
(1)首先在源Activity中用以下代碼實(shí)現(xiàn)數(shù)據(jù)的傳送:
Intent intent=new Intent();//創(chuàng)建一個(gè)Intent對(duì)象
intent.setC lass(CalendarActivity.this,SetNotify.class);//設(shè)置intent所對(duì)應(yīng)的源Activity對(duì)象及目標(biāo)Activity類
intent.putExtra("the Date",this Month.get(Calendar.YEAR)+"-"+(this Month.get(Calendar.MONTH)+1)+"-"+this Month.get(Calendar.DAY_OF_MONTH));//將當(dāng)前選中的時(shí)間,以"the Date"為名設(shè)為參數(shù),待傳遞
Calendar Activity.this.start Activity(intent);//啟動(dòng)目標(biāo)Activity,并將參數(shù)傳遞給目標(biāo)Activity
(2)在目的Activity中用以下代碼實(shí)現(xiàn)數(shù)據(jù)的獲取:
Intent intent=get Intent();
the Date=intent.get String Extra("the Date");//獲取theDate參數(shù)內(nèi)的值
在Android平臺(tái)下訪問SQLite數(shù)據(jù)庫的方法較簡單,可以使用openOrCreateDatabase函數(shù)創(chuàng)建或打開數(shù)據(jù)庫,并使用該函數(shù)返回的SQLiteDatabase對(duì)象的execSQL函數(shù)方法執(zhí)行非查詢SQL語句,使用rawQuery方法執(zhí)行查詢語句,并返回游標(biāo)對(duì)象Cursor來遍歷查詢結(jié)果中的數(shù)據(jù).
在Android平臺(tái)下,List View默認(rèn)的顯示樣式如圖3所示.
圖3 ListView默認(rèn)的顯示樣式
從圖3可見,默認(rèn)狀態(tài)下,ListView顯示的數(shù)據(jù)每行只能顯示2個(gè)信息——主顯信息(大號(hào)字)與非主顯信息(小號(hào)字).如果需求復(fù)雜起來,比如圖4所示的普通提醒列表界面需要每行顯示4個(gè)信息——提醒名稱、提醒時(shí)間、提醒類型及提醒周期,這時(shí),默認(rèn)的ListView布局就無法滿足需求了.
圖4 普通提醒列表界面
要設(shè)計(jì)圖4所示的ListView顯示效果,需要自定義ListView的布局樣式文件,然后在創(chuàng)建ListAdapter對(duì)象時(shí),應(yīng)用此布局文件構(gòu)造對(duì)象.例如本軟件自定義的布局文件名為forlistview.xml,內(nèi)含5個(gè)Text-View,名稱分別為notiid(用戶存儲(chǔ)提醒信息的主鍵)、no ticontent(提醒名稱)、typename(提醒類型)、notitime(提醒時(shí)間)和noticycle(提醒周期),其中notiid設(shè)置為不可見的.核心代碼如下:
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});//利用布局文件及游標(biāo)對(duì)象創(chuàng)建ListAdap ter對(duì)象.
lv.setAdapter(adapter);//將數(shù)據(jù)綁定到List-V iew中并顯示
本軟件在設(shè)定提醒類型時(shí),可以為各提醒類型指定手機(jī)系統(tǒng)內(nèi)任何位置的音樂文件作為提醒鈴聲,因此需要為用戶提供瀏覽系統(tǒng)目錄結(jié)構(gòu)的功能界面,如圖5所示.
圖5 系統(tǒng)目錄結(jié)構(gòu)瀏覽界面
實(shí)現(xiàn)該目錄結(jié)構(gòu)瀏覽功能的具體思路如下:
(1)為ListView設(shè)計(jì)2個(gè)輔助布局文件directory_list.xml和file_row.xml,前者用于設(shè)定顯示空文件夾的效果,后者用于設(shè)定顯示文件和文件夾的效果.
(2)設(shè)計(jì)bindListView函數(shù),用于向ListV iew中綁定當(dāng)前所選目錄下的文件及文件夾列表.
private void bind ListView(File[]files){
items=new A rrayList<String>();
items.add("返回上一層");
for(File file:files)//遍歷每一個(gè)文件或文件夾
items.add(file.getPath());//將遍歷到的文件或文件夾路徑添加到items集合
A rrayAdapter<String>fileList=new A rray-A dapter<String>(this,
R.layout.file_row,items);//以item s為源構(gòu)造適配器
setListAdapter(fileList);//向ListView中綁定數(shù)據(jù)}
(3)通過File對(duì)象的listFiles函數(shù)獲取當(dāng)前文件夾下的所有文件及文件夾的集合,并將該集合作為參數(shù)傳遞給bindListView函數(shù),以顯示這些文件和文件夾信息.
(4)監(jiān)聽ListView的onListItemC lick事件.首先通過file對(duì)象的isDirectory函數(shù)判斷當(dāng)前選中的內(nèi)容是文件夾還是文件;如果是文件夾,就獲取該文件夾下的子文件及文件夾的集合,并將其作為參數(shù)傳遞給bind ListView函數(shù)以繼續(xù)顯示這些子文件和文件夾,否則,將選中的音樂文件的路徑更新到數(shù)據(jù)庫中.
在Android平臺(tái)下實(shí)現(xiàn)鬧鈴功能需要使用Alarm Manager類,對(duì)應(yīng)Alarm Manager有一個(gè)Alarm-Manager Service服務(wù)程序,該服務(wù)程序用于提供鬧鈴服務(wù).應(yīng)用程序只要注冊(cè)一個(gè)鬧鈴,Alarm Manager Service就會(huì)適時(shí)設(shè)置即將觸發(fā)的鬧鈴給鬧鈴設(shè)備,并且一直監(jiān)聽鬧鈴設(shè)備,一旦有鬧鈴觸發(fā)或者是鬧鈴事件發(fā)生,Alarm Manager Servie服務(wù)程序就會(huì)發(fā)出廣播,接下來就由廣播接受者BroadCastReceiver來處理鬧鈴事件,所以實(shí)現(xiàn)鬧鈴功能需要以下3個(gè)基本步驟:
步驟一:設(shè)計(jì)一個(gè)繼承BroadcastReceiver類的子類,重寫其onReceive方法,該方法就是接受到鬧鈴廣播時(shí)要觸發(fā)的方法,在該方法中可以控制鬧鈴事件來臨時(shí)要做的事情,如開啟一個(gè)線程播放鬧鈴音樂,并彈出對(duì)話框,提問用戶是否關(guān)閉鬧鈴.在彈出對(duì)話框時(shí)要注意的一點(diǎn)是,在BroadcastReceiver類中無法直接使用AlertDialog,應(yīng)將AlertDialog放在Activity中,再在BroadcastReveiver中用startActivity啟動(dòng)這個(gè)Activity,而且啟動(dòng)這個(gè)Activity所使用的Intent應(yīng)調(diào)用set-Flags方法,指定其標(biāo)記為Intent.FLAG_ACTIVITY_NEW_TASK,說明此次啟動(dòng)的Activity是新的任務(wù).
步驟二:注冊(cè)鬧鈴.首先使用Pending Intent的getBroadcast方法來調(diào)用步驟一中創(chuàng)建的類作為目標(biāo)組件;接著利用getSystemService(ALARM_SERVICE)獲取Alarm Manager;最后依次調(diào)用A larm-M anager的set方法注冊(cè)鬧鈴,用setRepeating方法設(shè)置鬧鈴周期.
步驟三:在需要關(guān)閉鬧鈴的位置調(diào)用Alarm-Manager的cancel方法,取消鬧鈴.
本文介紹了在Android平臺(tái)下開發(fā)日歷提醒軟件的一般方法,重點(diǎn)介紹了本軟件的設(shè)計(jì)思路及在開發(fā)本軟件過程中所使用到的Android下的關(guān)鍵技術(shù),這些技術(shù)都是開發(fā)Android平臺(tái)下應(yīng)用軟件的常用知識(shí)點(diǎn).本軟件為校園用戶提供了一款便利的手機(jī)軟件,目前已進(jìn)入試用階段.
[1] 王希貝.Android開源手機(jī)與知識(shí)產(chǎn)權(quán)保護(hù)淺析[J].中國發(fā)明與專利,2010(11):68-69.
[2] 賈理華,樂燕芬,施偉斌.基于Android平臺(tái)簡易即時(shí)通訊的研究與設(shè)計(jì)[J].常州工學(xué)院學(xué)報(bào),2010(4):51-53.
[3] 楊豐盛.Android應(yīng)用開發(fā)揭秘[M].北京:機(jī)械工業(yè)出版社,2010.