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