1. 程式人生 > >Android Service使用方法--簡單音樂播放例項

Android Service使用方法--簡單音樂播放例項

Service翻譯成中文是服務,熟悉Windows 系統的同學一定很熟悉了。Android裡的Service跟Windows裡的Service功能差不多,就是一個不可見的程序在後臺執行。

      Android中的服務,它與Activity不同,它是不能與使用者互動的,不能自己啟動的,執行在後臺的程式,如果我們退出應用時,Service程序並沒有結束,它仍然在後臺執行,例如我們開啟一個音樂播放器來聽音樂,在聽音樂的同時也想做下其它的事情,比如上網聊Q、或者上網瀏覽新聞之類的事情。這樣的話,我們就需要用到Service服務了。下面我們以一個簡單的音樂播放器的例項來說明下Service的生命週期和Service的使用。

下面是音樂播放器Demo的程式結構圖:

Android Service 的生命週期:

Android中Service的生命週期並不是很複雜,只是繼承了onCreate(), onStart(), onDestory()三個方法。當我們第一次啟動Service服務時,呼叫onCreate() --> onStart()兩個方法,當停止Service服務時,呼叫onDestory()方法。如果Service已經啟動了,第二次再啟動同一個服務時,就只是呼叫 onStart() 這個方法了。

Android Service 的使用:

[1] 參照上面的程式結構圖,我們可以建立一個Android程式,在src目錄下建立一個Activity,一個繼承自Service類的服務類;同時在資原始檔夾res目錄下建立一個raw的資料夾存放音訊檔案,如把music.mp3音樂檔案放在該目錄下。該程式的主介面如下:

[2] layout目錄下的main.xml檔案的原始碼:

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     android:layout_width="fill_parent"
  5.     android:layout_height="fill_parent"
  6.     >  
  7.     <TextView    
  8.        android:layout_width="fill_parent"
  9.        android:layout_height="wrap_content"
  10.        android:text="Welcome to Andy's blog!"
  11.        android:textSize="16sp"/>     
  12.     <TextView    
  13.        android:layout_width="fill_parent"
  14.        android:layout_height="wrap_content"
  15.        android:text="音樂播放服務"/>  
  16.     <Button  
  17.        android:id="@+id/startMusic"
  18.        android:layout_width="wrap_content"
  19.        android:layout_height="wrap_content"
  20.        android:text="開啟音樂播放服務"/>  
  21.     <Button  
  22.        android:id="@+id/stopMusic"
  23.        android:layout_width="wrap_content"
  24.        android:layout_height="wrap_content"
  25.        android:text="停止音樂播放服務"/>  
  26.    <Button  
  27.       android:id="@+id/bindMusic"
  28.       android:layout_width="wrap_content"
  29.       android:layout_height="wrap_content"
  30.       android:text="繫結音樂播放服務"/>  
  31.    <Button  
  32.       android:id="@+id/unbindMusic"
  33.       android:layout_width="wrap_content"
  34.       android:layout_height="wrap_content"
  35.       android:text="解除 ——繫結音樂播放服務"/>  
  36. </LinearLayout>  

