Service類

       Service類簡介:

  一個Service是一個應用組件代表一個應用想要在不和用戶交互的前提,去執行一個很長時間的操作。或者是提供功能給其他的應用去使用。每一個Service類必需有一個相符合<service>的聲明在它自己的包AndroidManifest.xml中。Service能夠開始執行通過Context.startService()和Context.bindService().

      注意:這些Services,像其他的應用對象一樣,運行在它們自己的宿主的進程的主線程裏。這個意思就是,如果你的service即將讓CPU高速運行,或者是阻止操作,它會在其自己的線程去做這項工作。這個IntentService類是一個可以被利用的去實現Service在其自己的計劃裏去工作。

  

1.什麼是Service?

   大多數的疑惑在這個Service類裏面,事實在它有很多不是。

(1).一個Service它不是一個可分離的進程。Service對象它自己沒有實現運行在它自己的進程,除非特指,它運行在一個相同的進程裏作爲一個應用的一部分。

(2).一個Service不是一個線程,它不是這個意思,它自己不會工作在主線程裏(去避免應用長時間沒有響應的的錯誤)

因此一個Service它自己是事實上是非常簡單的,提供了兩個主要的特點。

(1).一個應用的一個設備,去告訴系統它想要在後臺做什麼(即使用戶不直接和這個應用交互的時候),爲了響應調用Context.startService(),這要求系統的工作安排,直到這個服務被明確的停止。

(2).一個應用的一個設備,去暴露自己的功能給其他的應用程序。爲了響應這個調用Context.bindService(),它允許一個長期的連接是爲了服務與它進行交互。

當一個服務組件被創造的,其中一個原因,其實系統實例化組件並調用它的oncreate()和主線程上其他任何適當的回調。它是由服務實現這些與適當的行爲,如創建輔助線程,它的工作。

注意 :因爲Service它自己是如此簡單的,你可以儘可能簡單地與它交互,或者是完成你自己想做的。視它爲一個本地Java對象你做出直接的方法調用(由當地服務的示例如圖所示),提供全remoteable使用AIDL接口。

2.Service的生命週期

這裏有兩個原因,一個Service能夠被系統運行,如果有人調用Context.startService(),然後系統將會取得這個Service(如果需要的話,創建它並且調用它的onCreate()方法),然後調用它的onStartCommand(Intent,int,int)方法將會帶有從客戶端提供的參數。這個Service一直會運行,直到Context.oStop()或者stopSelf()被調用。注意:多次調用Context.startServcie()並不會nest(儘管他們在onstartcommand()對應的多個調用結果),所以不管多少次開啓一個Service將會停止Context.stop()或者stopSelf();然而,services能使用它的stopSelft(int) method去確定service沒有被停止直到在進程中開啓。


開啓服務,有兩個主要操作模式,它們可以決定運行,取決於他們onStartCommand()的返回值,start_stickly用於知道什麼時候開始服務和停止服務,而start_not_sticky或者start_redeliver_intent是被使用給services僅僅保留正在運行,當把一些命令發給他們的時候。


客戶端能夠使用Context.bindService()去獲得一個持久化的和Service的一個連接,這個同樣地創建service,如果它沒有運行(調用 onCreate()當這麼做的時候),但是不會調用onStartCommand().客戶端會付取得一個IBinder對象,以致於這個Service能夠返回從它的onBinder(Intent)方法,允許這個客戶端去回調這個service,這個service將會保留運行和connection建立一樣長的時間(不管客戶端持有一個引用在service的IBinder).通常這個IBinder爲一個已經寫了aidl的複雜接口返回。


一個service能開始並且和它的連接綁定。在一個例子中,這個系統將會保持這個service開始或者它們是一個或多個連接和它,用Context.BIND_AUTO_CREATE標誌。一旦這個狀態被持有,這個services的onDestroy方法被調用並且這個services被有效地中止。所有的清理(停止線程,解除註冊接收器)應該是完整的ondestroy()回來時。


3.權限

當它被聲明在它自己的mainfest的<service>標籤,全局訪問一個service是能夠強制的。通過這樣做,其他的應用將會需要去聲明一個相符合<user-permission>的元素在它自己的mainfest去開始、停止、或者綁定到這個service作爲一個薑餅(android 2.3版本),當使用Context.startService(Intent),你也能設置Intent.FLAG_GRANT_READ_URI_PERMISSION 與/或 Intent.FLAG_GRANT_WRITE_URI_PERMISSION在這個Intent上。這個將會授予這個service臨時訪問這個指定的uris在這個Intent上。訪問將會留下直到services已經調用stopSelf(int)對於開始命令或者之後,或者直到services已經完成停止。這個工作對於授予訪問其他的應用,並不需要權限去保護這個service,即使當這個service一點也沒有暴露暴露。


另外,一個service能夠被獨立的IPC保護。通過調用這個checkCallingPermission(String)方法在執行這個實現之前。



4.流程生命週期


Android系統會試圖保持過程託管服務周圍只要服務已開始或已綁定到它的客戶。運行時內存不足和需要殺死現有的過程,一個過程的託管服務的優先級將以下的可能性更高:

如果該服務目前在其oncreate(),執行代碼onstartcommand(),或ondestroy()方法,然後宿主進程將是一個前景過程中確保此代碼可以執行不被殺的。




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