Android學習筆記(6)—關於Service+MediaPlayer的使用

來源:互聯網
上載者:User

1、什麼是Service

Service可以在和多場合的應用中使用,比如播放多媒體的時候使用者啟動了其他Activity這個時候程式要在後台繼續播放,比如檢測SD卡上檔案的變化,再或者在後台記錄你地理資訊位置的改變等等,總之服務總是藏在背景。


2、兩種方法Service啟動流程

context.startService() 啟動流程:


context.startService()  -> onCreate()  -> onStart()  -> Service running  -> context.stopService()  -> onDestroy()  -> Service stop 

如果Service還沒有運行,則android先調用onCreate()然後調用onStart();

如果Service已經運行,則只調用onStart(),所以一個Service的onStart方法可能會重複調用多次。 

如果stopService的時候直接onDestroy,如果是調用者自己直接退出而沒有調用stopService的話,Service會一直在後台運行,該Service的調用者再啟動起來後可以通過stopService關閉Service。

所以調用startService的生命週期為:onCreate --> onStart(可多次調用) --> onDestroy


context.bindService()啟動流程:

context.bindService()  -> onCreate()  -> onBind()  -> Service running  -> onUnbind()  -> onDestroy()  -> Service stop
 

onBind()將返回給用戶端一個IBind介面執行個體,IBind允許用戶端回調服務的方法,比如得到Service的執行個體、運行狀態或其他動作。這個時候把調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Srevice就會調用onUnbind->onDestroy相應退出。 

所以調用bindService的生命週期為:onCreate --> onBind(只一次,不可多次綁定) --> onUnbind --> onDestory。

在Service每一次的開啟關閉過程中,只有onStart可被多次調用(通過多次startService調用),其他onCreate,onBind,onUnbind,onDestory在一個生命週期中只能被調用一次。


3、Service生命週期

Service的生命週期並不像Activity那麼複雜,它只繼承了onCreate()、onStart()、onDestroy()三個方法

當我們第一次啟動Service時,先後調用了onCreate()、onStart()這兩個方法;當停止Service時,則執行onDestroy()方法。

這裡需要注意的是,如果Service已經啟動了,當我們再次啟動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法。

4、一個簡單的例子:

定義一個MyService類

package com.ideal.study;import android.app.Service;import android.content.Intent;import android.media.MediaPlayer;import android.os.IBinder;public class MyService extends Service {private MediaPlayer mp;@Overridepublic void onCreate() {// TODO Auto-generated method stub// 初始化音樂資源try {System.out.println("create player");// 建立MediaPlayer對象mp = new MediaPlayer();mp = MediaPlayer.create(MyService.this, R.raw.bgmusic);  //mp.prepare();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();}super.onCreate();}@Overridepublic void onStart(Intent intent, int startId) {// TODO Auto-generated method stub// 開始播放音樂mp.start();// 音樂播放完畢的事件處理mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {public void onCompletion(MediaPlayer mp) {// TODO Auto-generated method stub// 迴圈播放try {mp.start();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});// 播放音樂時發生錯誤的事件處理mp.setOnErrorListener(new MediaPlayer.OnErrorListener() {public boolean onError(MediaPlayer mp, int what, int extra) {// TODO Auto-generated method stub// 釋放資源try {mp.release();} catch (Exception e) {e.printStackTrace();}return false;}});super.onStart(intent, startId);}@Overridepublic void onDestroy() {// TODO Auto-generated method stub// 服務停止時停止播放音樂並釋放資源mp.stop();mp.release();super.onDestroy();}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}}

在其他需要用到的Activity調用

開啟Service

//播放背景音樂Intent intentSV = new Intent(LearningFlashActivity.this, MyService.class);startService(intentSV);

關閉Service

//關閉背景音樂Intent intentSV = new Intent(LearningList.this, MyService.class);stopService(intentSV);

記住進行註冊

<service            android:name=".MyService" />

相關文章

聯繫我們

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