Android使用Service實現簡單音樂播放實例,android service

8
回復
1575
查看
打印 上一主題 下一主題
[復制鏈接]

443

主題

1206

帖子

1947

安幣

手工藝人

樓主
發表于 2018-5-23 14:37:52 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

            

         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文件的源碼:

[Java] 查看源文件 復制代碼
<

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

[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源碼:

[Java] 查看源文件 復制代碼
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 = "musicservice"; 
   
  /** called when the activity is first created. */ 
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
    setcontentview(r.layout.main); 
     
    //輸出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,或者瀏覽新聞等等。






        
分享到:  QQ好友和群 QQ空間 微信
收藏
收藏0
支持
支持0
反對
反對0

85

主題

9852

帖子

2189

安幣

Android大神

Rank: 6Rank: 6

沙發
發表于 2018-5-23 15:32:38 | 只看該作者
幫幫頂頂!!

325

主題

1022

帖子

701

安幣

手工藝人

板凳
發表于 2018-5-23 16:11:30 | 只看該作者
安卓巴士是個不錯的網站,我來頂個貼~

501

主題

1225

帖子

2030

安幣

手工藝人

地板
發表于 2018-5-23 16:53:12 | 只看該作者
樓主威武,以后多發干貨,多辦活動~!

449

主題

1216

帖子

1948

安幣

手工藝人

5#
發表于 2018-5-23 17:11:55 | 只看該作者
幫幫頂頂!!

62

主題

9830

帖子

897

安幣

代碼手工藝人

學海無涯

Rank: 4

QQ達人

6#
發表于 2018-5-23 18:08:47 | 只看該作者
安卓巴士是個不錯的網站,我來頂個貼~

9

主題

9606

帖子

1764

安幣

Android大神

Rank: 6Rank: 6

7#
發表于 2018-5-23 18:52:48 | 只看該作者
支持樓主,支持安卓巴士!

0

主題

50

帖子

123

安幣

程序猿

Rank: 2

8#
發表于 2020-1-30 15:26:52 | 只看該作者
感謝分享,安卓巴士有你更精彩:)
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

四方棋牌官网app下载 贵州闲来麻将下载 四川熊猫麻将手机版 大连穷胡麻将手机下 20选5走势图河北 十大老品牌网赌信誉平台 姚记棋牌靠谱吗 最准的特马网站 免费1 电子信息股票有哪些 武汉麻将红中赖子皮 15选5百分百*技 股票几时开盘 幸运赛车号码走势 微信网上捕鱼 奕乐贵州捉鸡麻将 三中三期期准精选资料 刺激战场(单机破解版)