Android 四大組件之 Service(一)

      Service是Android中四大組件之一,在Android開發中起到很是重要的做用,它運行在後臺,不與用戶進行交互。java

一、Service的繼承關係:android

java.lang.Object → android.content.Context → android.content.ContextWrapper → android.app.Service網絡

二、Sevice定義:app

     Service(服務)是一個沒有用戶界面的在後臺運行執行耗時操做的應用組件。其餘應用組件可以啓動Service,而且當用戶切換到另外的應用場景,Service將持續在後臺運行。另外,一個組件可以綁定到一個service與之交互(IPC機制),例如,一個service可能會處理網絡操做,播放音樂,操做文件I/O或者與內容提供者(content provider)交互,全部這些活動都是在後臺進行。異步

三、Service有兩種狀態," 啓動的 " 和 " 綁定 ":ide

[1]經過startService()啓動的服務處於" 啓動的 "狀態,一旦啓動,service就在後臺運行,即便啓動它的應用組件已經被銷燬了。一般started狀態的service執行的任務而且不返回任何結果給啓動者。好比當下載或上傳一個文件,當這項操做完成時,service應該中止它自己。函數

[2]" 綁定 "狀態:經過調用bindService()來啓動,一個綁定的service提供一個容許組件與service交互的接口,能夠發送請求、獲取返回結果,還能夠經過誇進程通訊來交互(IPC)。綁定的service只有當應用組件綁定後才能運行,多個組件能夠綁定一個service,當調用unbind()方法時,這個service就會被銷燬了。this

注意:默認狀況下,service與activity同樣都存在與當前進程的主線程中,因此,一些阻塞UI的操做,好比耗時操做不能放在service裏進行,好比另外開啓一個線程來處理諸如網絡請求的耗時操做。若是在service裏進行一些耗CPU和耗時操做,可能會引起ANR警告,這時應用會彈出是強制關閉仍是等待的對話框。因此,對service的理解就是和activity平級的,只不過是看不見的,在後臺運行的一個組件,這也是爲何和activity同被說爲Android的基本組件。啓動後的Service具備較高的優先級,通常狀況下,系統會保證Service的正常運行,只有當前臺的Activity正常運行的資源被Service佔用的狀況下,系統纔會中止Service;當系統從新得到資源後,會根據程序的設置來決定是否從新啓動原來的Service。spa

四、Service的生命週期:線程

        

 注意:bind service的不一樣之處在於當綁定的組件銷燬後,對應的service也就被kill了。

service生命週期也涉及一些回調方法,這些方法都不用調用父類方法,具體以下:

public class ExampleService extends Service {
    int mStartMode;       // indicates how to behave if the service is killed
    IBinder mBinder;      // interface for clients that bind
    boolean mAllowRebind; // indicates whether onRebind should be used

    @Override
    public void onCreate() {
        // The service is being created
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // The service is starting, due to a call to startService()
        return mStartMode;
    }
    @Override
    public IBinder onBind(Intent intent) {
        // A client is binding to the service with bindService()
        return mBinder;
    }
    @Override
    public boolean onUnbind(Intent intent) {
        // All clients have unbound with unbindService()
        return mAllowRebind;
    }
    @Override
    public void onRebind(Intent intent) {
        // A client is binding to the service with bindService(),
        // after onUnbind() has already been called
    }
    @Override
    public void onDestroy() {
        // The service is no longer used and is being destroyed
    }
}

五、Service的一個子類:IntentService

      IntentService使用隊列的方式將請求的Intent加入隊列,而後開啓一個worker thread(線程)來處理隊列中的Intent,對於異步的startService請求,IntentService會處理完成一個以後再處理第二個,每個請求都會在一個單獨的worker thread中處理,不會阻塞應用程序的主線程,所以,這裏提供一個思路,若是有耗時的操做與其在Service裏面開啓新線程還不如使用IntentService來處理耗時操做。而在通常的繼承Service裏面若是要進行耗時操做就必須另開線程,可是使用IntentService就能夠直接在裏面進行耗時操做,由於默認實現了一個worker thread。

實現實例:

public class defaultIntentService extends IntentService {

  //必須有構造函數, 而且必須帶有worker thread的name做爲參數調用super IntentService(String)
  public defaultIntentService() {
      super("defaultIntentService");
  }

  //經過從默認worker thread調用此帶有intent的方法啓動service
  //當方法返回IntentService會適時中止service
@Override protected void onHandleIntent(Intent intent) { // 一般咱們會作一些好比下載文件等的工做. // 好比實例中,睡眠五秒. long endTime = System.currentTimeMillis() + 5*1000; while (System.currentTimeMillis() < endTime) { synchronized (this) { try { wait(endTime - System.currentTimeMillis()); } catch (Exception e) { } } } } }

六、中止Service

[1]若是service是非綁定的,最終當任務完成時,爲了節省系統資源,必定要中止service,能夠經過stopSelf()來中止,也能夠在其餘組件中經過stopService()來中止;

[2]綁定的service能夠經過onUnBind()來中止service。

相關文章
相關標籤/搜索