生活随笔
收集整理的這篇文章主要介紹了
Android Service的思考(4)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在android平臺中,一個進程通常不能訪問其他進程中的內存區域的。但是,我們可以使用IDL語言來把對象偽裝成操作系統能理解的簡單形式,以便偽裝成對象跨越邊界訪問。
如果想在應用程序中調用其他進程中的Service,則需要用到AIDL,AIDL(android接口描述語言)是一種IDL語言,它可以生成一段代碼,可以使在一個android設備上運行的兩個進程使用內部通信進程進行交互。如果你需要在一個進程中(例如:在一個Activity中)訪問另一個進程中(例如:一個Service)某個對象的方法,你就可以使用AIDL來生成這樣的代碼來偽裝傳遞各種參數。 ?
使用AIDL的方法如下: 1.首先生成一個IMusicService.aidl的服務接口,Android會自動生成一個 Stub類,這個類繼承了BInder類,同時繼承了IMusicService這個接口,還可以看到其中包含了一個Proxy代理類,以實現遠程代理。(aidl和Stub類如下所示) ? [Copy to clipboard] Download?zuiniuwang.java /** ? ?*?IMusicService.aidl ? ?*?com.androidtest.service.mediaplayer ? ?* ? ?*?Function:?TODO ? ?* ? ?*???ver?????date???????????author ? ?*?────────────────────────────────── ? ?*???????????2011-5-19??????Leon ? ?* ? ?*?Copyright?(c)?2011,?TNT?All?Rights?Reserved. ? */ ? ? ? package?com.androidtest.service.mediaplayer; ? /** ? ?*?ClassName:IMusicService ? ?*?Function:?TODO?ADD?FUNCTION ? ?*?Reason:???TODO?ADD?REASON ? ?* ? ?*?@author???Leon ? ?*?@version ? ?*?@since????Ver?1.1 ? ?*?@Date?????2011-5-19 ? ?*/ ? ? ? interface?IMusicService{ ? ????void?play(); ? ????void?pause(); ? ????void?stop(); ? } ? ? ? /* ? ?*?This?file?is?auto-generated.??DO?NOT?MODIFY. ? ?*?Original?file:?D:\\Backup\\�?��?�\\Dropbox\\investment\\A8\\workspace\\androidtest\\src\\com\\androidtest\\service\\mediaplayer\\IMusicService.aidl ? ?*/ ? package?com.androidtest.service.mediaplayer; ? ? ? /** ? ?*?ClassName:IMusicService?Function:?TODO?ADD?FUNCTION?Reason:?TODO?ADD?REASON ? ?* ? ?*?@author?Leon ? ?*?@version ? ?*?@since?Ver?1.1 ? ?*?@Date?2011-5-19 ? ?*/ ? public?interface?IMusicService?extends?android.os.IInterface?{ ? ????/**?Local-side?IPC?implementation?stub?class.?*/ ? ????public?static?abstract?class?Stub?extends?android.os.Binder?implements ? ????????????com.androidtest.service.mediaplayer.IMusicService?{ ? ????????private?static?final?java.lang.String? DESCRIPTOR ?=? "com.androidtest.service.mediaplayer.IMusicService" ; ? ? ? ????????/**?Construct?the?stub?at?attach?it?to?the?interface.?*/ ? ????????public?Stub()?{ ? ????????????this.attachInterface(this,?DESCRIPTOR); ? ????????} ? ? ? ????????/** ? ?????????*?Cast?an?IBinder?object?into?an ? ?????????*?com.androidtest.service.mediaplayer.IMusicService?interface, ? ?????????*?generating?a?proxy?if?needed. ? ?????????*/ ? ????????public?static?com.androidtest.service.mediaplayer.IMusicService?asInterface( ? ????????????????android.os.IBinder?obj)?{ ? ????????????if?(( obj ?==?null))?{ ? ????????????????return?null; ? ????????????} ? ????????????android.os.IInterface? iin ?=?(android.os.IInterface)?obj ? ????????????????????.queryLocalInterface(DESCRIPTOR); ? ????????????if?(((iin?!=?null)?&&?(iin?instanceof?com.androidtest.service.mediaplayer.IMusicService)))?{ ? ????????????????return?((com.androidtest.service.mediaplayer.IMusicService)?iin); ? ????????????} ? ????????????return?new?com.androidtest.service.mediaplayer.IMusicService.Stub.Proxy( ? ????????????????????obj); ? ????????} ? ? ? ????????public?android.os.IBinder?asBinder()?{ ? ????????????return?this; ? ????????} ? ? ? ????????@Override ? ????????public?boolean?onTransact(int?code,?android.os.Parcel?data, ? ????????????????android.os.Parcel?reply,?int?flags) ? ????????????????throws?android.os.RemoteException?{ ? ????????????switch?(code)?{ ? ????????????case?INTERFACE_TRANSACTION:?{ ? ????????????????reply.writeString(DESCRIPTOR); ? ????????????????return?true; ? ????????????} ? ????????????case?TRANSACTION_play:?{ ? ????????????????data.enforceInterface(DESCRIPTOR); ? ????????????????this.play(); ? ????????????????reply.writeNoException(); ? ????????????????return?true; ? ????????????} ? ????????????case?TRANSACTION_pause:?{ ? ????????????????data.enforceInterface(DESCRIPTOR); ? ????????????????this.pause(); ? ????????????????reply.writeNoException(); ? ????????????????return?true; ? ????????????} ? ????????????case?TRANSACTION_stop:?{ ? ????????????????data.enforceInterface(DESCRIPTOR); ? ????????????????this.stop(); ? ????????????????reply.writeNoException(); ? ????????????????return?true; ? ????????????} ? ????????????} ? ????????????return?super.onTransact(code,?data,?reply,?flags); ? ????????} ? ? ? ????????private?static?class?Proxy?implements ? ????????????????com.androidtest.service.mediaplayer.IMusicService?{ ? ????????????private?android.os.IBinder?mRemote; ? ? ? ????????????Proxy(android.os.IBinder?remote)?{ ? ???????????????? mRemote ?=? remote ; ? ????????????} ? ? ? ????????????public?android.os.IBinder?asBinder()?{ ? ????????????????return?mRemote; ? ????????????} ? ? ? ????????????public?java.lang.String?getInterfaceDescriptor()?{ ? ????????????????return?DESCRIPTOR; ? ????????????} ? ? ? ????????????public?void?play()?throws?android.os.RemoteException?{ ? ????????????????android.os.Parcel? _data ?=? android .os.Parcel.obtain(); ? ????????????????android.os.Parcel? _reply ?=? android .os.Parcel.obtain(); ? ????????????????try?{ ? ????????????????????_data.writeInterfaceToken(DESCRIPTOR); ? ????????????????????mRemote.transact(Stub.TRANSACTION_play,?_data,?_reply,?0); ? ????????????????????_reply.readException(); ? ????????????????}?finally?{ ? ????????????????????_reply.recycle(); ? ????????????????????_data.recycle(); ? ????????????????} ? ????????????} ? ? ? ????????????public?void?pause()?throws?android.os.RemoteException?{ ? ????????????????android.os.Parcel? _data ?=? android .os.Parcel.obtain(); ? ????????????????android.os.Parcel? _reply ?=? android .os.Parcel.obtain(); ? ????????????????try?{ ? ????????????????????_data.writeInterfaceToken(DESCRIPTOR); ? ????????????????????mRemote.transact(Stub.TRANSACTION_pause,?_data,?_reply,?0); ? ????????????????????_reply.readException(); ? ????????????????}?finally?{ ? ????????????????????_reply.recycle(); ? ????????????????????_data.recycle(); ? ????????????????} ? ????????????} ? ? ? ????????????public?void?stop()?throws?android.os.RemoteException?{ ? ????????????????android.os.Parcel? _data ?=? android .os.Parcel.obtain(); ? ????????????????android.os.Parcel? _reply ?=? android .os.Parcel.obtain(); ? ????????????????try?{ ? ????????????????????_data.writeInterfaceToken(DESCRIPTOR); ? ????????????????????mRemote.transact(Stub.TRANSACTION_stop,?_data,?_reply,?0); ? ????????????????????_reply.readException(); ? ????????????????}?finally?{ ? ????????????????????_reply.recycle(); ? ????????????????????_data.recycle(); ? ????????????????} ? ????????????} ? ????????} ? ? ? ????????static?final?int? TRANSACTION_play ?=?(android.os.IBinder.FIRST_CALL_TRANSACTION?+?0); ? ????????static?final?int? TRANSACTION_pause ?=?(android.os.IBinder.FIRST_CALL_TRANSACTION?+?1); ? ????????static?final?int? TRANSACTION_stop ?=?(android.os.IBinder.FIRST_CALL_TRANSACTION?+?2); ? ????} ? ? ? ????public?void?play()?throws?android.os.RemoteException; ? ? ? ????public?void?pause()?throws?android.os.RemoteException; ? ? ? ????public?void?stop()?throws?android.os.RemoteException; ? }? 2. 在MyRemoteBinder需要繼承這個Stub類,對播放器的控制寫在這個Binder類中
? [Copy to clipboard] Download?zuiniuwang.java /** ? ?*?MyRemoteBinder.java ? ?*?com.androidtest.service.mediaplayer ? ?* ? ?*?Function:?TODO ? ?* ? ?*???ver?????date???????????author ? ?*?────────────────────────────────── ? ?*???????????2011-5-19??????Leon ? ?* ? ?*?Copyright?(c)?2011,?TNT?All?Rights?Reserved. ? */ ? ? ? package?com.androidtest.service.mediaplayer; ? ? ? import?android.media.MediaPlayer; ? import?android.os.Binder; ? import?android.os.RemoteException; ? ? ? /** ? ?*?ClassName:MyRemoteBinder ? ?*?Function:?TODO?ADD?FUNCTION ? ?*?Reason:???TODO?ADD?REASON ? ?* ? ?*?@author???Leon ? ?*?@version ? ?*?@since????Ver?1.1 ? ?*?@Date?????2011-5-19 ? ?*/ ? public?class?MyRemoteBinder?extends?IMusicService.Stub{ ? ? ? ????public??MyRemoteBinder(MediaPlayer?mediaPlayer){ ? ???????? MyMediaController.mediaPlayer =mediaPlayer?; ? ????}; ? ? ? ????@Override ? ????public?void?play()?throws?RemoteException?{ ? ? ? ????????//?TODO?Auto-generated?method?stub ? ????????MyMediaController.play.execute(); ? ? ? ????} ? ? ? ????@Override ? ????public?void?pause()?throws?RemoteException?{ ? ? ? ????????//?TODO?Auto-generated?method?stub ? ????????MyMediaController.pause.execute(); ? ? ? ????} ? ? ? ????@Override ? ????public?void?stop()?throws?RemoteException?{ ? ? ? ????????//?TODO?Auto-generated?method?stub ? ????????MyMediaController.stop.execute(); ? ? ? ????};? ? ? ? }? 3. 在Activity中得到Binder的方式,是通過Stub類的IMusicService.Stub.asInterface(binder)方法
? [Copy to clipboard] Download?zuiniuwang.java private?ServiceConnection? myServiceConnection ?=? new ?ServiceConnection()?{ ? ? ????@Override ? ????public?void?onServiceConnected(ComponentName?name,?IBinder?binder)?{ ? ???????? musicServiceInterface ?=? IMusicService .Stub.asInterface(binder); ? ????????Log.d(TAG,?"?onServiceConnected"); ? ????} ? ? ????@Override ? ????public?void?onServiceDisconnected(ComponentName?name)?{ ? ???????? musicServiceInterface ?=? null ; ? ????????Log.d(TAG,?"?onServiceDisconnected"); ? ????} ? ? };? ?
本文轉自 最牛傻蛋 51CTO博客,原文鏈接:http://blog.51cto.com/zuiniuwang/718309,如需轉載請自行聯系原作者
總結
以上是生活随笔 為你收集整理的Android Service的思考(4) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。