亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android通過startService播放背景音樂

2020-04-11 11:10:58
字體:
來源:轉載
供稿:網友

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

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

系統界面如下:

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

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

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的生命周期中只會調用一次    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){      //將背景音樂設置為循環播放      mediaPlayer.setLooping(true);    }  }  @Override  public int onStartCommand(Intent intent, int flags, int startId) {    //每次調用Context的startService都會觸發onStartCommand回調方法    //所以onStartCommand在Service的生命周期中可能會被調用多次    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() {    //當調用Context的stopService或Service內部執行stopSelf方法時就會觸發onDestroy回調方法    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);      //退出當前Activity      this.finish();    }else if(v.getId() == R.id.btnStop){      //停止播放音樂      Intent intent = new Intent(this, MusicService.class);      stopService(intent);    }  }}

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

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

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩免费一区| 亚洲综合最新在线| 国产v综合v亚洲欧美久久| 亚洲女同性videos| 国产精品美女www| 欧美日韩在线一区| 日韩中文在线不卡| 亚洲人成网站999久久久综合| 中文字幕久久亚洲| 亚洲国产高清高潮精品美女| 91人人爽人人爽人人精88v| 久久91亚洲精品中文字幕| 欧美视频专区一二在线观看| 久久久精品国产网站| 亚洲精品91美女久久久久久久| 精品欧美aⅴ在线网站| 欧美黄色www| 欧美激情小视频| 2025国产精品视频| 国产精品久久久久9999| 亚洲国产精品小视频| 国产精品av免费在线观看| 久久国产精品视频| 清纯唯美亚洲综合| 亚洲久久久久久久久久久| 国产丝袜一区视频在线观看| 国外成人在线直播| 国产精品av在线| 日本成人在线视频网址| 色视频www在线播放国产成人| 国产成人亚洲综合青青| 成人免费自拍视频| 日韩欧美aⅴ综合网站发布| 国产精品自拍偷拍视频| 国产精品久久久久久久久| 亚洲国产天堂久久综合| 亚洲成人动漫在线播放| 伊是香蕉大人久久| 自拍偷拍亚洲在线| 992tv在线成人免费观看| 亚洲黄色有码视频| 国产欧美精品在线播放| 国产亚洲视频在线| 92国产精品视频| 久久亚洲精品小早川怜子66| 亚洲香蕉成人av网站在线观看| 精品国产一区二区三区久久狼5月| 国内精品久久久久久| 色噜噜狠狠狠综合曰曰曰| 国产精品69久久久久| 国产精品久久久久不卡| www国产亚洲精品久久网站| 国产精品99久久久久久人| 韩国19禁主播vip福利视频| 精品国产乱码久久久久久天美| 久久久久99精品久久久久| 午夜精品视频在线| 国产精品永久免费视频| 欧美激情第1页| 麻豆国产精品va在线观看不卡| 欧美在线激情网| 色综合视频一区中文字幕| 亚洲精品免费在线视频| 福利二区91精品bt7086| 久久精品夜夜夜夜夜久久| 精品一区精品二区| 欧美中文字幕视频在线观看| 狠狠躁天天躁日日躁欧美| 综合激情国产一区| 亚洲第一av网站| 懂色av一区二区三区| 亚洲韩国青草视频| 亚洲**2019国产| 日本久久亚洲电影| 日韩av日韩在线观看| 日韩在线观看免费| 国产成人高潮免费观看精品| 日韩精品免费电影| 亚洲视频在线观看| 77777少妇光屁股久久一区| 日韩欧美一区视频| 欧美日在线观看| 国产成人精品久久亚洲高清不卡| 国产精品稀缺呦系列在线| 欧美日韩午夜剧场| 国产91亚洲精品| 国产精品成人播放| 欧美视频一区二区三区…| 久久久久久久久久久久久久久久久久av| 色老头一区二区三区在线观看| 亚洲国产成人精品一区二区| 91精品国产91久久久久福利| 久久久久久久久国产精品| 深夜精品寂寞黄网站在线观看| 一区二区日韩精品| 国内精品国产三级国产在线专| 国产亚洲人成网站在线观看| xxav国产精品美女主播| 91精品国产综合久久香蕉最新版| 亚洲免费人成在线视频观看| 日韩中文字幕在线免费观看| 中文字幕在线观看日韩| 精品自拍视频在线观看| 日韩欧美一区二区三区久久| 亚洲人成网站免费播放| 久久免费精品日本久久中文字幕| 91精品国产91久久久久久最新| 亚洲综合大片69999| 日韩在线观看av| 亚洲国产欧美在线成人app| 国产精品久久久一区| 亚洲美女精品久久| 欧美在线国产精品| 国产精品综合久久久| 久久综合伊人77777| 国产99久久精品一区二区永久免费| 国产一区二区三区日韩欧美| 国产精品男女猛烈高潮激情| 欧美激情精品久久久久久免费印度| 中国日韩欧美久久久久久久久| 欧美激情第一页xxx| 欧美精品免费在线| 欧美激情综合色综合啪啪五月| 最新国产成人av网站网址麻豆| 中文字幕自拍vr一区二区三区| 奇米成人av国产一区二区三区| 中文字幕日韩精品在线观看| 中文字幕av一区中文字幕天堂| 国产亚洲欧洲高清一区| 成人午夜激情免费视频| 亚洲综合中文字幕68页| 国产成人精品久久二区二区91| 毛片精品免费在线观看| 欧美国产日韩免费| 91久久久久久久一区二区| 超碰日本道色综合久久综合| 久久久久久久色| 久久精品中文字幕一区| 国产区精品视频| 国产精品色悠悠| 久久久噜噜噜久久| 欧美天堂在线观看| 久久精品视频在线观看| 亚洲人成在线免费观看| 欧美视频国产精品| 亚洲精品电影网站| 久久久亚洲天堂| 97香蕉超级碰碰久久免费的优势| www.亚洲天堂| 国产suv精品一区二区三区88区| 日韩av片电影专区| 欧美一区二区视频97| 欧美三级欧美成人高清www| 日韩福利视频在线观看| 欧美在线观看视频| 国产精品成人av性教育| 国产精品免费电影| 91免费欧美精品| 在线观看亚洲区| 国产视频久久久久| 欧美又大粗又爽又黄大片视频| 成人在线观看视频网站| 国产精品女主播视频| 亚洲在线观看视频|