Service相關連接html
Service是Android系統中的一種組件,它跟Activity的級別差很少,可是它不能本身運行,只能後臺運行,而且能夠和其餘組件進行交互。Service是沒有界面的長生命週期的代碼。Service是一種程序,它能夠運行很長時間,可是它卻沒有用戶界面。這麼說有點枯燥,來看個例子,打開一個音樂播放器的程序,這個時候若想上網了,那麼,咱們打開Android瀏覽器,這個時候雖然咱們已經進入了瀏覽器程序,可是,歌曲播放並無中止,而是在後臺繼續一首接着一首地播放。其實這個播放就是由播放音樂的Service進行控制的。
固然這個播放音樂的Service也能夠中止,例如,當播放列表裏邊的歌曲都結束,或者用戶按下了中止音樂播放的快捷鍵等。Service能夠在不少場合的應用中使用,好比播放多媒體的時候用戶啓動了其餘Activity,這個時候程序要在後臺繼續播放,好比檢測SD卡上文件的變化,再或者在後臺記錄用戶地理信息位置的改變等等。總之服務嘛,老是藏在後頭的。java
service的生命週期比activity簡單多了,緣由是service是在後臺運行的,它是一直運行的,因此不須要那麼多的狀態判斷。它只繼承了onCreate()、onStart()或者說是onStartCommand()、 // 2.0 API level以後,實現onStart等同於重寫onStartCommand並返回 關於onStartCommon()的詳解:http://blog.csdn.net/lizzy115/article/details/7001731android
onDestroy()三個方法。 瀏覽器
生命週期解析app
好的,從上圖的生命週期,咱們能夠知道,Android中使用Service的方式有兩種:ide
1)StartService()啓動Service
2)BindService()啓動Service
PS:還有一種,就是啓動Service後,綁定Service!佈局
- onCreate():當Service第一次被建立後當即回調該方法,該方法在整個生命週期 中只會調用依次!
- onDestory():當Service被關閉時會回調該方法,該方法只會回調一次!
- onStartCommand(intent,flag,startId):早期版本是onStart(intent,startId), 當客戶端調用startService(Intent)方法時會回調,可屢次調用StartService方法, 但不會再建立新的Service對象,而是繼續複用前面產生的Service對象,但會繼續回調 onStartCommand()方法!
- IBinder onOnbind(intent):該方法是Service都必須實現的方法,該方法會返回一個 IBinder對象,app經過該對象與Service組件進行通訊!
- onUnbind(intent):當該Service上綁定的全部客戶端都斷開時會回調
服務不能本身運行,須要經過調用Context.startService()或Context.bindService()方法啓動服務。這兩個方法均可以啓動Service,可是它們的使用場合有所不一樣。this
service的註冊跟activity的註冊相似,一樣是要在AndroidManifest.xml的文件裏註冊。spa
<service android:name=".MyService"> <intent-filter> <action android:name="android.guo.service.playmusic.MyService"/> </intent-filter> </service>
建立繼承與 Service 的類.net
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; }
目前MyService 中能夠算是空空如也,但有一個onBind()方法特別醒目。這個方法是Service 中惟一的一個抽象方法,因此必需要在子類裏實現。咱們會在後面的小節中使用到onBind()方法,目前能夠暫時將它忽略掉。
既然是定義一個服務,天然應該在服務中去處理一些事情了,那處理事情的邏輯應該寫在哪裏呢?這時就能夠重寫Service 中的另一些方法了,以下所示:
public class MyService extends Service { @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; }
@Override public void onCreate() { // TODO Auto-generated method stub super.onCreate();
Log.v("MainActivity", "onCreate") }
@Override public void onStart(Intent intent, int startId) { // TODO Auto-generated method stub super.onStart(intent, startId); Log.v("MainActivity", "onStart"); }
@Override public void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.v("MainActivity", "onDestroy"); } }
能夠看到,這裏咱們又重寫了onCreate()、onStartCommand()和onDestroy()這三個方法,它們是每一個服務中最經常使用到的三個方法了。其中onCreate()方法會在服務建立的時候調用,onStartCommand()方法會在每次服務啓動的時候調用,onDestroy()方法會在服務銷燬的時候調用。
一般狀況下,若是咱們但願服務一旦啓動就馬上去執行某個動做,就能夠將邏輯寫在onStartCommand()方法裏。而當服務銷燬時,咱們又應該在onDestroy()方法中去回收那些再也不使用的資源。
另外須要注意,每個服務都須要在AndroidManifest.xml 文件中進行註冊才能生效,不知道你有沒有發現,這是Android 四大組件共有的特色。因而咱們還應該修改AndroidManifest.xml文件,代碼以下所示:
咱們在佈局文件中加入了兩個按鈕,分別是用於啓動服務和中止服務的。而後修改MainActivity 中的代碼,以下所示:
Button button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent startintent = new Intent(MainActivity.this,MyService.class); startService(startintent); } }); Button button2 = (Button)findViewById(R.id.button2); button2.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Intent stopintent = new Intent(MainActivity.this,MyService.class); stopService(stopintent); } });
咱們如何才能證明服務已經成功啓動或者中止了呢?最簡單的方法就是在MyService 的幾個方法中加入打印日誌,能夠看到咱們在MyService中已經加入了。
下面咱們看一下運行效果:
開啓服務後,LogCat中打印
關閉服務後,LogCat 中打印: