android service与activity双向通信

原创 2012年03月31日 11:00:28
 


     前些日子在做音乐播放器的例子,在做的过程中要涉及到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 stub
		playerProxy = new MusicPlayerProxy();
		return playerProxy;
	}
	
	//实现IMusicService.Stub子类
	private class MusicPlayerProxy extends IMusicService.Stub{

		@Override
		public void addLisener(IPlayStatusChangeListener psc)
				throws RemoteException {
			// TODO Auto-generated method stub
			musicPlayer.addLisener(psc);
		}

		@Override
		public void play(String musPlayListName, int musicIndex) throws RemoteException {
			// TODO Auto-generated method stub
			musicPlayer.play(musPlayListName,musicIndex);
		}

		@Override
		public void playByDegree(int degree) throws RemoteException {
			// TODO Auto-generated method stub
			musicPlayer.playByDegree(degree);
		}

		@Override
		public void pause() throws RemoteException {
			// TODO Auto-generated method stub
			musicPlayer.pause();
		}

		@Override
		public void stop() throws RemoteException {
			// TODO Auto-generated method stub
			musicPlayer.stop();
		}

		@Override
		public void next() throws RemoteException {
			// TODO Auto-generated method stub
			musicPlayer.next();
		}

		@Override
		public void previous() throws RemoteException {
			// TODO Auto-generated method stub
			musicPlayer.previous();
		}

		@Override
		public void setPlayPattern(int playPattern) throws RemoteException {
			// TODO Auto-generated method stub
			musicPlayer.setPlayPattern(playPattern);
		}

		@Override
		public int getProgress() throws RemoteException {
			// TODO Auto-generated method stub
			return musicPlayer.getProgress();
		}

		@Override
		public int getDuration() throws RemoteException {
			// TODO Auto-generated method stub
			return musicPlayer.getDuration();
		}

		@Override
		public String getPlayListName() throws RemoteException {
			// TODO Auto-generated method stub
			return musicPlayer.getPlayListName();
		}

		@Override
		public int getMusicIndex() throws RemoteException {
			// TODO Auto-generated method stub
			return 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{

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// TODO Auto-generated method stub
			ims = IMusicService.Stub.asInterface(service);
	        
	      		try {
				
				//若在构造方法或onCreate方法里设置有可能报空指针错误(因ims有可能没连接上)  设置监听器
				if(plaStaChaListener != null){
				   ims.addLisener(plaStaChaListener);
				}
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			ims = null;
		}
		
	}


               (6)最后一步也是最轻松的一步即和服务器连接

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

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

相关文章推荐

Android Service和Activity基于串口蓝牙模块的双向通信【第二篇】

一直以来都想利用手机来控制一些东西,比如电灯,电风扇等家电或者智能小车等. 驱动蓝牙模块可以在Activity中直接调用,也可以在多线程下直接使用,但这样会存在一个缺陷:当你按下手机的Home或者B...

Android Service和Activity基于串口蓝牙模块的双向通信【第二篇】

一直以来都想利用手机来控制一些东西,比如电灯,电风扇等家电或者智能小车等. 驱动蓝牙模块可以在Activity中直接调用,也可以在多线程下直接使用,但这样会存在一个缺陷:当你按下手机的Home或...

android中activity与service的双向通信

1:在onResume()方法中绑定服务,即调用bindService方法,bindService方法会调用
  • hfsime
  • hfsime
  • 2014年09月20日 20:38
  • 177

Android Service与Activity双向通信的两种方式

本博客只讲述同一个进程中activity和Service的通信,进程间通信可以使用AIDL,后续博客更新.关于Service的认识service是一种组件,不是单独的线程或者进程,它属于UI线程,只不...

不使用ipc 实现 Activity与Service双向通信

//直接上代码 Service : public class UploadPictureService extends Service{ public static final St...

Android中通过Messenger与Service实现进程间双向通信

转载博客原文:http://blog.csdn.net/iispring/article/details/48329925 Android中的Service和其调用者既可以在同一个App中,也可...

Android Service详解(七)---绑定服务BoundService详解之Messenger双向通信的实现

Android Service详解(七)---绑定服务BoundService详解之Messenger双向通信的实现 这是第七篇文章主要讲的是BoundService中用Messenger实现IP...

稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service)

[索引页] [源码下载] 稳扎稳打Silverlight(23) - 2.0通信之调用WCF的双向通信(Duplex Service) 作者:webabcd 介绍 ...

Android应用开发提高篇(4)-----Socket编程(多线程、双向通信)

一、概述       关于Socket编程的基本方法在基础篇里已经讲过,今天把它给完善了。加入了多线程,这样UI线程就不会被阻塞;实现了客户端和服务器的双向通信,只要客户端发起了连接并成功连接后那么...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android service与activity双向通信
举报原因:
原因补充:

(最多只允许输入30个字)