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);大功告成,希望各位多多指教
- android service与activity双向通信
- android中activity与service的双向通信
- Android Service与Activity双向通信的两种方式
- Messenger实现Activity与Service的双向通信
- 不使用ipc 实现 Activity与Service双向通信
- 使用Messenger进行Activity与Service之间的双向通信
- Android Service和Activity基于串口蓝牙模块的双向通信
- Android中通过Messenger与Service实现进程间双向通信
- Android中通过Messenger与Service实现进程间双向通信
- Android Service和Activity基于串口蓝牙模块的双向通信【第二篇】
- Android Service和Activity基于串口蓝牙模块的双向通信【第二篇】
- Android Service和Activity基于串口蓝牙模块的双向通信【第二篇】
- Android Service和Activity基于串口蓝牙模块的双向通信【第二篇】
- android activity与service通信
- Android Activity与Service通信
- Android service与Activity通信
- android activity 与service通信
- Android service 与 activity通信
- HP<惠普>大中华区总裁孙振耀退休感言
- jstl有关include的问题
- linux的mount命令详解
- JAVAWeb开发之Servlet-19.Filter
- Eclipse定制Content Assist代码补全功能
- android service与activity双向通信
- 线程复习笔记
- g++与gcc
- 搭建s2sh框架需要的jar包
- 5.python的路径相关操作——《深入python3》学习
- Java功能包-2进制,16进制,BCD,ascii转换
- mount: unknown filesystem type ‘ntfs’
- Android笔记:invalidate()和postInvalidate() 的区别及使用
- 将java项目生成exe可执行文件全过程