android service與activity雙向通訊

來源:互聯網
上載者:User
 

     前些日子在做音樂播放器的例子,在做的過程中要涉及到service 與activity之間的互動,於是乎就在網上搜羅例子,例子確實很多,但是涉及到他倆之間互相互動的例子就少了。於是乎決定把自己的例子寫下來,與大家分享,有不足之處還請各位多多指教(這是我在csdn上的第一篇博文,謝謝各位支援)

     service與activity之間通訊肯定需要用到AIDL技術,關於它就不具體的說了,網上一大推,直接上例子,例子比較直觀。

    (1) service端 AIDL檔案:檔案名稱  IMusicService.aidl

           package com.carsmart.music.aidl;            //引用用戶端的aidl(即activity端)           import com.carsmart.music.aidl.IPlayStatusChangeListener;             interface IMusicService {                    void addLisener(in IPlayStatusChangeListener psc);                   void play(String musPlayListName,int musicIndex);                   void playByDegree(int degree);                   void pause();                   void stop();                   void next();                   void previous();                   void setPlayPattern(int playPattern);                   int getProgress();                   int getDuration();                   String getPlayListName();                   int getMusicIndex();            } 

 

     (2)是要在Service 中的繼承IMusicService.Stub類(該類是寫好aidl檔案後,若沒錯,eclipse會自動在工程的gen檔案夾下產生一個IMusicService.java類)

      

        //返回給用戶端
public IBinder onBind(Intent intent) {// TODO Auto-generated method stubplayerProxy = new MusicPlayerProxy();return playerProxy;}//實現IMusicService.Stub子類
private class MusicPlayerProxy extends IMusicService.Stub{@Overridepublic void addLisener(IPlayStatusChangeListener psc)throws RemoteException {// TODO Auto-generated method stubmusicPlayer.addLisener(psc);}@Overridepublic void play(String musPlayListName, int musicIndex) throws RemoteException {// TODO Auto-generated method stubmusicPlayer.play(musPlayListName,musicIndex);}@Overridepublic void playByDegree(int degree) throws RemoteException {// TODO Auto-generated method stubmusicPlayer.playByDegree(degree);}@Overridepublic void pause() throws RemoteException {// TODO Auto-generated method stubmusicPlayer.pause();}@Overridepublic void stop() throws RemoteException {// TODO Auto-generated method stubmusicPlayer.stop();}@Overridepublic void next() throws RemoteException {// TODO Auto-generated method stubmusicPlayer.next();}@Overridepublic void previous() throws RemoteException {// TODO Auto-generated method stubmusicPlayer.previous();}@Overridepublic void setPlayPattern(int playPattern) throws RemoteException {// TODO Auto-generated method stubmusicPlayer.setPlayPattern(playPattern);}@Overridepublic int getProgress() throws RemoteException {// TODO Auto-generated method stubreturn musicPlayer.getProgress();}@Overridepublic int getDuration() throws RemoteException {// TODO Auto-generated method stubreturn musicPlayer.getDuration();}@Overridepublic String getPlayListName() throws RemoteException {// TODO Auto-generated method stubreturn musicPlayer.getPlayListName();}@Overridepublic int getMusicIndex() throws RemoteException {// TODO Auto-generated method stubreturn musicPlayer.getMusicIndex();}}

        (3)activity端的AIDL檔案:檔案名稱  IPlayStatusChangeListener.aidl    在我例子裡的作用就是監聽播放音樂的狀態及歌曲相關資訊

                   

        package com.carsmart.music.aidl;         //只能傳遞基本類型資料及string類型,若想傳遞複雜類型或自訂類型得讓被傳遞對象實現Serializable或Parcelable介面即可
         interface IPlayStatusChangeListener {                  void onPlayStatChange(int status);                 void onMusicInfoChange(String title,String artist);                 void onPlayMusicIndexChanged(String playListName,int musicIndex);          } 

          (4)在activity端實現IPlayStatusChangeListener.Stub

                    

       public class PlayStatusChangeAdapter  extends IPlayStatusChangeListener.Stub{  //播放狀態發生改變  @Override  public void onPlayStatChange(int status) throws RemoteException {// TODO Auto-generated method stub  }  //當播放歌曲發生改變時,把當前播放歌曲的名作者發過來,用於播放介面  @Override  public void onMusicInfoChange(String title,String artist) throws RemoteException {// TODO Auto-generated method stub  }  //當播放歌曲發生改變時,把播放清單名,索引廣播,用於涮新播放清單  @Override  public void onPlayMusicIndexChanged(String playListName, int musicIndex)throws RemoteException {// TODO Auto-generated method stub  }       }

             (5)在activity端 產生一個ServiceConnection子類,用於bindService串連服務端

 

     private class SerConn implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubims = IMusicService.Stub.asInterface(service);              try {//若在構造方法或onCreate方法裡設定有可能報null 指標錯誤(因ims有可能沒串連上)  設定監聽器if(plaStaChaListener != null){   ims.addLisener(plaStaChaListener);}} catch (RemoteException e) {e.printStackTrace();}}@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubims = null;}}

               (6)最後一步也是最輕鬆的一步即和伺服器串連

        
        
        SerConn conn = new SerConn();
        Intent service = new Intent("com.carsmart.music.aidl.IMusicService");        this.bindService(service, conn, this.activity.BIND_AUTO_CREATE);

   大功告成,希望各位多多指教

聯繫我們

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