(一)Service介紹和注意事項
Service,後台運行,可互動這樣的一個東西。它跟Activity的層級差不多,但是他不能自己運行,需要通過某一個Activity或者其他Context對象來調用,
Context.startService() 和
Context.bindService()。
兩種啟動Service的方式有所不同。這裡要說明一下的是如果你在Service的onCreate或者onStart做一些很耗時間的事情,最好在
Service裡啟動一個線程來完成,因為Service是跑在主線程中,會影響到你的UI操作或者阻塞主線程中的其他事情。
什麼時候需要Service呢?比如播放多媒體的時候使用者啟動了其他Activity這個時候程式要在後台繼續播放,比如檢測SD卡上檔案的變化,再或者在後台記錄你地理資訊位置的改變等等,總之服務嘛,總是藏在後頭的。
Service在android當中是一個比較重要的構件,她只在後台工作,沒有Context。而且他也不是一個獨立的線程,而是和main用一個線程。在service中可以直接使用Toast進行一些資訊的提示。
但要注意,如果直接在service中直接啟動另一個Activity則會出錯。原因是沒有設定flag,即在聲明Intent的時候要設定flag:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)。下面給出一個例子:
public class backgroundServer extends Service{
...
public void startMyActivity(){
Intent i = new Intent();
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.setClass(backgroundServer.this, myActivity.class);
startActivity(i);
}
...
}
這樣就可以啟動MyActivity了。(注意不要在AndroidManifest.xml中註冊該Activity)
(二)Service生命週期
Service的生命週期方法比Activity少一些,只有onCreate, onStart, onDestroy
我們有兩種方式啟動一個Service,他們對Service生命週期的影響是不一樣的。
1 通過startService
Service會經曆 onCreate -> onStart
stopService的時候直接onDestroy
如果是調用者(TestServiceHolder)自己直接退出而沒有調用stopService的
話,Service會一直在後台運行。
下次TestServiceHolder再起來可以stopService。
2 通過bindService
Service只會運行onCreate, 這個時候
TestServiceHolder
和TestService綁定在一起
TestServiceHolder 退出了,Srevice就會調用onUnbind->onDestroyed
所謂綁定在一起就共存亡了。
要是這幾個方法交織在一起的話,會出現什麼情況呢?
一個原則是Service的onCreate的方法只會被調用一次,就是你無論多少次的startService又
bindService,Service只被建立一次。如果先是bind了,那麼start的時候就直接運行Service的onStart方法,如果先
是start,那麼bind的時候就直接運行onBind方法。如果你先bind上了,就stop不掉了,對啊,就是stopService不好使了,只
能先UnbindService, 再StopService,所以是先start還是先bind行為是有區別的。