Android 面試題--Service,android--service

來源:互聯網
上載者:User

Android 面試題--Service,android--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()方法中可以執行網路操作

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.