[3] src目錄下MusicService.java原始碼:

  1. package com.andyidea.service;  
  2. import android.app.Service;  
  3. import android.content.Intent;  
  4. import android.media.MediaPlayer;  
  5. import android.os.IBinder;  
  6. import android.util.Log;  
  7. import android.widget.Toast;  
  8. publicclass MusicService extends Service {  
  9.     //為日誌工具設定標籤
  10.     privatestatic String TAG = "MusicService";  
  11.     //定義音樂播放器變數
  12.     private MediaPlayer mPlayer;  
  13.     //該服務不存在需要被建立時被呼叫,不管startService()還是bindService()都會啟動時呼叫該方法
  14.     @Override  
  15.     publicvoid onCreate() {  
  16.         Toast.makeText(this"MusicSevice onCreate()"
  17.                 , Toast.LENGTH_SHORT).show();  
  18.         Log.e(TAG, "MusicSerice onCreate()");  
  19.         mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music);  
  20.         //設定可以重複播放
  21.         mPlayer.setLooping(true);  
  22.         super.onCreate();  
  23.     }  
  24.     @Override  
  25.     publicvoid onStart(Intent intent, int startId) {  
  26.         Toast.makeText(this"MusicSevice onStart()"
  27.                 , Toast.LENGTH_SHORT).show();  
  28.         Log.e(TAG, "MusicSerice onStart()");  
  29.         mPlayer.start();  
  30.         super.onStart(intent, startId);  
  31.     }  
  32.     @Override  
  33.     publicvoid onDestroy() {  
  34.         Toast.makeText(this"MusicSevice onDestroy()"
  35.                 , Toast.LENGTH_SHORT).show();  
  36.         Log.e(TAG, "MusicSerice onDestroy()");  
  37.         mPlayer.stop();  
  38.         super.onDestroy();  
  39.     }  
  40.     //其他物件通過bindService 方法通知該Service時該方法被呼叫
  41.     @Override  
  42.     public IBinder onBind(Intent intent) {  
  43.         Toast.makeText(this"MusicSevice onBind()"
  44.                 , Toast.LENGTH_SHORT).show();  
  45.         Log.e(TAG, "MusicSerice onBind()");  
  46.         mPlayer.start();  
  47.         returnnull;  
  48.     }  
  49.     //其它物件通過unbindService方法通知該Service時該方法被呼叫
  50.     @Override  
  51.     public boolean onUnbind(Intent intent) {  
  52.         Toast.makeText(this"MusicSevice onUnbind()"
  53.                 , Toast.LENGTH_SHORT).show();  
  54.         Log.e(TAG, "MusicSerice onUnbind()");  
  55.         mPlayer.stop();  
  56.         return super.onUnbind(intent);  
  57.     }  
  58. }  

[4] src目錄下MusicServiceActivity原始碼:

  1. package com.andyidea.service;  
  2. import android.app.Activity;  
  3. import android.content.ComponentName;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.content.ServiceConnection;  
  7. import android.os.Bundle;  
  8. import android.os.IBinder;  
  9. import android.util.Log;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. import android.widget.Toast;  
  14. publicclass MusicServiceActivity extends Activity {  
  15.     //為日誌工具設定標籤
  16.     privatestatic String TAG = "MusicService";  
  17.     /** Called when the activity is first created. */
  18.     @Override  
  19.     publicvoid onCreate(Bundle savedInstanceState) {  
  20.         super.onCreate(savedInstanceState);  
  21.         setContentView(R.layout.main);  
  22.         //輸出Toast訊息和日誌記錄
  23.         Toast.makeText(this"MusicServiceActivity",  
  24.                 Toast.LENGTH_SHORT).show();  
  25.         Log.e(TAG, "MusicServiceActivity");  
  26.         initlizeViews();  
  27.     }  
  28.     privatevoid initlizeViews(){  
  29.         Button btnStart = (Button)findViewById(R.id.startMusic);  
  30.         Button btnStop = (Button)findViewById(R.id.stopMusic);  
  31.         Button btnBind = (Button)findViewById(R.id.bindMusic);  
  32.         Button btnUnbind = (Button)findViewById(R.id.unbindMusic);  
  33.         //定義點選監聽器
  34.         OnClickListener ocl = new OnClickListener() {  
  35.             @Override  
  36.             publicvoid onClick(View v) {  
  37.                 //顯示指定  intent所指的物件是個   service
  38.                 Intent intent = new Intent(MusicServiceActivity.this,MusicService.class);  
  39.                 switch(v.getId()){  
  40.                 case R.id.startMusic:  
  41.                     //開始服務
  42.                     startService(intent);  
  43.                     break;  
  44.                 case R.id.stopMusic:  
  45.                     //停止服務
  46.                     stopService(intent);  
  47.                     break;  
  48.                 case R.id.bindMusic:  
  49.                     //繫結服務
  50.                     bindService(intent, conn, Context.BIND_AUTO_CREATE);  
  51.                     break;  
  52.                 case R.id.unbindMusic:  
  53.                     //解綁服務
  54.                     unbindService(conn);  
  55.                     break;  
  56.                 }  
  57.             }  
  58.         };  
  59.          //繫結點選監聽
  60.         btnStart.setOnClickListener(ocl);  
  61.         btnStop.setOnClickListener(ocl);  
  62.         btnBind.setOnClickListener(ocl);  
  63.         btnUnbind.setOnClickListener(ocl);  
  64.     }  
  65.     //定義服務連結物件
  66.     final ServiceConnection conn = new ServiceConnection() {