android service与activity双向通信

来源:互联网 发布:c语言合法标识符 编辑:程序博客网 时间:2024/05/07 11:59
 


     前些日子在做音乐播放器的例子,在做的过程中要涉及到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方法里设置有可能报空指针错误(因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);

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