1、Service 是否在 main thread 中執行, service 裡面是否能執行耗時的操作?預設情況,如果沒有顯示的指 servic 所運行的進程, Service 和 activity 是運行在當前 app 所在進程的 main thread(UI 主線程)裡面。service 裡面不 ...
1、Service 是否在 main thread 中執行, service 裡面是否能執行耗時的操作?
預設情況,如果沒有顯示的指 servic 所運行的進程, Service 和 activity 是運行在當前 app 所在進程的 main thread(UI 主線程)裡面。
service 裡面不能執行耗時的操作(網路請求,拷貝資料庫,大文件 )特殊情況 ,可以在清單文件配置 service 執行所在的進程 ,讓 service 在另外的進程中執行
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service>
2、Activity 怎麼和 Service 綁定,怎麼在 Activity 中啟動自己對應的Service?
Activity 通過 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 進行綁定,當綁定成功的時候 Service 會將代理對象通過回調的形式傳給 conn,這樣我們就拿到了Service 提供的服務代理對象。
在 Activity 中可以通過 startService 和 bindService 方法啟動 Service。一般情況下如果想獲取Service 的服務對象那麼肯定需要通過 bindService()方法,比如音樂播放器,第三方支付等。如果僅僅只是為了開啟一個後臺任務那麼可以使用 startService()方法。
3、請描述一下 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進行通信。
客戶可以通過 unbindService()方法來關閉這種連接。一個service可以同時和多個客戶綁定,當多個客戶都解除綁定之後,系統會銷毀service。
這兩條路徑並不是完全分開的。即是說,你可以和一個已經調用了 startService()而被開啟的service進行綁定。
比如,一個後臺音樂service可能因調用 startService()方法而被開啟了,稍後,可能用戶想要控制播放器或者得到一些當前歌曲的信息,可以通過bindService()將一個activity和service綁定。這種情況下,stopService()或 stopSelf()實際上並不能停止這個service,除非所有的客戶都解除綁定。
Service 的生命周期圖如下所示,幫助記憶
4、什麼是 IntentService?有何優點?
我們通常只會使用 Service,可能 IntentService 對大部分同學來說都是第一次聽說。那麼看了下麵的介紹相信你就不再陌生了。 如果你還是不瞭解那麼在面試的時候你就坦誠說沒用過或者不瞭解等。並不是所有的問題都需要回答上來的。
一、IntentService 簡介
IntentService 是 Service 的子類,比普通的 Service 增加了額外的功能。先看 Service 本身存在兩個問題:
Service 不會專門啟動一條單獨的進程,Service 與它所在應用位於同一個進程中;Service 也不是專門一條新線程,因此不應該在 Service 中直接處理耗時的任務;
二、IntentService 特征
會創建獨立的 worker 線程來處理所有的 Intent 請求;
會創建獨立的 worker 線程來處理 onHandleIntent()方法實現的代碼,無需處理多線程問題;所有請求處理完成後,IntentService 會自動停止,無需調用 stopSelf()方法停止 Service;為 Service 的 onBind()提供預設實現,返回 null;為 Service 的 onStartCommand 提供預設實現,將請求 Intent 添加到隊列中;
5、說說 Activity、Intent、Service 是什麼關係
他們都是 Android 開發中使用頻率最高的類。其中 Activity 和 Service 都是 Android 四大組件之一。他倆都是 Context 類的子類 ContextWrapper 的子類,因此他倆可以算是兄弟關係吧。不過兄弟倆各有各自的本領, Activity 負責用戶界面的顯示和交互, Service 負責後臺任務的處理。 Activity和 Service 之間可以通過 Intent 傳遞數據,因此可以把 Intent 看作是通信使者。
6、Service 和 Activity 在同一個線程嗎
對於同一 app 來說預設情況下是在同一個線程中的,main Thread (UI Thread)。
7、Service 裡面可以彈吐司麽
可以的。彈吐司有個條件就是得有一個 Context 上下文,而 Service 本身就是 Context 的子類,因此在 Service 裡面彈吐司是完全可以的。比如我們在 Service 中完成下載任務後可以彈一個吐司通知用戶。
8、什麼是 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 的話會拋出異常。
9、在 service 的生命周期方法 onstartConmand()可不可以執行網路操作?如何在 service 中執行網路操作?
可以直接在 Service 中執行網路操作,在 onStartCommand()方法中可以執行網路操作