![Page 1: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/1.jpg)
Android Service -播放音樂
建國科技大學 資管系饒瑞佶
2013/7 V1
![Page 2: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/2.jpg)
Android Service• Service 是跟 Activity 並行
– 一個音樂播放程式若沒使用 Service ,即使按 home 鍵畫面離開之後,音樂還是照播
– 如果再執行一次程式,新撥放的音樂會跟先前撥放的一起撥,最後程式就會出錯
– 執行中的程式完全看不到!• 但是,寫成 Service 就不同了
– Activity 只負責顯示,撥放的任務則是交給 service ,Service 是沒有 UI 的,在 trace 的時候可以用System.out.println 來測試是否有成功呼叫。
– Service 就像是一個代理人,將可以背景執行的程序 (像是MediaPlayer()) 交給他就對了
![Page 3: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/3.jpg)
先試試不用 Service 撥放音樂<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><Button android:id="@+id/Play" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="開始播放 "/><Button android:id="@+id/Stop" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="停止播放 "/><TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /></LinearLayout>
![Page 4: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/4.jpg)
先試試不用 Service 撥放音樂• res 中加入– raw/test.mp3
![Page 5: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/5.jpg)
先試試不用 Service 撥放音樂
![Page 6: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/6.jpg)
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 對應 layout物件 buttonStart = (Button) findViewById(R.id.Play); buttonContinuePlay = (Button) findViewById(R.id.ContinuePlay); buttonPause = (Button) findViewById(R.id.Pause); buttonStop = (Button) findViewById(R.id.Stop); textState = (TextView)findViewById(R.id.tv1); // 設定 onclick事件 buttonStart.setOnClickListener(this); buttonStop.setOnClickListener(this); buttonPause.setOnClickListener(this); buttonContinuePlay.setOnClickListener(this); //設定物件是否可用 buttonStart.setEnabled(true); buttonContinuePlay.setEnabled(false); buttonPause.setEnabled(false); buttonStop.setEnabled(false); // 建立 mediplayer物件 mediaPlayer = new MediaPlayer(); }
![Page 7: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/7.jpg)
Play
![Page 8: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/8.jpg)
Play
![Page 9: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/9.jpg)
Play
// 播放完成 mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { public void onCompletion(MediaPlayer arg0) { try { //釋放 mediaplayer mediaPlayer.release(); textState.setText("Play end!"); //設定物件是否可用 buttonStart.setEnabled(true); buttonContinuePlay.setEnabled(false); buttonPause.setEnabled(false); buttonStop.setEnabled(false); } catch (Exception e) { textState.setText(e.toString()); e.printStackTrace(); } } });
![Page 10: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/10.jpg)
Play//播放錯誤 mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { public boolean onError(MediaPlayer arg0, int arg1, int arg2) { try { //釋放 mediaplayer mediaPlayer.release(); textState.setText("Play ERROR!"); } catch (Exception e) { textState.setText(e.toString()); e.printStackTrace(); } return false; } }); break;
![Page 11: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/11.jpg)
ContinuePlay
case R.id.ContinuePlay: try { mediaPlayer.start(); textState.setText("- Playing -"); buttonStart.setEnabled(false); buttonContinuePlay.setEnabled(false); buttonPause.setEnabled(true); buttonStop.setEnabled(true); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } break;
![Page 12: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/12.jpg)
Pause
case R.id.Pause: try { mediaPlayer.pause(); textState.setText("- Pause -"); buttonStart.setEnabled(true); buttonContinuePlay.setEnabled(true); buttonPause.setEnabled(false); buttonStop.setEnabled(true); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } break;
![Page 13: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/13.jpg)
Stop
Switch 的結束
onClick的結束
![Page 14: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/14.jpg)
問題• 產生重複撥放• 無法從執行中程序停止
![Page 15: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/15.jpg)
Service 流程
![Page 16: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/16.jpg)
改用 Service 撥放音樂
![Page 17: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/17.jpg)
改用 Service 撥放音樂
![Page 18: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/18.jpg)
改用 Service 撥放音樂
![Page 19: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/19.jpg)
改用 Service 撥放音樂
![Page 20: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/20.jpg)
改用 Service 撥放音樂
public class MusicService extends Service {MediaPlayer player;
@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn null;}
@Overridepublic void onCreate() { //Service首先啟動super.onCreate();player = new MediaPlayer(); }
![Page 21: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/21.jpg)
改用 Service 撥放音樂@Overridepublic void onStart(Intent intent, int startId) { //完成 onCreate()後啟動 if (intent != null) { Bundle bundle = intent.getExtras(); if (bundle != null) { int op = bundle.getInt("op"); switch (op) { case 1: //play player=MediaPlayer.create(this, R.raw.test) ; player.start(); break; case 2: //replay player.start(); break; case 3: //pause player.pause(); break; case 4: //stop if (player != null) { player.stop(); } break; } } }}
![Page 22: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/22.jpg)
改用 Service 撥放音樂
@Overridepublic void onDestroy() { super.onDestroy(); if(player!=null){ player.stop(); player.release(); }}
![Page 23: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/23.jpg)
修正 AndroidManifest.xml
<service android:enabled="true" android:name=".MusicService"> <action android:name="ccc.android.MusicService" /></service>
加入到 <application> 中
![Page 24: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/24.jpg)
問題是否還在?• 產生重複撥放?• 無法從執行中程序停止?
![Page 25: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/25.jpg)
背景音樂
![Page 26: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/26.jpg)
MyBackVoice.java
![Page 27: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/27.jpg)
public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main);
mMediaPlayer = MediaPlayer.create(this,R.raw.test); mMediaPlayer.start();}
@Overrideprotected void onPause() { super.onPause(); mMediaPlayer.pause(); //記得現在的位置 length = mMediaPlayer.getCurrentPosition(); }
![Page 28: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/28.jpg)
@Overrideprotected void onResume() { // TODO Auto-generated method stub super.onResume(); mMediaPlayer.seekTo(length); mMediaPlayer.start();}
@Overrideprotected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mMediaPlayer.stop();}
![Page 29: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/29.jpg)
@Overridepublic void onBackPressed() { return; //讓按鍵失效,使 resume後可以繼續撥放}
@Overrideprotected void onResume() { // TODO Auto-generated method stub super.onResume(); mMediaPlayer.seekTo(length); mMediaPlayer.start();}
@Overrideprotected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mMediaPlayer.stop();}
![Page 30: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按](https://reader035.vdocuments.pub/reader035/viewer/2022081420/5697bf871a28abf838c88ce1/html5/thumbnails/30.jpg)
小補充public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //透過 sdcard mMediaPlayer = new MediaPlayer(); try { mMediaPlayer.setDataSource("/sdcard/test.mp3"); mMediaPlayer.prepare(); } catch (IllegalArgumentException e) { // TODO 自動產生的 catch 區塊 e.printStackTrace(); } catch (IllegalStateException e) { // TODO 自動產生的 catch 區塊 e.printStackTrace(); } catch (IOException e) { // TODO 自動產生的 catch 區塊 e.printStackTrace(); } // 透過資源檔 //mMediaPlayer = MediaPlayer.create(this,R.raw.tt); mMediaPlayer.start();}