您好,登錄后才能下訂單哦!
首先,我們來看看service的英文翻譯: 服務(wù)(名詞) 、服務(wù)性的(形容詞)。在android中service是如何解釋的呢,下面是google的原文翻譯:A Service
is an application component that can perform long-running operations in the background and does not provide a user interface. Another application component can start a service and it will continue to run in the background even if the user switches to another application. Additionally, a component can bind to a service to interact with it and even perform interprocess communication (IPC).
從上面的說明就可以知道service是什么了、是做什么的、可以做什么,其主要特點(diǎn)有一下幾個(gè)方面:
(1):Service 是一個(gè)APP的component 。
(2):service 運(yùn)行在后臺(tái)的(in the background)、并且沒有用戶接口的。
(3):一個(gè)app的service 可以在該app退出時(shí),仍然在后臺(tái)正常運(yùn)行。
(4):還有就是,一個(gè)service也可以和一個(gè)組件(activity)綁定,并可以進(jìn)行進(jìn)程間通信。
通過google的描述,我們基本上說明白Service。現(xiàn)在我們來看,Service到底是一個(gè)什么東西:
首先,我們來看Service.java里面Service的定義:
public abstract class Service extends ContextWrapper implements ComponentCallbacks2 { ... }
看到這里,估計(jì)你會(huì)恍然大悟,原來也是一個(gè)Context子類。我們知道,Activity一樣也是一個(gè)Context子類。
所以,其實(shí)從某種意義上來講Service和Activity本質(zhì)是一樣的。相對(duì)于Service來說,Activity只是還封裝了一些與界面顯示相關(guān)的方法和數(shù)據(jù)、以及實(shí)現(xiàn)了用戶與app交流的一些像是按鍵事件處理、窗口信息等這樣一類方法。因?yàn)?,一個(gè)service根本沒有可供前臺(tái)顯示、與用戶交流的能力,所以可以理解我service是運(yùn)行在后來的(Runing in the background)。
所以,對(duì)于Service來說,一個(gè)Activity用于處理需要能夠與用戶直接交流的工作。相對(duì)于Activity來說,一個(gè)Service主要用于處理不需要與用戶直接交流的工作,比如播放音樂(當(dāng)我們推出音樂播放器的時(shí)候,音樂仍然還在播放,這里播放這個(gè)音樂就是用一個(gè)service來做的)。
如何啟動(dòng)一個(gè)Service呢?Context中有啟動(dòng)、停止Service的方法,所以Activity和Service都是可以啟動(dòng)和停止一個(gè)Service。我們來看看Context中有啟動(dòng)、停止Service的方法(其具體的方法實(shí)現(xiàn),在ContextImpl.java里):
public abstract ComponentName startService(Intent service);
public abstract boolean stopService(Intent service);
public abstract boolean bindService(Intent service, ServiceConnection conn,int flags);
public boolean bindService(Intent service, ServiceConnection conn, int flags, int userHandle) { throw new RuntimeException("Not implemented. Must override in a subclass."); }
public abstract void unbindService(ServiceConnection conn);
由此可見,啟動(dòng)一個(gè)Service其實(shí)有兩種:Start和Bind。有什么區(qū)別呢?
我們還是來看看google如何解釋stopService的:
Using startService() overrides the default service lifetime that is managed by {@link #bindService}: it requires the service to remain running until {@link #stopService} is called, regardless of whether any clients are connected to it.
下面看看google如何解釋bindService的:
This defines a dependency between your application and the service.
The service will be considered required by the system only for as long as the calling context exists.
(1):從上面的解釋可以知道,用startService()來啟動(dòng)一個(gè)Service, 該啟動(dòng)的service不依賴于這個(gè)啟動(dòng)他的app(Activity或者Service),幾乎可以說和啟動(dòng)這個(gè)Service的Component沒有其他關(guān)聯(lián),一般情況下,除非調(diào)用stopService()來停止這個(gè)Service,否則這個(gè)Service是不會(huì)因?yàn)槠渌虮黄萐top的,當(dāng)然這里說的也只是一般情況,往往還有一些特殊情況,如下google的解釋:
The only time they should be stopped is if the current foreground application is using so many resources that the service needs to be killed.
很顯然這是一種特殊情況。只要我們知道,一般情況下系統(tǒng)會(huì)盡量讓Startservice啟動(dòng)的Service保持運(yùn)行狀態(tài)的,除非stopService()方式來停止這個(gè)Service。
(2):相比startService()來啟動(dòng)一個(gè)Service, BindService()啟動(dòng)一個(gè)Service就不一樣了,從上面的google的意思可以知道:BindService()方式啟動(dòng)的Service和啟動(dòng)他的app是相互依賴的,其實(shí)更多的是這個(gè)Service依賴于這個(gè)APP。實(shí)際上android系統(tǒng)是這樣覺得的:對(duì)于啟動(dòng)這個(gè)Service的Component(Activity/Service),如果這個(gè)Component(Activity/Service)都不存在了,那么這個(gè)被他啟動(dòng)的Service也是沒有必要保留的。
下面我們來看看Service的一個(gè)方法:public void onCreate()。這個(gè)方法在一個(gè)service實(shí)例化的時(shí)候才會(huì)調(diào)用,只要這個(gè)Service已經(jīng)實(shí)例化了,這個(gè)函數(shù)當(dāng)然就不可能再調(diào)用了。startService()和BindService()于其不一樣,他們可以重復(fù)調(diào)用的。
我們?cè)賮碚f一下Service這個(gè)函數(shù)public void onDestroy()。這個(gè)函數(shù)不是我們?nèi)フ{(diào)用的,主要是系統(tǒng)來要清除一個(gè)他認(rèn)為無效的Service的時(shí)候調(diào)用的。
接下來,要說最后一個(gè)問題:看到有人在網(wǎng)上問,既然Service是在后臺(tái)運(yùn)行的,那和定義一個(gè)Thread來來做這些工作有是不是是一樣的呢? 回答當(dāng)然是否定的,而且根本是風(fēng)牛馬不相及,下面一點(diǎn)點(diǎn)來解釋:
上面我們說了,其實(shí)一個(gè)Service和Activity一樣,都是一個(gè)context的子類,本質(zhì)上說其實(shí)是一樣的。我們知道,一個(gè)APP運(yùn)行在自己的進(jìn)程中,該進(jìn)程的有一個(gè)所謂的主線程(UI線程),其Activity的所有的動(dòng)作都是在這個(gè)主線程運(yùn)行的,比如布局、ImageView等組件繪制、按鍵事件、以及啟動(dòng)一個(gè)Activity等都是在這個(gè)主線程完成的。上面說了,Service和Activity本質(zhì)一樣的,所以其實(shí)一個(gè)Service所有的工作也都是在這個(gè)主線程完成的,他和Activity一樣,也是可以自己啟動(dòng)一個(gè)獨(dú)立的線程來處理其他事情的,以免阻塞了主線程!所以Service和Thread根本不是一回事!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。