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中Activity与Service的双向通讯

Android中Activity与本地Service的双向通讯
  • BrilliantEagle
  • BrilliantEagle
  • 2015年11月11日 23:48
  • 2000

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

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

Android消息通信之无所不能的第三方开源项目EventBus

 Android消息通信之无所不能的第三方开源项目EventBus 在Android开发中,消息通信在开发过程中是比较重要但比较略微繁琐的过程,比如,Activity与Fragment之间的消...
  • zhangphil
  • zhangphil
  • 2015年10月26日 13:06
  • 1333

Android学习之Activity与Service进行通信的三种方式

Activity与Service进行通信的三种方式 第一种 简单通信 直接通过Intent进行传值,我们在启动一个Service的时候通过Intent的对象向Service进行传值,这种方式传...
  • qq_28468727
  • qq_28468727
  • 2016年08月07日 19:02
  • 15041

Android Service与Activity之间通信的几种方式

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activ...
  • xiaanming
  • xiaanming
  • 2013年08月05日 00:11
  • 187982

Android开发之Service与多个Activity通信

本文转载自:http://www.cnblogs.com/ivan-xu/archive/2014/11/02/4069479.html,感谢原文作者的贡献 !...
  • itluochen
  • itluochen
  • 2016年08月09日 23:18
  • 2043

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

http://blog.csdn.net/cen616899547/article/details/6728040 一直以来都想利用手机来控制一些东西,比如电灯,电风扇等家电或者...
  • daditao
  • daditao
  • 2015年02月11日 22:23
  • 2089

关于android编程中service和activity的区别

一、 绝大部分情况下,Service的作用是用来“执行”后台的、耗时的、重要的任务,三者缺一不可,而最重要的原因是第三点:要执行重要的任务。 因为当一个进程启动了Service后,进程的优先级变高了,...
  • foreverhuylee
  • foreverhuylee
  • 2014年03月03日 14:26
  • 6795

android中Activity与service之间相互通信的实现方式

使用intent代参,intent可以带基础数据类型,基础数据类型的数组,序列化对象,集合 使用广播 使用单例模式,在activity与service中少用 bindService获取引用,AIDL(...
  • Dr_abandon
  • Dr_abandon
  • 2016年11月10日 19:47
  • 582

android中activity与service的双向通信

1:在onResume()方法中绑定服务,即调用bindService方法,bindService方法会调用
  • hfsime
  • hfsime
  • 2014年09月20日 20:38
  • 208
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android service与activity双向通信
举报原因:
原因补充:

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