欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android通過startService播放背景音樂

 更新時間:2021年09月08日 08:45:54   作者:孫群  
這篇文章主要介紹了Android通過startService播放背景音樂簡單示例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

關(guān)于startService的基本使用概述及其生命周期可參見《Android中startService基本使用方法概述》。

本文通過播放背景音樂的簡單示例,演示startService的基本使用流程,具體內(nèi)容如下

系統(tǒng)界面如下:

界面上面就兩個按鈕,”播放音樂并退出Activity” 和 “停止播放音樂”。我們在該示例中,通過操縱Activity的按鈕控制MusicService播放或停止播放音樂。

我將一個名為music.mp3的放到資源目錄/res/raw文件夾下面,這樣我們在程序中就可以通過R.raw.music引用該音樂文件,放入/res/raw文件夾中的資源文件會保持原來的面貌不會被編譯成二進(jìn)制。

MusicService是用于播放背景音樂的Service,其代碼如下所示:

package com.ispring.startservicedemo;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.widget.Toast;

import java.io.IOException;

public class MusicService extends Service {

  private MediaPlayer mediaPlayer = null;

  private boolean isReady = false;

  @Override
  public void onCreate() {
    //onCreate在Service的生命周期中只會調(diào)用一次
    super.onCreate();

    //初始化媒體播放器
    mediaPlayer = MediaPlayer.create(this, R.raw.music);
    if(mediaPlayer == null){
      return;
    }

    mediaPlayer.stop();
    mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
      @Override
      public boolean onError(MediaPlayer mp, int what, int extra) {
        mp.release();
        stopSelf();
        return false;
      }
    });

    try{
      mediaPlayer.prepare();
      isReady = true;
    } catch (IOException e) {
      e.printStackTrace();
      isReady = false;
    }

    if(isReady){
      //將背景音樂設(shè)置為循環(huán)播放
      mediaPlayer.setLooping(true);
    }
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    //每次調(diào)用Context的startService都會觸發(fā)onStartCommand回調(diào)方法
    //所以onStartCommand在Service的生命周期中可能會被調(diào)用多次
    if(isReady && !mediaPlayer.isPlaying()){
      //播放背景音樂
      mediaPlayer.start();
      Toast.makeText(this, "開始播放背景音樂", Toast.LENGTH_LONG).show();
    }
    return START_STICKY;
  }

  @Override
  public IBinder onBind(Intent intent) {
    //該Service中不支持bindService方法,所以此處直接返回null
    return null;
  }

  @Override
  public void onDestroy() {
    //當(dāng)調(diào)用Context的stopService或Service內(nèi)部執(zhí)行stopSelf方法時就會觸發(fā)onDestroy回調(diào)方法
    super.onDestroy();
    if(mediaPlayer != null){
      if(mediaPlayer.isPlaying()){
        //停止播放音樂
        mediaPlayer.stop();
      }
      //釋放媒體播放器資源
      mediaPlayer.release();
      Toast.makeText(this, "停止播放背景音樂", Toast.LENGTH_LONG).show();
    }
  }
}

MusicActivity的代碼如下所示:

package com.ispring.startservicedemo;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;


public class MusicActivity extends Activity implements Button.OnClickListener {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_music);
  }

  @Override
  public void onClick(View v) {
    if(v.getId() == R.id.btnStart){
      //播放背景音樂
      Intent intent = new Intent(this, MusicService.class);
      startService(intent);
      //退出當(dāng)前Activity
      this.finish();
    }else if(v.getId() == R.id.btnStop){
      //停止播放音樂
      Intent intent = new Intent(this, MusicService.class);
      stopService(intent);
    }
  }
}

當(dāng)我們單擊了按鈕”播放音樂并退出Activity”之后,我們首先通過Activity的startService啟動MusicService,然后我們立即調(diào)用了Activity的finish方法銷毀了當(dāng)前的Activity??赡艽蠹視枮槭裁匆N毀當(dāng)前的Activity?我們此處之所以調(diào)用Activity的finish方法不是從功能的角度出發(fā)的,而是從理解代碼運行的角度故意這么寫的: 執(zhí)行完Activity的finish方法之后,當(dāng)前的Activity就銷毀了, 在界面上看起來就是當(dāng)前UI消失了,應(yīng)用程序退出了,但稍等片刻你會聽到背景音樂響起。這從側(cè)面印證了Service的一個特性: Service與Activity等一樣,也是一種基本的應(yīng)用程序組件,Service無需依賴任何的Activity便可獨自在沒有任何UI界面的情況下悠閑地在Android后臺默默運行。

調(diào)用了startService之后,Android Framework接收到了intent信息,第一次會先創(chuàng)建MusicService的實例,執(zhí)行MusicService的onCreate回調(diào)方法,onCreate在Service的生命周期中只會調(diào)用一次,我們在其onCreate方法中將R.raw.music初始化為媒體播放器,并調(diào)用媒體播放器的prepare方法。然后我們將播放器設(shè)置為循環(huán)播放狀態(tài)。需要注意的是,在實際生產(chǎn)環(huán)境中,我們應(yīng)該注冊播放器的setOnPreparedListener并調(diào)用prepareAsync()方法,為了簡化代碼起見,我們只調(diào)用了播放器的同步方法prepare()。

調(diào)用了onCreate方法后,Android會自動回調(diào)其onStartCommand方法,其實每次調(diào)用Context的startService都會觸發(fā)onStartCommand回調(diào)方法,所以onStartCommand在Service的生命周期中可能會被調(diào)用多次。所以我們在MusicService的onStartCommand中做了判斷,判斷播放器是否是在播放中,如果當(dāng)前播放器沒有播放我們才調(diào)用播放器的start方法播放背景音樂。

當(dāng)我們單擊了按鈕”播放音樂并退出Activity”之后,MusicService啟動起來,播放背景音樂,但是Activity卻銷毀了,程序的UI界面不見了。為了能夠停止播放背景音樂,我們需要再次單擊應(yīng)用程序圖標(biāo),重新打開MusicActivity,然后單擊界面上的”停止播放音樂”按鈕,此時我們會調(diào)用Activity的stopService方法,Android Framework接收到要停止服務(wù)的intent之后會回調(diào)MusicService的onDestroy方法,在該方法中我們停止播放音樂并釋放媒體播放器資源。

本文只是通過播放背景音樂這一簡單示例演示通過startService啟動Service基本使用流程,代碼沒有進(jìn)行優(yōu)化,希望對大家學(xué)習(xí)Service有所幫助。

相關(guān)文章

最新評論