[Android應用]音樂播放器

來源:互聯網
上載者:User

標籤:des   android   c   class   blog   code   

 

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檔案的源碼:

 <?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"     >     <TextView        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="Welcome to Andy‘s blog!"        android:textSize="16sp"/>     <TextView        android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:text="音樂播放服務"/>     <Button        android:id="@+id/startMusic"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="開啟音樂播放服務"/>     <Button        android:id="@+id/stopMusic"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="停止音樂播放服務"/>    <Button       android:id="@+id/bindMusic"       android:layout_width="wrap_content"       android:layout_height="wrap_content"       android:text="綁定音樂播放服務"/>    <Button       android:id="@+id/unbindMusic"       android:layout_width="wrap_content"       android:layout_height="wrap_content"       android:text="解除 ——綁定音樂播放服務"/> </LinearLayout> 

 

 

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

 package com.andyidea.service; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.IBinder; import android.util.Log; import android.widget.Toast; public class MusicService extends Service {     //為日誌工具設定標籤     private static String TAG = "MusicService";     //定義音樂播放器變數     private MediaPlayer mPlayer;     //該服務不存在需要被建立時被調用,不管startService()還是bindService()都會啟動時調用該方法     @Override     public void onCreate() {         Toast.makeText(this, "MusicSevice onCreate()"                 , Toast.LENGTH_SHORT).show();         Log.e(TAG, "MusicSerice onCreate()");         mPlayer = MediaPlayer.create(getApplicationContext(), R.raw.music);         //設定可以重複播放         mPlayer.setLooping(true);         super.onCreate();     }     @Override     public void onStart(Intent intent, int startId) {         Toast.makeText(this, "MusicSevice onStart()"                 , Toast.LENGTH_SHORT).show();         Log.e(TAG, "MusicSerice onStart()");         mPlayer.start();         super.onStart(intent, startId);     }     @Override     public void onDestroy() {         Toast.makeText(this, "MusicSevice onDestroy()"                 , Toast.LENGTH_SHORT).show();         Log.e(TAG, "MusicSerice onDestroy()");         mPlayer.stop();         super.onDestroy();     }     //其他對象通過bindService 方法通知該Service時該方法被調用     @Override     public IBinder onBind(Intent intent) {         Toast.makeText(this, "MusicSevice onBind()"                 , Toast.LENGTH_SHORT).show();         Log.e(TAG, "MusicSerice onBind()");         mPlayer.start();         return null;     }     //其它對象通過unbindService方法通知該Service時該方法被調用     @Override     public boolean onUnbind(Intent intent) {         Toast.makeText(this, "MusicSevice onUnbind()"                 , Toast.LENGTH_SHORT).show();         Log.e(TAG, "MusicSerice onUnbind()");         mPlayer.stop();         return super.onUnbind(intent);     } } 

 

 

[4] src目錄下MusicServiceActivity源碼:

 package com.andyidea.service; import android.app.Activity; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; import android.os.IBinder; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MusicServiceActivity extends Activity {     //為日誌工具設定標籤     private static String TAG = "leeMusicService";     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.leemainmain);         //輸出Toast訊息和日誌記錄         Toast.makeText(this, "MusicServiceActivity",                 Toast.LENGTH_SHORT).show();         Log.e(TAG, "MusicServiceActivity");         initlizeViews();     }     private void initlizeViews(){         Button btnStart = (Button)findViewById(R.id.startMusic);         Button btnStop = (Button)findViewById(R.id.stopMusic);         Button btnBind = (Button)findViewById(R.id.bindMusic);         Button btnUnbind = (Button)findViewById(R.id.unbindMusic);         //定義點擊監聽器         OnClickListener ocl = new OnClickListener() {             @Override             public void onClick(View v) {                 //顯示指定  intent所指的對象是個   service                 Intent intent = new Intent(MusicServiceActivity.this,MusicService.class);                 switch(v.getId()){                 case R.id.startMusic:                     //開始服務                     startService(intent);                     break;                 case R.id.stopMusic:                     //停止服務                     stopService(intent);                     break;                 case R.id.bindMusic:                     //綁定服務                     bindService(intent, conn, Context.BIND_AUTO_CREATE);                     break;                 case R.id.unbindMusic:                     //解除綁定服務                     unbindService(conn);                     break;                 }             }         };          //綁定點擊監聽         btnStart.setOnClickListener(ocl);         btnStop.setOnClickListener(ocl);         btnBind.setOnClickListener(ocl);         btnUnbind.setOnClickListener(ocl);     }     //定義服務鏈結接對象     final ServiceConnection conn = new ServiceConnection() {         @Override         public void onServiceDisconnected(ComponentName name) {             Toast.makeText(MusicServiceActivity.this, "MusicServiceActivity onSeviceDisconnected"                     , Toast.LENGTH_SHORT).show();             Log.e(TAG, "MusicServiceActivity onSeviceDisconnected");         }         @Override         public void onServiceConnected(ComponentName name, IBinder service) {             Toast.makeText(MusicServiceActivity.this, "MusicServiceActivity onServiceConnected"                     ,Toast.LENGTH_SHORT).show();             Log.e(TAG, "MusicServiceActivity onServiceConnected");         }     }; } 

 

 

[5] 最後,我們別忘了在AndroidManifest.xml設定檔中添加對Service的註冊。即在application節點中添加

<service android:name=".MusicService"/> 進行註冊。

[6] 我們來看下程式運行後的Log.e中顯示的Service生命週期

[7] 我們在Android終端裝置中查看下剛才啟動的音樂播放服務,看看我們退出程式後,是不是該程式的服務還在啟動並執行呢?按如下步驟:Menu --> Settings --> Applications --> Running services 。在彈出的 Running services 中可以看到有哪些服務在運行。

這樣我們就看到我們退出程式後,是由於該服務還在後台運行著,所以我們的音樂還可以繼續播放著。就這樣,我們就可以一邊享受音樂,一邊可以聊QQ,或者瀏覽新聞等等。

Note: 具體代碼可以下載:MusicPlayerThroughService代碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.