前些日子在做音樂播放器的例子,在做的過程中要涉及到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); 大功告成,希望各位多多指教