異步執(zhí)行
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),青羊企業(yè)網(wǎng)站建設(shè),青羊品牌網(wǎng)站建設(shè),網(wǎng)站定制,青羊網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,青羊網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
android中,activity、service都是在主線程,service與activity的主要區(qū)別就是service沒有前臺(tái)界面,不能直接與用戶交互,另外可以相對保證不會(huì)被系統(tǒng)隨便的kill掉。所以service適用于一些無需交互的后臺(tái)操作,但如果你直接在service中進(jìn)行耗時(shí)操作的話,因?yàn)樵谥骶€程所以依然會(huì)出現(xiàn)和activity主線程一樣的超時(shí)的問題,所以好的方式是在service中啟動(dòng)其他的線程去執(zhí)行耗時(shí)操作。
官方原文: 地址
本文摘錄自官方原文,方便自己觀看。
service 是一個(gè)可以在后臺(tái)長時(shí)間運(yùn)行的操作而不提供用戶界面的應(yīng)用組件。服務(wù)可以由其他應(yīng)用組件啟動(dòng),而且即使用戶切換到其他應(yīng)用程序,服務(wù)仍將在后臺(tái)繼續(xù)運(yùn)行。此外,組件可以綁定到服務(wù),以與之進(jìn)行交互,甚至執(zhí)行進(jìn)程間的通信(IPC)
服務(wù)基本分為兩種形式:
啟動(dòng)
綁定
上述雖然分開概括這兩種服務(wù),但是服務(wù)可以同時(shí)以這兩種方式運(yùn)行,也就是說,他既可以是啟動(dòng)服務(wù)(以無限期運(yùn)行),也允許綁定。問題在于是否實(shí)現(xiàn)了一組回調(diào)方法: onStartCommand() (允許組件啟動(dòng)服務(wù))和 onBing() (允許綁定服務(wù))。
無論應(yīng)用是出于啟動(dòng)狀態(tài)還是綁定狀態(tài),亦或處于啟動(dòng)并且綁定狀態(tài),任何應(yīng)用組件均可以像使用Activity那么調(diào)用Itent來使用服務(wù)(即使此服務(wù)來自另一應(yīng)用)。 不過,您可以通過清單文件將服務(wù)聲明為私有服務(wù),并阻止其他應(yīng)用訪問。 使用清單文件聲明服務(wù)部分將對此做更詳盡的闡述。
注意:
服務(wù)在其托管進(jìn)程的主線程中運(yùn)行,它既不創(chuàng)建自己的線程,也不在單獨(dú)的進(jìn)程中運(yùn)行(除非另行指定)。這意味著,如果服務(wù)將執(zhí)行任何CPU密集型工作或者阻止性操作(我理解為耗時(shí)操作,例如 MP3 播放或聯(lián)網(wǎng)),則應(yīng)在服務(wù)內(nèi)創(chuàng)建新線程來完成這項(xiàng)工作。通過使用單獨(dú)的線程,可以降低發(fā)生“應(yīng)用無響應(yīng)”(ANR) 錯(cuò)誤的風(fēng)險(xiǎn),而應(yīng)用的主線程仍可繼續(xù)專注于運(yùn)行用戶與 Activity 之間的交互。
要?jiǎng)?chuàng)建服務(wù),您必須創(chuàng)建 Service 的子類(或使用它的一個(gè)現(xiàn)有子類)。在實(shí)現(xiàn)中,您需要重寫一些回調(diào)方法,以處理服務(wù)生命周期的某些關(guān)鍵方面并提供一種機(jī)制將組件綁定到服務(wù)(如適用)。 應(yīng)重寫的最重要的回調(diào)方法包括:
onStartCommand()
onBind()
onCreate()
onDestroy()
如果組件通過調(diào)用 startService() 啟動(dòng)服務(wù)(這會(huì)導(dǎo)致對 onStartCommand() 的調(diào)用),則服務(wù)將一直運(yùn)行,直到服務(wù)使用 stopSelf() 自行停止運(yùn)行,或由其他組件通過調(diào)用 stopService() 停止它為止。
如果組件是通過調(diào)用 bindService() 來創(chuàng)建服務(wù)(且未調(diào)用 onStartCommand() ,則服務(wù)只會(huì)在該組件與其綁定時(shí)運(yùn)行。一旦該服務(wù)與所有客戶端之間的綁定全部取消,系統(tǒng)便會(huì)銷毀它。
如同 Activity(以及其他組件)一樣,您必須在應(yīng)用的清單文件中聲明所有服務(wù)。
要聲明服務(wù),請?zhí)砑? service 元素作為 application 元素的子元素。例如:
為了確保應(yīng)用的安全性, 請始終使用顯式 Intent 啟動(dòng)或綁定 Service,且不要為服務(wù)聲明 Intent 過濾器。 啟動(dòng)哪個(gè)服務(wù)存在一定的不確定性,而如果對這種不確定性的考量非常有必要,則可為服務(wù)提供 Intent 過濾器并從 Intent 中排除相應(yīng)的組件名稱,但隨后必須使用 setPackage() 方法設(shè)置 Intent 的軟件包,這樣可以充分消除目標(biāo)服務(wù)的不確定性。
此外,還可以通過添加 android:exported 屬性并將其設(shè)置為 "false" ,確保服務(wù)僅適用于您的應(yīng)用。這可以有效阻止其他應(yīng)用啟動(dòng)您的服務(wù),即便在使用顯式 Intent 時(shí)也如此
Service
IntentService
簡單地說,服務(wù)是一種即使用戶未與應(yīng)用交互也可在后臺(tái)運(yùn)行的組件。 因此,您應(yīng)僅在必要時(shí)才創(chuàng)建服務(wù)。
如需在主線程外部執(zhí)行工作,不過只是在用戶正在與應(yīng)用交互時(shí)才有此需要,則應(yīng)創(chuàng)建新線程而非服務(wù)。 例如,如果您只是想在 Activity 運(yùn)行的同時(shí)播放一些音樂,則可在 onCreate() 中創(chuàng)建線程,在 onStart() 中啟動(dòng)線程,然后在 onStop() 中停止線程。您還可以考慮使用 AsyncTask 或 HandlerThread,而非傳統(tǒng)的 Thread 類。
前臺(tái)服務(wù)被認(rèn)為是用戶主動(dòng)意識(shí)到的一種服務(wù),因此在內(nèi)存不足時(shí),系統(tǒng)也不會(huì)考慮將其終止。 前臺(tái)服務(wù)必須為狀態(tài)欄提供通知,放在“正在進(jìn)行”標(biāo)題下方,這意味著除非服務(wù)停止或從前臺(tái)移除,否則不能清除通知。
要請求讓服務(wù)運(yùn)行于前臺(tái),請調(diào)用 startForeground() 。此方法采用兩個(gè)參數(shù):唯一標(biāo)識(shí)通知的整型數(shù)和狀態(tài)欄的 Notification 。例如:
注意 :提供給 startForeground() 的整型 ID 不得為 0。
要從前臺(tái)移除服務(wù),請調(diào)用 stopForeground() 。此方法采用一個(gè)布爾值,指示是否也移除狀態(tài)欄通知。 此方法不會(huì)停止服務(wù)。 但是,如果您在服務(wù)正在前臺(tái)運(yùn)行時(shí)將其停止,則通知也會(huì)被移除。
與 Activity 類似,服務(wù)也擁有生命周期回調(diào)方法,您可以實(shí)現(xiàn)這些方法來監(jiān)控服務(wù)狀態(tài)的變化并適時(shí)執(zhí)行工作。 以下框架服務(wù)展示了每種生命周期方法:
注 :與 Activity 生命周期回調(diào)方法不同,您 不 需要調(diào)用這些回調(diào)方法的超類實(shí)現(xiàn)。
注 :盡管啟動(dòng)服務(wù)是通過調(diào)用 stopSelf() 或 stopService() 來停止,但是該服務(wù)并無相應(yīng)的回調(diào)(沒有 onStop() 回調(diào))。因此,除非服務(wù)綁定到客戶端,否則在服務(wù)停止時(shí),系統(tǒng)會(huì)將其銷毀 — onDestroy() 是接收到的唯一回調(diào)。
本文原文連接
Service是Android中的四大組件之一,它的級別和Activity差不多。只不過Service沒有頁面顯示,只能后臺(tái)運(yùn)行,可以和其他組件進(jìn)行交互。
Service的后臺(tái)運(yùn)行并不是子線程,是在主線程中進(jìn)行的,只是它沒有界面顯示。如果Service進(jìn)行了耗時(shí)操作同樣需要開啟子線程,否則會(huì)跟Activity一樣出現(xiàn)ANR問題(application not response–程序沒有響應(yīng))。
補(bǔ)充說明:
主線程的內(nèi)容包括UI和后臺(tái),只要程序中的UI或者后臺(tái)其中一個(gè)在跑,程序都算是在運(yùn)行狀態(tài)。
1,創(chuàng)建一個(gè)自己的TestService繼承Service
2,必須實(shí)現(xiàn)重寫其中的onBind方法,可以在里邊做各種操作,也可以接收傳遞過來的Intent的數(shù)據(jù)。
(在Android Studio中可以直接新建一個(gè)Service)
服務(wù)的注冊是四大組件中最簡單的一個(gè),一般只要設(shè)置name屬性就可以了。
1,startService()啟動(dòng)
(1)啟動(dòng)服務(wù)startService:onCerate(),onStart()
(2)停止服務(wù)stopService:onDestroy()
此方法啟動(dòng)服務(wù),服務(wù)如果未被創(chuàng)建,系統(tǒng)會(huì)先調(diào)用onCreate()方法,接著調(diào)用onStrat()方法。如果調(diào)用startService前服務(wù)已經(jīng)被啟動(dòng),多次調(diào)用啟動(dòng)方法,不會(huì)多次調(diào)用onCreate,但會(huì)導(dǎo)致多次調(diào)用onStrat。
2,bindService()啟動(dòng)
(1)綁定bindService:onCreate(),onBind()
(2)解除綁定unbindService:onUnbind()
(3)正常停止程序服務(wù)的方法是先接觸綁定unbindService,在停止服務(wù)stopService
綁定后調(diào)用stopService方法,這時(shí)候是不能停止服務(wù)的,如果這時(shí)再調(diào)用解綁unbindService,程序會(huì)先解綁,后停止服務(wù)。
用此方法啟動(dòng)服務(wù),在服務(wù)未被創(chuàng)建時(shí),會(huì)先調(diào)用onCreate(),接著調(diào)用onBind()方法,這時(shí)候調(diào)用者和服務(wù)綁定在一起,調(diào)用者退出,系統(tǒng)會(huì)先調(diào)用服務(wù)的onUnbind(),然后onDestroy()。如果調(diào)用bindService之前服務(wù)已經(jīng)被綁定,多次調(diào)用bindService并不會(huì)導(dǎo)致onCreate()和onBind()方法被多次調(diào)用。如果調(diào)用者想與正在綁定的服務(wù)解除綁定,可以調(diào)用unbindService()。
(1),onCerate()服務(wù)第一次被創(chuàng)建
(2),onStartComand()服務(wù)開始工作
(3),onBind()服務(wù)已經(jīng)綁定
(4),onUnBind()服務(wù)解綁
(5),onDestroy()服務(wù)已經(jīng)停止
普通的Service進(jìn)行耗時(shí)操作要?jiǎng)?chuàng)建一個(gè)線程去完成,因?yàn)閟ervice是在主線程運(yùn)行的,并且這個(gè)子線程完成工作要手動(dòng)停止 。IntentService是繼承了Service并處理起步請求的一個(gè)類,在IntentService內(nèi)有一個(gè)工作線程,來處理耗時(shí)操作,啟動(dòng)IntentService的方式和啟動(dòng)傳統(tǒng)的Service是一樣,當(dāng)任務(wù)執(zhí)行完成后,IntentService會(huì)自動(dòng)停止,而不需要我們?nèi)タ刂啤?/p>
可以啟動(dòng)多次IntentService,每一個(gè)耗時(shí)操作會(huì)以工作隊(duì)列的方式在IntentService的onHandleIntent回調(diào)方法中執(zhí)行,并且每次只會(huì)執(zhí)行一個(gè)工作線程,執(zhí)行完第一個(gè)再執(zhí)行第二個(gè),以此類推,而且,所有請求都在一個(gè)單線程中,不會(huì)阻塞主線程,同一時(shí)間只處理一個(gè)請求。
IntentService優(yōu)點(diǎn)
1,省去了在Service中開線程的麻煩
2,當(dāng)操作完成時(shí),不用手動(dòng)停止Service。IntentService是Service,但是比Service更智能。
前言
在Android經(jīng)常要實(shí)現(xiàn)定時(shí)服務(wù),定時(shí)某個(gè)時(shí)刻推送消息或者更新數(shù)據(jù)。比如需要在夜晚8:00-10:00之間,推送一條消息、彈窗、或者其他操作。
一般我們可能是開啟Service,在Service中使用AlarmManager,setRepeating定時(shí)請求,但是從API19起,并不能保證時(shí)效的準(zhǔn)確,在5.0以后,Google推出了一個(gè)JobService,用來執(zhí)行一些并非即時(shí)執(zhí)行的后臺(tái)進(jìn)程。
使用
在JobService中有兩個(gè)抽象方法onStartJob(JobParameters)和onStopJob(JobParameters)。onStartJob在JobService被調(diào)度到的時(shí)候會(huì)執(zhí)行,我們只需要繼承JobService然后重寫onStartJob方法,并在里面執(zhí)行我們的后臺(tái)任務(wù)就可以了。
This service executes each incoming job on a Handler running on your application's
main thread. This means that you must offload your execution logic to another
thread/handler/AsyncTask of your choosing. Not doing so will result in blocking any
future callbacks from the JobManager - specifically onStopJob(android.app.job.JobParameters), which is meant to inform you that the
scheduling requirements are no longer being met.
即:JobService默認(rèn)在主線程中處理傳入的每個(gè)操作,這意味著,你必須開一個(gè)新線
程來執(zhí)行你的耗時(shí)操作,如果不這樣操作,將會(huì)阻塞來自JobManager的任何操作,特別是onStopJob操作
在Activity中,啟動(dòng)服務(wù)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (Build.VERSION.SDK_INT = Build.VERSION_CODES.LOLLIPOP) {
doService();
}
}
例子里可以看到,一共有五個(gè)條件,
如果我們的后臺(tái)任務(wù)滿足JobService的一個(gè)或多個(gè)約束條件,就可以考慮是不是應(yīng)該用JobService來執(zhí)行。
文章標(biāo)題:android中service的實(shí)現(xiàn)方法,android service組件的功能
瀏覽路徑:http://jinyejixie.com/article26/dsdigjg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、定制網(wǎng)站、標(biāo)簽優(yōu)化、外貿(mào)網(wǎng)站建設(shè)、商城網(wǎng)站、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)