2012-01-21 496 views
3

請查看我的simple three-methods Service class,它可以直接播放音頻並播放它。使用服務流式傳輸音頻

public class StreamService extends Service { 

    private static final String TAG = "MyService"; 
    String url; 
    MediaPlayer mp; 

    @Override 
    public void onCreate() { 
     Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onCreate"); 

     mp = new MediaPlayer(); 
     mp.setAudioStreamType(AudioManager.STREAM_MUSIC); 
    } 

    @Override 
    public void onDestroy() { 
     Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onDestroy"); 

     mp.stop(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startid) { 
     Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
     Log.d(TAG, "onStart"); 

     url = intent.getExtras().getString("url"); 
     try { 
      mp.setDataSource(url); 
      mp.prepare(); 
      mp.start(); 
     } catch(Exception e){}   
     return START_STICKY; 
    } 
} 

在我的活動,我有兩個按鈕,播放/停止媒體文件:

  • playButton執行此:

    Intent i = new Intent(this, StreamService.class); 
    i.putExtra("my_mp3_url_string"); 
    startService(i); 
    
  • stopButton執行此:

    stopService(new Intent(this, StreamService.class)); 
    

現在,我有一些問題:

  1. 我怎麼能實現pauseButton?我想暫停在服務中運行的媒體
  2. 播放/停止媒體/服務的方式是否正確?有沒有更好的方法?
  3. 我如何(定期)從我的服務中更新我Activity的UI?我需要添加一些東西嗎?

回答

9

我建議不要使用服務的生命週期作爲啓動和停止播放的方式。使用這種方法將意味着每次你想開始一個新的流時,代碼將會因爲需要調出一個新的服務而變得更慢。您可以通過讓相同的服務播放所有內容來節省一些時間。雖然這並不意味着它應該保持running all the time

要完成該操作(並且能夠暫停),您需要在服務啓動後綁定到該服務。隨着綁定的服務,你就可以對其進行的電話 - 如暫停,播放,停止等

這裏有一些鏈接,幫助你與你在找什麼:

+0

非常感謝。儘管我仍然在使服務更新活動用戶界面,但我相信你指出了我的正確方向。再次感謝:) – iTurki

+0

@iturki:我正在研究類似的應用程序。你可以分享一下關於在Activity中管理播放器服務和UI更新的經驗嗎? –

+0

我認爲有幾個選項可以用來根據播放器服務中的更改更新UI。 1.在綁定到播放器服務時註冊一個監聽器,並使用回調函數爲您提供有關播放器服務更改的更新。 2.(可能是最簡單的方法)使用播放器服務中的廣播來指示更新並在您的用戶界面中監聽這些廣播。 – Aldryd