瞿 蘇
(江蘇聯(lián)合職業(yè)技術(shù)學(xué)院 揚(yáng)州商務(wù)分院,江蘇 揚(yáng)州 225000)
基于Android中的Service實(shí)現(xiàn)視力保護(hù)程序
瞿 蘇
(江蘇聯(lián)合職業(yè)技術(shù)學(xué)院 揚(yáng)州商務(wù)分院,江蘇 揚(yáng)州 225000)
用戶(hù)可以在免費(fèi)手機(jī)平臺(tái)Android上,開(kāi)發(fā)各種對(duì)自身使用的APK應(yīng)用文件, 在開(kāi)發(fā)應(yīng)用程序過(guò)程中, 程序員可以使用Service開(kāi)發(fā)需在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作,并且不提供用戶(hù)界面的應(yīng)用程序組件。重點(diǎn)講述視力保護(hù)程序使用Service的過(guò)程,該過(guò)程首先定義TimeService類(lèi)和TimeActivity類(lèi),關(guān)鍵是在AndroidManifest.xml文件中增加Activity和Service配置,以此調(diào)用TimeService的過(guò)程而啟動(dòng)服務(wù)和停止服務(wù)。
Service;視力保護(hù)程序; Started Service
1.1 Service應(yīng)用簡(jiǎn)介
Service(服務(wù))是能夠在后臺(tái)執(zhí)行長(zhǎng)時(shí)間運(yùn)行操作,并且不提供用戶(hù)界面的應(yīng)用程序組件,它是用于在后臺(tái)完成用戶(hù)指定的操作,可以用于音樂(lè)播放器、文件下載工具等應(yīng)用程序[1]。用戶(hù)可以使用其他控件來(lái)與進(jìn)行通信。當(dāng)用戶(hù)切換到其他應(yīng)用程序時(shí),服務(wù)依然可以在后臺(tái)運(yùn)行,其他應(yīng)用程序組件可以綁定服務(wù),進(jìn)程間可以相互通信。例如,服務(wù)能在后臺(tái)處理網(wǎng)絡(luò)事務(wù)、播放音樂(lè)、執(zhí)行文件I/O或者與ContentProvider通信。
1.2 視力保護(hù)程序
視力保護(hù)程序是一個(gè)保護(hù)眼睛的手機(jī)軟件,如果用戶(hù)當(dāng)前環(huán)境光照強(qiáng)度,智能調(diào)節(jié)屏幕亮度、實(shí)時(shí)的保護(hù)用戶(hù)的眼睛,讓用戶(hù)保持最健康的用眼習(xí)慣,使眼睛視力總是處于最好狀態(tài)。
2.1 視力保護(hù)程序的實(shí)現(xiàn)目的
視力保護(hù)程序是一個(gè)保護(hù)眼睛的手機(jī)軟件,軟件會(huì)告訴用戶(hù)用怎樣的方法,可以緩解眼睛疲勞或者其他的眼部問(wèn)題,用戶(hù)也能設(shè)置提醒,告訴自己什么時(shí)候該好好活動(dòng)休息一下了,達(dá)到實(shí)時(shí)感應(yīng)的效果。
2.2 項(xiàng)目實(shí)現(xiàn)
2.2.1 項(xiàng)目開(kāi)發(fā)環(huán)境
開(kāi)發(fā)APK應(yīng)用程序,對(duì)硬件要求較高,Android SDK全部下載大概需要占用4GB硬盤(pán)空間,由于開(kāi)發(fā)過(guò)程中需要反復(fù)重啟模擬器,而每次重啟都會(huì)消耗幾分鐘時(shí)間(視機(jī)器配置而定)。
2.2.2 技術(shù)使用
(1)Service分類(lèi)
Service(服務(wù))是從本質(zhì)上分為兩種類(lèi)型Started(啟動(dòng))和Bound(綁定)。當(dāng)應(yīng)用程序組件通過(guò)調(diào)用Started Service時(shí),Service為Started狀態(tài);當(dāng)調(diào)用bindService()時(shí),Service為bound狀態(tài)。
(2)創(chuàng)建Started Service
當(dāng)用戶(hù)打開(kāi)音樂(lè)播放器、文件下載工具等應(yīng)用程序時(shí), Service可以在后臺(tái)完成用戶(hù)的操作。用戶(hù)可以使用其他控件來(lái)與Service進(jìn)行通信。
當(dāng)Service為“started”時(shí),Service可以在后臺(tái)一直運(yùn)行,因?yàn)槠渖芷谂c啟動(dòng)它的組件無(wú)關(guān),所以即使啟動(dòng)它的服務(wù)組件被銷(xiāo)毀。當(dāng)服務(wù)完成任務(wù)后,可以通過(guò)stopSelf()或者由其他組件調(diào)用stop Service()停止服務(wù)。Activity組件可以通過(guò)startService()和傳遞Intent對(duì)象來(lái)啟動(dòng)服務(wù),服務(wù)可以通過(guò)onStartCommand()方法接收Intent。Intent對(duì)象中包含了服務(wù)和服務(wù)中所包含的全部數(shù)據(jù)[2]。
(3)繼承IntentService類(lèi)
大多數(shù)啟動(dòng)服務(wù)沒(méi)有必要處理多個(gè)請(qǐng)求,因此提出了類(lèi)。程序員可以使用IntentService類(lèi)使用了onStartCommand()方法、onHandleIntent()方法、onBind()方法和onStartCommand()方法。
(4)繼承Service類(lèi)
使用IntentService類(lèi)簡(jiǎn)化啟動(dòng)服務(wù)的實(shí)現(xiàn),然而,如果需要讓服務(wù)處理多個(gè)線程(取代使用工作隊(duì)列處理啟動(dòng)請(qǐng)求),則可以繼承Service類(lèi)來(lái)處理各個(gè)Intent[3]。對(duì)于每次啟動(dòng)請(qǐng)求,它使用工作線程來(lái)執(zhí)行任務(wù),并且每次處理一個(gè)請(qǐng)求。
(5)啟動(dòng)服務(wù)
程序員可以通過(guò)Activity啟動(dòng)服務(wù),也可以通過(guò)其他應(yīng)用程序組件,傳遞Intent對(duì)象到startService()方法啟動(dòng)服務(wù)。Android系統(tǒng)調(diào)用服務(wù)的onStartCommand()方法并將傳遞給它。startService()方法立即返回,然后系統(tǒng)調(diào)用服務(wù)的onStartCommand()方法。如果服務(wù)還沒(méi)有運(yùn)行,系統(tǒng)首先調(diào)用onCreat()方法,接著調(diào)用onStartCommand()方法。
當(dāng)服務(wù)沒(méi)有提供綁定時(shí),Intent 應(yīng)用程序組件和服務(wù)之間,唯一的通信模式是StartService()。然而,如果開(kāi)發(fā)人員需要服務(wù)返回結(jié)果,則啟動(dòng)該服務(wù)的客戶(hù)端,能為廣播創(chuàng)建pendingIntent(使用getBroadcast()方法),并通過(guò)啟動(dòng)服務(wù)的Intent進(jìn)行發(fā)送。服務(wù)接下來(lái)便能使用廣播來(lái)發(fā)送結(jié)果。啟動(dòng)服務(wù)如果被多次請(qǐng)求,則Service的onStartCommand()方法會(huì)被多次調(diào)用。
(6)停止服務(wù)
啟動(dòng)服務(wù)必須管理自己的生命周期,即系統(tǒng)不會(huì)停止或銷(xiāo)毀服務(wù),除非系統(tǒng)必須回收系統(tǒng)內(nèi)存,而且在 onStartCommand()方法返回后,服務(wù)繼續(xù)運(yùn)行。
Service如何停止服務(wù)呢?它可以調(diào)用stopSelf()方法停止自身和調(diào)用stopService(),當(dāng)調(diào)用以上兩種方法請(qǐng)求時(shí),系統(tǒng)會(huì)盡快銷(xiāo)毀服務(wù)。如果同時(shí)遇到多個(gè)onStartCommand()請(qǐng)求時(shí),系統(tǒng)不會(huì)立刻停止服務(wù),因?yàn)榭赡軙?huì)收到新的啟動(dòng)請(qǐng)求。
為了解決這個(gè)問(wèn)題,開(kāi)發(fā)人員可以使用stopSelf(int)方法,來(lái)確保停止服務(wù)的請(qǐng)求總是基于最近收到的啟動(dòng)請(qǐng)求,并將啟動(dòng)請(qǐng)求的ID傳遞給停止請(qǐng)求。這樣,如果服務(wù)在調(diào)用stopSelf(int)方法前接收到新啟動(dòng)請(qǐng)求,會(huì)因ID匹配而不停止服務(wù)。應(yīng)用程序應(yīng)該在任務(wù)完成后停止服務(wù),來(lái)避免系統(tǒng)資源浪費(fèi)和電池消耗。即使某些情況下綁定服務(wù),只要調(diào)用onStartCommand()方法就必須停止服務(wù)。
(7)管理Service的生命周期
用戶(hù)經(jīng)常在不知情的情況下,服務(wù)在后臺(tái)運(yùn)行。開(kāi)發(fā)人員需明白服務(wù)如何銷(xiāo)毀,因此提出了服務(wù)的生命周期。服務(wù)的生命周期可以分成兩個(gè)不同的路徑:Started Service:當(dāng)其他組件調(diào)用startService()方法時(shí),服務(wù)被創(chuàng)建。當(dāng)服務(wù)停止時(shí),系統(tǒng)將其銷(xiāo)毀;Bound Service:當(dāng)其他組件調(diào)用bindService()方法時(shí),服務(wù)被創(chuàng)建。接著客戶(hù)端通過(guò)IBinder接口與服務(wù)通信。客戶(hù)端通過(guò)unbindService()方法關(guān)閉連接。
這兩條路徑并非完全獨(dú)立,即開(kāi)發(fā)人員可以綁定已經(jīng)使用startService()方法啟動(dòng)的服務(wù)。stopService()和stopSelf()方法直到全部客戶(hù)端解綁定時(shí)才能停止服務(wù)。
3.1 在Eclipse中創(chuàng)建Android項(xiàng)目,當(dāng)應(yīng)用程序運(yùn)行1分鐘后,顯示提示信息,提醒用戶(hù)保護(hù)視力。
修改reslayout目錄中的main.xml文件,定義應(yīng)用程序的背景圖片和一個(gè)文本框。
3.2 在com.mingrisoft包中,定義TimeService類(lèi),它繼承Service類(lèi)。在onStart()方法中,使用Timer類(lèi)完成延時(shí)操作,在一個(gè)新線程中創(chuàng)建消息,并且在60秒后運(yùn)行。
3.3 在com.mingrisoft包中,定義TimeActivity類(lèi),它繼承Activity類(lèi),在onCreate()方法中,啟動(dòng)服務(wù)。
3.4 修改AndroidManifest.xml文件,增加Activity和Service配置。
3.5 程序編寫(xiě)完成,啟動(dòng)應(yīng)用程序,提示1分鐘后顯示。
本文重點(diǎn)講述了開(kāi)發(fā)視力保護(hù)程序使用Service的過(guò)程,整個(gè)過(guò)程,首先定義了繼承Service類(lèi)的TimeService類(lèi),和繼承Activity類(lèi)的TimeActivity類(lèi),兩類(lèi)的目的分別是用onStart()方法,實(shí)現(xiàn)60秒后運(yùn)行通知信息和onCreate()方法實(shí)現(xiàn)啟動(dòng)服務(wù),再者在AndroidManifest.xml文件中增加Activity和Service配置,以此調(diào)用TimeService的過(guò)程而啟動(dòng)服務(wù)和停止服務(wù),同時(shí)程序員可根據(jù)需求將60秒時(shí)間更改,該視力保護(hù)程序簡(jiǎn)單而易操作。本文主要是通過(guò)視力保護(hù)程序開(kāi)發(fā)的過(guò)程介紹了四大組件之一的Service(服務(wù)),服務(wù)可以分成Started服務(wù)和Bound服務(wù)兩大類(lèi)。對(duì)于Started服務(wù),有兩種實(shí)現(xiàn)方式:繼承IntentService類(lèi)和繼承Service類(lèi);對(duì)于Bound服務(wù),有兩種實(shí)現(xiàn)方式:繼承Binder類(lèi)和使用Messenger類(lèi)。
[1]王寅峰,許志良.AppInventor實(shí)踐教程——Android智能應(yīng)用開(kāi)發(fā)前傳[M].北京:電子工業(yè)出版社,2013:210-230.
[2]David Wolber,Hal Abelson,Ellen Spertus.App Inventor:Create Your Own Android Apps[J].O’Reilly,2011:150-180.
[3]王向輝.可視化開(kāi)發(fā)Android應(yīng)用程序——拼圖開(kāi)發(fā)模式App Inventor[M].北京:清華大學(xué)出版社,2013:231-253.
[4]明日科技.Android從入門(mén)到精通[M].北京:清華大學(xué)出版社,2015:384-412.
Eyesight Protection Program Based on the Android Service Implementation
QU Su
(Yangzhou Business Branch of Jiangsu United Vocational and Technical College,Yangzhou,Jiangsu 225127)
Users can develop various APK applications for their own use for free on Android mobile phone platform. In the process of developing the application, the programmer can use the service development in the background of executive time and does not provide a user interface for operating the application components. This article focuses on the process of visual acuity protection programs using the service process. The process first defines Time Service class and Time Activity class. The key of the process is increasing the Activity and the Service configuration in the AndroidManifest.xml file, then call Time Service, start service and stop service.
service; eyesight protection program; started service
2016-10-09
瞿 蘇(1982-),女,江蘇揚(yáng)州人,講師,碩士。研究方向:計(jì)算機(jī)應(yīng)用技術(shù)。
R77
A
1008-8156(2016)04-0064-04
修回日期:2016-11-22
張家口職業(yè)技術(shù)學(xué)院學(xué)報(bào)2016年4期