Android面试题之Service篇
Service篇目錄
- 前言
- 二、Service
- 1.Activity 怎么和 Service 綁定,怎么在 Activity 中啟動自己對應的Service?
- 2.描述一下 Service 的生命周期
- 3.Activity、Intent、Service 是什么關系
- 4.Service 是否在 main thread 中執行, service 里面是否能執行耗時的操作?
- 5.Service 和 Activity 在同一個線程嗎
- 6.Service 里面可以彈吐司么?
- 7.在 service 的生命周期方法 onstartConmand()可不可以執行網絡操作?
- 8.什么是 Service 以及描述下它的生命周期。Service 有哪些啟動方法,有什么區別,怎樣停用 Service?
- 9.什么是 IntentService?有何優點?
- 關于整理問題
前言
秋招在即,計蒙準備在國慶假期結束前整理一套Android初級面試題籍,希望對大家有所幫助
提示:以下是本篇文章正文內容
二、Service
1.Activity 怎么和 Service 綁定,怎么在 Activity 中啟動自己對應的Service?
Activity 通過 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 進行綁定,當綁定成功的時候 Service 會將代理對象通過回調的形式傳給 conn,這樣我們就拿到了Service 提供的服務代理對象。
在 Activity 中可以通過 startService 和 bindService 方法啟動 Service。一般情況下如果想獲取Service 的服務對象那么肯定需要通過 bindService()方法,比如音樂播放器,第三方支付等。如果僅僅只是為了開啟一個后臺任務那么可以使用 startService()方法。
2.描述一下 Service 的生命周期
Service 有綁定模式和非綁定模式,以及這兩種模式的混合使用方式。不同的使用方法生命周期方法也不同。
- 非綁定模式:當第一次調用 startService 的時候執行的方法依次為 onCreate() 、onStartCommand(),當Service 關閉的時候調用 onDestory 方法。
- 綁定模式:第一次 bindService()的時候,執行的方法為 onCreate()、onBind()解除綁定的時候會執行onUnbind()、onDestory()。
上面的兩種生命周期是在相對單純的模式下的情形。我們在開發的過程中還必須注意 Service 實例只會有一個,也就是說如果當前要啟動的 Service 已經存在了那么就不會再次創建該 Service 當然也不會調用 onCreate()方法。
一個 Service 可以被多個客戶進行綁定,只有所有的綁定對象都執行了 onBind()方法后該Service 才會銷毀,不過如果有一個客戶執行了 onStart()方法,那么這個時候如果所有的 bind 客戶都執行了 unBind()該 Service 也不會銷毀。
3.Activity、Intent、Service 是什么關系
他們都是 Android 開發中使用頻率最高的類。其中 Activity 和 Service 都是 Android 四大組件之一。他倆都是 Context 類的子類ContextWrapper 的子類, 因此他倆可以算是兄弟關系。
- Activity 負責用戶界面的顯示和交互
- Service 負責后臺任務的處理。
Activity 和 Service 之間可 以通過 Intent 傳遞數據,因此可以把 Intent 看作是通信使者。
4.Service 是否在 main thread 中執行, service 里面是否能執行耗時的操作?
- 默認情況,如果沒有顯示的指 servic 所運行的進程, Service 和 activity 是運行在當前 app 所在進程的 main thread(UI 主線程)里面。service 里面不能執行耗時的操作(網絡請求,拷貝數據庫,大文件)
特殊情況 ,可以在清單文件配置 service 執行所在的進程 ,讓 service 在另外的進程中執行
<serviceandroid:name="com.baidu.location.f"android:enabled="true" android:process=":remote" ></service>5.Service 和 Activity 在同一個線程嗎
對于同一 app 來說默認情況下是在同一個線程中的,main Thread (UI Thread)。
6.Service 里面可以彈吐司么?
可以的。彈吐司有個條件就是得有一個 Context 上下文,而 Service 本身就是 Context 的子類,因此在 Service 里面彈吐司是完全可以的。比如我們在 Service 中完成下載任務后可以彈一個吐司通知用戶。
7.在 service 的生命周期方法 onstartConmand()可不可以執行網絡操作?
可以直接在 Service 中執行網絡操作,在 onStartCommand()方法中可以執行網絡操作
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.什么是 IntentService?有何優點?
IntentService 是 Service 的子類,比普通的 Service 增加了額外的功能。
先看 Service 本身存在兩個問題:
- .Service 不會專門啟動一條單獨的進程,Service 與它所在應用位于同一個進程中;
- Service 也不是專門一條新線程,因此不應該在 Service 中直接處理耗時的任務;
IntentService 特征
-
會創建獨立的 worker 線程來處理所有的 Intent 請求;
-
會創建獨立的 worker 線程來處理 onHandleIntent()方法實現的代碼,無需處理多線程問題;
-
所有請求處理完成后,IntentService 會自動停止,無需調用 stopSelf()方法停止 Service;
-
為Service 的 onBind()提供默認實現,返回 null;
-
為Service 的 onStartCommand 提供默認實現,將請求 Intent 添加到隊列中;
關于整理問題
當全部整理完畢后將整理成pdf格式,以方便閱讀,文件獲取如下圖(10月8日后)
總結
以上是生活随笔為你收集整理的Android面试题之Service篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arm-linux-gcc反汇编(分析方
- 下一篇: Android相关面试题