1、什麼是Service
Service可以在和多場合的應用中使用,比如播放多媒體的時候使用者啟動了其他Activity這個時候程式要在後台繼續播放,比如檢測SD卡上檔案的變化,再或者在後台記錄你地理資訊位置的改變等等,總之服務總是藏在背景。
2、兩種方法Service啟動流程
context.startService() 啟動流程:
context.startService() -> onCreate() -> onStart() -> Service running -> context.stopService() -> onDestroy() -> Service stop
如果Service還沒有運行,則android先調用onCreate()然後調用onStart();
如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重複調用多次。
如果stopService的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在後台運行,該Service的調用者再啟動起來後可以通過stopService關閉Service。
所以調用startService的生命週期為:onCreate --> onStart(可多次調用) --> onDestroy
context.bindService()啟動流程:
context.bindService() -> onCreate() -> onBind() -> Service running -> onUnbind() -> onDestroy() -> Service stop
onBind()將返回給用戶端一個IBind介面執行個體,IBind允許用戶端回調服務的方法,比如得到Service的執行個體、運行狀態或其他動作。這個時候把調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調用onUnbind->onDestroy相應退出。
所以調用bindService的生命週期為:onCreate --> onBind(只一次,不可多次綁定) --> onUnbind --> onDestory。
在Service每一次的開啟關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被調用一次。
3、Service生命週期
Service的生命週期並不像Activity那麼複雜,它只繼承了onCreate()、onStart()、onDestroy()三個方法
當我們第一次啟動Service時,先後調用了onCreate()、onStart()這兩個方法;當停止Service時,則執行onDestroy()方法。
這裡需要注意的是,如果Service已經啟動了,當我們再次啟動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法。
4、一個簡單的例子:
定義一個MyService類
package com.ideal.study;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.IBinder;public class MyService extends Service {private MediaPlayer mp;@Overridepublic void onCreate() {// TODO Auto-generated method stub// 初始化音樂資源try {System.out.println("create player");// 建立MediaPlayer對象mp = new MediaPlayer();mp = MediaPlayer.create(MyService.this, R.raw.bgmusic); //mp.prepare();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();}super.onCreate();}@Overridepublic void onStart(Intent intent, int startId) {// TODO Auto-generated method stub// 開始播放音樂mp.start();// 音樂播放完畢的事件處理mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {public void onCompletion(MediaPlayer mp) {// TODO Auto-generated method stub// 迴圈播放try {mp.start();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});// 播放音樂時發生錯誤的事件處理mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {public boolean onError(MediaPlayer mp, int what, int extra) {// TODO Auto-generated method stub// 釋放資源try {mp.release();} catch (Exception e) {e.printStackTrace();}return false;}});super.onStart(intent, startId);}@Overridepublic void onDestroy() {// TODO Auto-generated method stub// 服務停止時停止播放音樂並釋放資源mp.stop();mp.release();super.onDestroy();}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}}
在其他需要用到的Activity調用
開啟Service
//播放背景音樂Intent intentSV = new Intent(LearningFlashActivity.this, MyService.class);startService(intentSV);
關閉Service
//關閉背景音樂Intent intentSV = new Intent(LearningList.this, MyService.class);stopService(intentSV);
記住進行註冊
<service android:name=".MyService" />