關於service面試詳解

大家好,今天我來給大家講解一下在安卓面試當中有關service的面試問題,我把自己的理解寫出來,可能有不足的地方,多加體諒

一、service的應用場景,以及和Thread的區別

一.service基礎

1.service是什麼?

service在安卓裏面,作爲四大組件之一,它扮演着非常重要的角色,它可以在後臺處理一些耗時的邏輯,或者你可以用它去執行一些需要長時間運行的任務,可以在後臺開啓.必要的時候,我們甚至可以在程序退出的時候,仍能讓service在後臺繼續保持運行狀態,這就是我們這些年聽到的service保活.

所以說:Service(服務)是一個一種可以在後天執行長時間運行操作而沒有用戶界面的應用組件

注:service 可以由其他應用組件,比如說activity等等來啓動,服務一旦被啓動後,都將在後臺一直運行,即使啓動它的activity以及被銷燬了,也不會受到影響.另外你也可以把Service綁定到activity,然後可以讓activity和service直接進行數據交互.甚至由於service和activity有可能是在不同的進程裏面,你也可以通過進程間通信,來進行數據之間的傳輸.我們需要注意的是,service和廣播Broadcast有一個共同點,就是他們都是運行在主線程當中,所以說在這個裏面都不能做長時間的耗時操作,這裏必須特別注意一下.還有一點:service裏面不能做耗時操作,一定要記住.

2.service和Thread的區別

一.定義

首先我們來看Thread,它是程序執行的最小單元所以說你可以用它來執行一些異步操作.而service是安卓的一種機制,當它運行的時候,如果它是本地的service,那麼它對應的service是運行在主線程上的,也就是說Thread運行是相對獨立的,而service運行,它是依託於它所在的主線程上面,相比Thread,service並不是這麼獨立.

這是一點.Service是運行在主線程裏面的,絕對不能做執行耗時操作,在這裏強調一下,大家不能把後臺和子線程聯繫在一起,這是兩個完全不同的概念,服務和後臺也是兩個不同的概念,安卓的後臺指的是,它的運行完全不依賴於UI線程,即使Activity被銷燬了,程序被關閉了,服務進程仍然存在,它會在後臺進行一些計算,進行一些數據統計。這時候service仍然可以繼續運作。既然我們知道了service是不可以做耗時操作的,你如果一定要做耗時操作,在service裏面,你也一定要創建子線程,然後在這裏做耗時操作邏輯,既然在service裏面也要創建一個子線程,那麼爲什麼不直接在activity裏面直接創建呢?因爲activity很難以對子線程進行控制,特別是當activity被銷燬的之後,你沒有任何其它辦法可以再獲取之前創建的子線程實例,這是非常重要的一點。而service處理後臺任務,activity就可以很放心的摧毀啊,finish掉,完全不用擔心,無法對後臺進行控制情況。

總結一下service和Thread之間的區別:

首先第一點,定義上,thread是程序執行的最小單元,他是分配cpu的基本單位,安卓系統中,我們常說的主線程,UI線程,也是線程的一種,當然,線程裏面還可以執行一些耗時的異步操作。而service大家記住,它是安卓中的一種特殊機制,service是運行在主線程當中的,所以說它不能做耗時操作,它是由系統進程託管,其實service也是一種輕量級的IPC通信,因爲activity可以和service綁定,可以和service進行數據通信,而且又一種情況,activity和service是處於不同的進程當中,所以說它們之間的數據通信,要通過IPC進程間通信的機制來進行操作。

第二點是在實際開發的過程當中,在安卓系統當中,線程一般指的是工作線程,就是後臺線程,做一些耗時操作的線程,而主線程是一種特殊的線程,它只是負責處理一些UI線程的繪製,UI線程裏面絕對不能做耗時操作,這裏是最基本最重要的一點。(這是Thread在實際開發過程當中的應用)而service是安卓當中,四大組件之一,一般情況下也是運行在主線程當中,因此service也是不可以做耗時操作的,否則系統會報ANR異常(ANR全稱:Application Not Responding),就是程序無法做出響應。如果一定要在service裏面進行耗時操作,一定要記得開啓單獨的線程去做。

第三點,應用場景上,當你需要執行耗時的網絡,或者這種文件數據的查詢,以及其它阻塞UI線程的時候,都應該使用工作線程,也就是開啓一個子線程的方式,這樣才能保證UI線程不被佔用,而影響用戶體驗。而service來說,我們經常需要長時間在後臺運行,而且不需要進行交互的情況下才會使用到服務,比如說,我們在後臺播放音樂,開啓天氣預報的統計,還有一些數據的統計等等。

二、開啓service的兩種方式以及區別

1.startservice 

你通過Activity調用startservice啓動服務的時候,這個服務就一直處於啓動狀態,而一旦,這個服務開啓啓動,這個服務就會在後臺無限期的運行,這時候如果你的activity被銷燬了,也對它的service運行不受影響,除非你手動的去關閉這個service,這樣service纔會停止.

1.定義一個類繼承Service

2.在Manifest.XML文件中配置該Service

3.使用Context的startService(Intent)方法啓動該Service

4.不再使用時,調用stopService(Intent)方法停止該服務

2.bindService

你綁定服務的時候,服務和activity已經處於綁定狀態了,綁定服務,他提供了一個客戶端和一個服務端的接口,相當於Activity和service進行交互的接口,它允許客戶端和service進行數據交互啊,發送請求獲取結果等等,甚至如果service,activity在不同進程當中的 時候,可以進行進程間的通信,來傳輸數據,這僅僅要在service綁定到Activity之後才能運行,同時你多個Activity可以綁定一個service,但是,如果全部取消之後,這個服務會自動被銷燬,它並不一定像startservice裏面一樣,調用stopservice才能被銷燬.

我們來看一下啓動方式:

1.創建BindService服務端,繼承自Service並在類中,創建一個實現IBinder接口的實例對象並提供公共方法給客戶端回調

2.從onBind()回調方法返回此Binder實例.

3.在客戶端中,從onServiceConnected()回調方法接收Binder,並使用提供的方法調用綁定服務.(注:客戶端指的是Activity,服務端指的是service)

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章