在写一个音乐播放器,在一个Service类中利用MediaPlayer进行音乐的播放,一个Activity中控制界面,现在想在播放时在Activity上的一个SeekBar能够显示音乐的播放进度,现在的问题是,音乐播放是在Service中,所以获得歌曲播放进度是在Service中获得,要把进度传递给Activity的SeekBar显示进度,而进度是要不断更新的,难道Service中歌曲进度更新一次我就要startActivity吗?行不通吧?用BroadcastReceiver能OK么?希望大家帮帮我!

解决方案 »

  1.   

    恩 , 可以的 。
       LZ可以在Service里面开一个线程 , 专门负责SEEKBAR的管理 ,每隔一秒sendBroadcast一次 , 可以利用Intent来抓你写的那个BroadcastReceiver , 并且抓的时候你还可以把歌曲进度的一些信息写到Intent里面 。
       那个广播直接写到你布局SEEKBAR的那个Activity里面就行了。
      

  2.   

    我新建了一个类继承自BroadcastReceiver,里面可以接受Service的数据,可是我怎么把这数据传递给Activity呢?不用startActivity可以么?
      

  3.   

    唉 , 你把整个Receiver直接写到Activity里面 , 形成内嵌类啊 ,动态注册这个广播 ,然后用Activity里面的全局变量就搞定了嘛 
      

  4.   

    BroadcastReceiver多不可靠啊效率低,直接提供服务绑定就行了,看看系统music.git的实现好了
      

  5.   

    下载Android源码
       /packages/apps/Music就是了
      

  6.   

    功能OK啦,但是报错啦,android.app.IntentReceiverLeaked。是Broadcastreceiver没有取消注册啊,但是我取消注册也会报错!麻烦你简单介绍下这个!呵呵!
      

  7.   

    如果只是为了实现更新SeekBar的功能,其实不用BroadcastReceiver 也可以,把service类中的MediaPlayer变量声明为静态public成员,在activity中直接调用
    MusicService.mMediaPlayer.getCurrentPosition();

    MusicService.mMediaPlayer.getDuration();
    取得当前播放的位置,再设置SeekBar的进度就可以了,新开一个线程,设置一个1s的延迟,选中更新进度就可以了。
      

  8.   

    如果只是为了实现更新SeekBar的功能,其实不用BroadcastReceiver 也可以,把service类中的MediaPlayer变量声明为静态public成员,在activity中直接调用
    MusicService.mMediaPlayer.getCurrentPosition();

    MusicService.mMediaPlayer.getDuration();
    取得当前播放的位置,再设置SeekBar的进度就可以了,新开一个线程,设置一个1s的延迟,循环更新进度就可以了。