首先你要先了解什麼是Service?
簡單來說就是在背景裡默默地執行程式而不受介面關閉所影響
那為什麼要用?
很簡單啊!不就是一些耗時的執行程序,像是下載阿,總不能叫使用者下載完畢才可以使用
所以讓我們來開始慢慢探討一些Service的東西
首先我們看到了Service的生命週期
這裡就不多敘述LifeCycle
那其實Service 常見的就分了兩種
startService & bindService
先來介紹startService
生命週期 : onCreate() ➞ onStartCommand() ➞ onDestroy()
Activity 透過 startService(intent)來啟動Service,那首先系統會先執行OnCreate()將所帶入的intent帶到Service的onStartCommand(intent,int,int),這樣就完成了Service的第一步,而這個Service會一直跑下去除非你呼叫StopService()或是手機記憶體吃緊時會把某些系統收掉,那這時候出現了一個問題,那我的Service被砍掉了可是我需要用怎麼辦?
這時候有幾個參數在onStartCommand回傳值可以讓系統替你重新啟動Service。
- START_STICKY : Service被殺掉, 系統會重啟, 但是Intent會是null。
- START_NOT_STICKY : Service被系統殺掉, 不會重啟。
- START_REDELIVER_INTENT : Service被系統殺掉, 重啟且Intent會重傳。
透過以上的參數, 放在onStartCommand的return參數就可以使用重啟的功能了。
再來是bindService
生命週期 : onCreate() ➞ onBind() ➞ onUnbind() ➞ onDestroy()
Activity透過bindService(intent,connection,flag)建立一個與Service綁定的連線,首先建立serviceConnection的匿名類,在裡面重寫onServiceConnected()方法和onServiceDisconnected()方法,而這兩個方法會在Activity與Service建立或解除聯繫時候所調用,而把這匿名類別物件放到bindService(connection)裡,而flag參數預設 BIND_AUTO_CREATE,也就是當我們綁定的時候會自動產生 Service。當連線時在onServiceConnected()我們可以透過IBinder接收到Service內的onBind()所丟出的IBinder物件,利用這 IBinder 物件取得 Service 物件,就可以直接操作 Service 內各個 public 的 method。而當想要解除繫節怎麼辦?這時候使用unbindService()就可以解除或是你使用的Activity已經結束了,因為綁定再一起所以會共存亡
以上兩個是實作Service的基本方法,那使用時機呢?讓我來舉個例子:
以上兩個是實作Service的基本方法,那使用時機呢?讓我來舉個例子:
當你想要在後台撥放音樂,這時候可以透過startServie(intent)來播放,而你可能想要知道音樂
的資訊或是下一首,只時Activity就可以調用bindService()方法與Service建立連線並使用你想要
的方法。
這樣有看懂嗎?其實差別就是Activity可不可以跟Service做溝通,前者不可(start)後者可以(bind)
而在這裡再跟大家說很重要的事,那就是其實Service跟Thread是很像的,只是Service其實是運行在main process裡!WOW!!就是因為這個原因如果直接在Service中處理一些耗時的邏輯,就會導致程序ANR。那該如何解決呢?應該在Service中開啟線程去執行耗時任務,這樣就可以有效地避免ANR的出現。也可利用遠程service
遠程Service請自己google一下,簡單來說它已經在另外一個進程當中運行了,所以只會阻塞該進程中的Main process,並不會影響到當前的應用程序。
程式實作代碼有需要再email給我!有什麼疑問或是講得有錯誤的請大家多多指教!!
的資訊或是下一首,只時Activity就可以調用bindService()方法與Service建立連線並使用你想要
的方法。
這樣有看懂嗎?其實差別就是Activity可不可以跟Service做溝通,前者不可(start)後者可以(bind)
而在這裡再跟大家說很重要的事,那就是其實Service跟Thread是很像的,只是Service其實是運行在main process裡!WOW!!就是因為這個原因如果直接在Service中處理一些耗時的邏輯,就會導致程序ANR。那該如何解決呢?應該在Service中開啟線程去執行耗時任務,這樣就可以有效地避免ANR的出現。也可利用遠程service
遠程Service請自己google一下,簡單來說它已經在另外一個進程當中運行了,所以只會阻塞該進程中的Main process,並不會影響到當前的應用程序。
程式實作代碼有需要再email給我!有什麼疑問或是講得有錯誤的請大家多多指教!!
沒有留言:
張貼留言