android 使用 service 實現音樂

來源:互聯網
上載者:User

標籤:

今天的球員趁service。播放音樂service結束,進度條activity結束,因此,基礎工作activity和service互動,本文將使用IBinder互動。主要activity能夠調用service的函數。能夠參考我的這篇部落格。

本文關鍵點:利用利用IBinder實現activity 控制service 

實現功能:

1 控制播放進度:

activity調用service的函數,對MediaPlayer進行控制。

包含啟動時的播放和滑動seekbar時。對MediaPlayer進行設定,達到控制播放進度的控制。

2 播放進度更新:

  在activity開啟多線程。後台每隔100ms就發送一次message,在UI線程中利用handler對message進行判定,之後activity調用service的函數。得到播放的進度(百分比),及時更新seekbar的進度條。

例如以下:


布局非常easy,例如以下所看到的:

<?xml version="1.0" encoding="utf-8"?

><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="play"/> <Button android:id="@+id/playButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="play" /><Button android:id="@+id/pauseButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="pause" /> <SeekBar android:id="@+id/seekbar" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:max="100" android:progress="10" /></LinearLayout>

activity的代碼例如以下:

<pre name="code" class="java">public class MainActivity extends Activity {Boolean mBound = false;MusicService mService;SeekBar seekBar;//多線程,後台更新UIThread myThread;//控制後台線程退出boolean playStatus = true;//處理進度條更新Handler mHandler = new Handler(){@Override          public void handleMessage(Message msg){  switch (msg.what){case 0://從bundle中擷取進度。是double類型,播放的百分比double progress = msg.getData().getDouble("progress");//依據播放百分比,計算seekbar的實際位置             int max = seekBar.getMax();              int position = (int) (max*progress);                        //設定seekbar的實際位置            seekBar.setProgress(position);              break;        default:        break;}                    }  };@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//定義一個新線程。用來發送訊息。通知更新UImyThread = new Thread(new MyThread());//綁定service;Intent serviceIntent = new Intent(this , MusicService.class);//假設未綁定,則進行綁定if(!mBound){bindService(serviceIntent, mConnection, Context.BIND_AUTO_CREATE);}//初始化播放buttonButton playButton = (Button)findViewById(R.id.playButton);playButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubif(mBound){mService.play();}}});//初始化暫停buttonButton pauseButton = (Button)findViewById(R.id.pauseButton);pauseButton.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stub//首先須要判定綁定情況if(mBound){mService.pause();}}});    seekBar = (SeekBar)findViewById(R.id.seekbar);seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {//手動調節進度// TODO Auto-generated method stub//seekbar的拖動位置int dest = seekBar.getProgress();//seekbar的最大值int max = seekBar.getMax();//調用service調節播放進度mService.setProgress(max, dest);}@Overridepublic void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {// TODO Auto-generated method stub}@Overridepublic void onStartTrackingTouch(SeekBar arg0) {// TODO Auto-generated method stub}});}//實現runnable介面。多線程即時更新進度條public class MyThread implements Runnable{//通知UI更新的訊息//用來向UI線程傳遞進度的值Bundle data = new Bundle();//更新UI間隔時間int milliseconds = 100;double progress;@Overridepublic void run() {// TODO Auto-generated method stub//用來標識是否還在播放狀態,用來控制線程退出while(playStatus){                  try {                  //綁定成功才幹開始更新UI                    if(mBound){                                        //發送訊息,要求更新UI                                        Message msg = new Message();                    data.clear();                                 progress = mService.getProgress();            msg.what = 0;                        data.putDouble("progress", progress);            msg.setData(data);            mHandler.sendMessage(msg);                    }                    Thread.sleep(milliseconds);          //Thread.currentThread().sleep(milliseconds);  //每隔100ms更新一次UI                        } catch (InterruptedException e) {                      // TODO Auto-generated catch block                      e.printStackTrace();                  }  }}} /** Defines callbacks for service binding, passed to bindService() */      private ServiceConnection mConnection = new ServiceConnection() {            @Override          public void onServiceConnected(ComponentName className,                  IBinder binder) {              // We've bound to LocalService, cast the IBinder and get LocalService instance          MyBinder myBinder = (MyBinder) binder;                    //擷取service        mService = (MusicService) myBinder.getService();                          //綁定成功            mBound = true;                          //開啟線程,更新UI            myThread.start();        }            @Override          public void onServiceDisconnected(ComponentName arg0) {              mBound = false;          }      };     @Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic void onDestroy(){//銷毀activity時。要記得銷毀線程playStatus = false;super.onDestroy();}}


service的代碼例如以下:

public class MusicService extends Service {IBinder musicBinder  = new MyBinder();//擷取到activity的Handler。用來通知更新進度條Handler mHandler; //播放音樂的媒體類MediaPlayer mediaPlayer;//本地歌曲的路徑    String path = "/storage/sdcard1/Music/浪漫滿屋.mp3";        private String TAG = "MyService";@Override      public void onCreate() {          super.onCreate();          Log.d(TAG, "onCreate() executed");                  init();            }    @Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stub    //當綁定後。返回一個musicBinderreturn musicBinder;}class MyBinder extends Binder{public Service getService(){return MusicService.this;}}//初始化音樂播放void init(){//進入IdlemediaPlayer = new MediaPlayer();try {//初始化mediaPlayer.setDataSource(path);    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  // prepare 通過非同步方式裝載媒體資源mediaPlayer.prepareAsync();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}}//返回當前的播放進度,是double類型,即播放的百分比public double getProgress(){int position = mediaPlayer.getCurrentPosition();                  int time = mediaPlayer.getDuration();                  double progress = (double)position / (double)time;                return progress;  }//通過activity調節播放進度public void setProgress(int max , int dest){int time = mediaPlayer.getDuration();mediaPlayer.seekTo(time*dest/max);}//測試播放音樂public void play(){if(mediaPlayer != null){mediaPlayer.start();}}//暫停音樂       public void pause() {          if (mediaPlayer != null && mediaPlayer.isPlaying()) {              mediaPlayer.pause();          }      }        //service 銷毀時。停止播放音樂,釋放資源  @Override  public void onDestroy() {     // 在activity結束的時候回收資源     if (mediaPlayer != null && mediaPlayer.isPlaying()) {         mediaPlayer.stop();         mediaPlayer.release();         mediaPlayer = null;     }     super.onDestroy();     }}

著作權聲明:本文部落格原創文章,部落格,未經同意,不得轉載。

android 使用 service 實現音樂

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.