android service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 v1. android service...

30
Android Service 播播播播 播播播播播播 播播播 播播播 2013/7 V1

Upload: byron-west

Post on 17-Jan-2016

242 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

Android Service -播放音樂

建國科技大學 資管系饒瑞佶

2013/7 V1

Page 2: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

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 ,即使按

先試試不用 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 ,即使按

先試試不用 Service 撥放音樂• res 中加入– raw/test.mp3

Page 5: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

先試試不用 Service 撥放音樂

Page 6: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

@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 ,即使按

Play

Page 8: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

Play

Page 9: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

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 ,即使按

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 ,即使按

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 ,即使按

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 ,即使按

Stop

Switch 的結束

onClick的結束

Page 14: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

問題• 產生重複撥放• 無法從執行中程序停止

Page 15: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

Service 流程

Page 16: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

改用 Service 撥放音樂

Page 17: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

改用 Service 撥放音樂

Page 18: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

改用 Service 撥放音樂 

Page 19: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

改用 Service 撥放音樂

Page 20: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

改用 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 ,即使按

改用 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 ,即使按

改用 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 ,即使按

修正 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 ,即使按

問題是否還在?• 產生重複撥放?• 無法從執行中程序停止?

Page 25: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

背景音樂

Page 26: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

MyBackVoice.java

Page 27: Android Service -播放音樂 建國科技大學 資管系 饒瑞佶 2013/7 V1. Android Service Service 是跟 Activity 並行 – 一個音樂播放程式若 沒使用 Service ,即使按

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 ,即使按

@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 ,即使按

@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 ,即使按

小補充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();}