深入探索Android Service

真的是好久沒有寫博客了,突然覺得自己有時候很容易放棄很多東西,好了,現在重新開始自己的博客之旅。

廢話不多說了,首先是,之前也寫過一個比較簡單的Service解析的文章Android Service初解,但是當時對這個東西理解不是很深入,所以很多東西都是寫的很簡單的,最近開始看Android的開發文檔,然後覺得對Service有了一些更深入的認識,現在寫下來,避免以後忘記。

首先什麼是Service,我們爲什麼要使用Service而不是別的組件?

在Android的四大基本組件(Actvitiy,Service,ContentProvider,BroadcastReceiver)中,Service能夠爲我們提供長時間的後臺服務,並且可以實現進程間通信(IPC)


Service中涉及到的方法主要有以下幾種:

1)onCreate():服務開始創建時,系統自動調用

2)onStartCommand():每次調用startService()時,系統自動調用

3)onBind():第一次調用bindService()時,系統調用。之後無論bindService()運行多少次,只要服務尚未被銷燬,那麼系統均會自動將第一次調取onBind()的返回值返回,避免重複調用

4)onDestory():服務銷燬時調用


Service的啓動方式有以下兩種:

1)startService():

以startService()啓動的服務,不依賴於應用而存在,當應用關閉後,服務仍然生存,故我們需要調用stopSelf()或者stopService()來結束服務。

2)bindService():

以bindService()啓動的服務,在所有綁定他的組件unbindService()之後,就會自動銷燬服務,而我們也無法使用stopSelf()或者stopService()來銷燬這個服務。

在組件中調用bindService()後,會在onBind()方法中返回一個IBinder對象,這個對象通常會將Service類對象包含起來,用於在組件類中實現交互操作,故bindService()一般用於情況較複雜的時候,然後根據自身需求直接調用Service之中的方法。


常用的Service類:

有android.app.Service和android.app.IntentService。IntentService繼承自Service,這兩者的主要區別在於IntentService中的這些代碼:

private final class ServiceHandler extends Handler {
        public ServiceHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            onHandleIntent((Intent)msg.obj);
            stopSelf(msg.arg1);
        }
    }
 @Override
    public void onCreate() {
        super.onCreate();
        HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");
        thread.start();

        mServiceLooper = thread.getLooper();
        mServiceHandler = new ServiceHandler(mServiceLooper);
    }

    @Override
    public void onStart(Intent intent, int startId) {
        Message msg = mServiceHandler.obtainMessage();
        msg.arg1 = startId;
        msg.obj = intent;
        mServiceHandler.sendMessage(msg);
    }

故每次啓動IntentService,都會新建一個線程,並在新線程中調用onHandleIntent(),之後會自動結束Service。因此,每次調用IntentService()都會經歷onCreate(),onStartCommand(),onDestory()的生命週期。而針對IntentService所調取的stopService()對他是沒有無效的。

並且IntentService中,對於onBind()模塊只是返回一個null值,並未做出其他處理,故一般僅有startService()中會使用到他,在bindService()中我們還是使用的Service。

最後,Service在默認情況下是運行於系統主線程中,所以當你在Service中運行耗時較久的服務,例如播放音樂或者網絡連接服務時,最好新建線程處理,以避免出現ui堵塞的情況

發佈了28 篇原創文章 · 獲贊 7 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章