一、Service 是否在 main thread 中執行, service 裏面是否能執行耗時的操做?
默認狀況,若是沒有顯示的指 servic 所運行的進程, Service 和 activity 是運行在當前 app 所在進程的 main thread(UI 主線程)裏面。
service 裏面不能執行耗時的操做(網絡請求,拷貝數據庫,大文件 )特殊狀況 ,能夠在清單文件配置 service 執行所在的進程 ,讓 service 在另外的進程中執行android
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service>
二、Activity 怎麼和 Service 綁定,怎麼在 Activity 中啓動本身對應的Service?
Activity 經過 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 進行綁定,當綁定成功的時候 Service 會將代理對象經過回調的形式傳給 conn,這樣咱們就拿到了Service 提供的服務代理對象。
在 Activity 中能夠經過 startService 和 bindService 方法啓動 Service。通常狀況下若是想獲取Service 的服務對象那麼確定須要經過 bindService()方法,好比音樂播放器,第三方支付等。若是僅僅只是爲了開啓一個後臺任務那麼可使用 startService()方法。面試
三、請描述一下 Service 的生命週期
Service 有綁定模式和非綁定模式,以及這兩種模式的混合使用方式。不一樣的使用方法生命週期方法也不一樣。
非綁定模式:當第一次調用 startService 的時候執行的方法依次爲 onCreate() 、onStartCommand(),當 Service 關閉的時候調用 onDestory 方法。
綁定模式:第一次 bindService()的時候,執行的方法爲 onCreate()、onBind()解除綁定的時候會執行 onUnbind()、onDestory()。數據庫
service的生命週期,從它被建立開始,到它被銷燬爲止,能夠有兩條不一樣的路徑:網絡
A started service:被開啓的service經過其餘組件調用 startService()被建立。這種service能夠無限地運行下去,必須調用stopSelf()方法或者其餘組件調用stopService()方法來中止它。當service被中止時,系統會銷燬它。多線程
A bound service:被綁定的service是當其餘組件(一個客戶)調用bindService()來建立的。客戶能夠經過一個IBinder接口和service進行通訊。app
客戶能夠經過 unbindService()方法來關閉這種鏈接。一個service能夠同時和多個客戶綁定,當多個客戶都解除綁定以後,系統會銷燬service。spa
這兩條路徑並非徹底分開的。便是說,你能夠和一個已經調用了 startService()而被開啓的service進行綁定。線程
好比,一個後臺音樂service可能因調用 startService()方法而被開啓了,稍後,可能用戶想要控制播放器或者獲得一些當前歌曲的信息,能夠經過bindService()將一個activity和service綁定。這種狀況下,stopService()或 stopSelf()實際上並不能中止這個service,除非全部的客戶都解除綁定。代理
Service 的生命週期圖以下所示,幫助記憶code
四、什麼是 IntentService?有何優勢?
咱們一般只會使用 Service,可能 IntentService 對大部分同窗來講都是第一次據說。那麼看了下面的介紹相信你就再也不陌生了。 若是你仍是不瞭解那麼在面試的時候你就坦誠說沒用過或者不瞭解等。並非全部的問題都須要回答上來的。
1、IntentService 簡介
IntentService 是 Service 的子類,比普通的 Service 增長了額外的功能。先看 Service 自己存在兩個問題:
Service 不會專門啓動一條單獨的進程,Service 與它所在應用位於同一個進程中;Service 也不是專門一條新線程,所以不該該在 Service 中直接處理耗時的任務;
2、IntentService 特徵
會建立獨立的 worker 線程來處理全部的 Intent 請求;
會建立獨立的 worker 線程來處理 onHandleIntent()方法實現的代碼,無需處理多線程問題;全部請求處理完成後,IntentService 會自動中止,無需調用 stopSelf()方法中止 Service;爲 Service 的 onBind()提供默認實現,返回 null;爲 Service 的 onStartCommand 提供默認實現,將請求 Intent 添加到隊列中;
五、說說 Activity、Intent、Service 是什麼關係
他們都是 Android 開發中使用頻率最高的類。其中 Activity 和 Service 都是 Android 四大組件之一。他倆都是 Context 類的子類 ContextWrapper 的子類,所以他倆能夠算是兄弟關係吧。不過兄弟倆各有各自的本領, Activity 負責用戶界面的顯示和交互, Service 負責後臺任務的處理。 Activity和 Service 之間能夠經過 Intent 傳遞數據,所以能夠把 Intent 看做是通訊使者。
六、Service 和 Activity 在同一個線程嗎
對於同一 app 來講默認狀況下是在同一個線程中的,main Thread (UI Thread)。
七、Service 裏面能夠彈吐司麼
能夠的。彈吐司有個條件就是得有一個 Context 上下文,而 Service 自己就是 Context 的子類,所以在 Service 裏面彈吐司是徹底能夠的。好比咱們在 Service 中完成下載任務後能夠彈一個吐司通知用戶。
八、什麼是 Service 以及描述下它的生命週期。Service 有哪些啓動方法,有什麼區別,怎樣停用 Service?
在 Service 的生命週期中,被回調的方法比 Activity 少一些,只有 onCreate, onStart, onDestroy,onBind 和 onUnbind。
一般有兩種方式啓動一個 Service,他們對 Service 生命週期的影響是不同的。
1. 經過 startService
Service 會經歷 onCreate 到 onStart, 而後處於運行狀態, stopService 的時候調用 onDestroy方法。若是是調用者本身直接退出而沒有調用 stopService 的話,Service 會一直在後臺運行。
2. 經過 bindService
Service 會運行 onCreate,而後是調用 onBind, 這個時候調用者和 Service 綁定在一塊兒。調用者退出了,Srevice 就會調用 onUnbind->onDestroyed 方法。
所謂綁定在一塊兒就共存亡了。調用者也能夠經過調用 unbindService 方法來中止服務,這時候Srevice 就會調用 onUnbind->onDestroyed 方法。
須要注意的是若是這幾個方法交織在一塊兒的話,會出現什麼狀況呢?一個原則是 Service 的 onCreate 的方法只會被調用一次,就是你不管多少次的 startService 又bindService,Service 只被建立一次。
若是先是 bind 了, 那麼 start 的時候就直接運行 Service 的 onStart 方法, 若是先是 start, 那麼 bind的時候就直接運行 onBind 方法。
若是 service 運行期間調用了 bindService,這時候再調用 stopService 的話,service 是不會調用onDestroy 方法的,service 就 stop 不掉了,只能調用 UnbindService, service 就會被銷燬若是一個 service 經過 startService 被 start 以後,屢次調用 startService 的話,service 會屢次調用 onStart 方法。屢次調用 stopService 的話,service 只會調用一次 onDestroyed 方法。
若是一個 service 經過 bindService 被 start 以後,屢次調用 bindService 的話,service 只會調用一次 onBind 方法。屢次調用 unbindService 的話會拋出異常。
九、在 service 的生命週期方法 onstartConmand()可不能夠執行網絡操做?如何在 service 中執行網絡操做?
能夠直接在 Service 中執行網絡操做,在 onStartCommand()方法中能夠執行網絡操做