日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android Service的思考(4)

發布時間:2024/4/17 Android 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。