通過IntentService的繼承類實現命令觸發的服務,也可以直接通過Service的繼承類來實現。在IntentService中的例子,我們增加了StopService( )的方式,用於實驗。在實際應用中,IntentService常用於一次性運行,自動結束的情況,不需要人工停止幹預。對於需要人工幹預的停止的,長時間(或無限制)啟動並執行情況,可直接繼承Service的方式,例如音樂播放。IntentService也是Service的一個繼承類。
繼承Service類
在本例中,我們中我們類比音樂播放,提供了兩個參數,一個是音樂列表,一個是隨機播放標識。
和上一例子不同,Service不會自動結束,必須要使用者幹預。例如播放音樂或者audiobook,當使用者離開Appcliation時,音樂還能繼續播放,service會持續下去,不停止,直至使用者主動停止服務,即使音樂播放完畢,模式也非迴圈播放,當播放完所有音樂時,service仍然存在,直至使用者主導stopService()或者服務本身stopSelf()。例子是個類比例子,不涉及真正的音樂播放。
用戶端代碼
public class ServiceTest2 extends Activity{
... ...
//對於用戶端,和上次例子相似,通過Intent作為命令,本例傳遞的參數為兩個,通過startService()來啟動服務。
private void startPlayer(){
Intent i = new Intent(this,ServicePlayer.class);
i.putExtra(ServicePlayer.EXTRA_PLAYLIST, "playlist");
i.putExtra(ServicePlayer.EXTRA_SHUFFLE, true);
startService(i);
}
//有使用者幹預的停止服務。在例子中,我們並不使用建立服務的intent,因為Activity的生命週期可能已經結束,intent已被記憶體回收,我們重新開啟Activity,在新的Activity中,不需開啟服務就可直接停止。
private void stopPlayer(){
stopService(new Intent(this,ServicePlayer.class));
}
}
Service端代碼
public class ServicePlayer extends Service{
public static final String EXTRA_PLAYLIST = "com.wei.android.learning.EXTRA_PLAYLIST";
public static final String EXTRA_SHUFFLE = "com.wei.android.learning.EXTRA_SHUFFLE";
private boolean isPlaying = false;
//將在以後學習Bind Service的模式
public IBinder onBind(Intent arg0) {
return null;
}
//收到用戶端觸發,如果服務尚未啟動,則先執行onCreate(),再此進行服務初始化處理。
public void onCreate() {
super.onCreate();
}
//在收到stopService()時觸發,我們將在此處理停止Service的相關事宜,例如停止後台線程的運行等等。
public void onDestroy() {
playStop();
super.onDestroy();
}
//當系統記憶體少時,將要求終止服務,我們在此進行關閉服務的處理,例如保持相關的狀態等,如服務部需保持特定狀態,則無需重寫此方法。
public void onLowMemory() {
super.onLowMemory();
}
//收到用戶端請求時觸發,由於onStartCommand()運行在主線程,將進行本次服務的初始化,並開啟後台線程運行相關的處理,具體參加線程的學習筆記,本例只考察Service相關內容。傳回值將告訴系統如果service的進程被殺掉,將會如何:START_STICKY表示服務將回到開始狀態,如同onStartCommand()被called,但是Intent不會重發;START_REDELIVER_INTENT表示要求系統重新發送一次Intent,即服務將重新觸發執行onStartCommand();START_NOT_STICKY表示無需幹預,服務停止,等待有新的命令觸發。
public int onStartCommand(Intent intent, int flags, int startId)
{
showInfo("onStartCommand");
String playlist = intent.getStringExtra(EXTRA_PLAYLIST);
boolean suffle = intent.getBooleanExtra(EXTRA_SHUFFLE, false);
playStart(playlist,suffle);
return START_NOT_STICKY;
}
private void playStart(String playlist, boolean suffle){
if(! isPlaying){
isPlaying = true;
}
}
private void playStop(){
if( isPlaying){
showInfo("Go to Stop!");
isPlaying = false;
}
}
}
如果有三個用戶端都通過startService(),也只會啟動一個服務。只有第一個發出命令時,系統探索服務沒有啟動,將啟動服務,其餘的直接觸發onStartCommand()。通過startService()並不僅僅是發送命令,而是告訴系統服務維持運行,直至通知它服務停止。
相關連結:
我的Android開發相關文章