2012-01-21 296 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