Android中不使用AIDL實現Service的遠程調用

來源:互聯網
上載者:User

標籤:android   aidl   service   遠程調用   

優點:Client端與Server端的DESCRIPTOR可以自訂,不受包名限制


實質中其實是使用底層Binder機制提供的Java層介面 Binder 、IInterface等去實現

用戶端中使用transact發起處理序間通訊請求,服務端會回調onTransact來處理請求


Common Interface:

public interface ITimeCountService {int getCount() throws RemoteException;} 


Server:

public abstract class TimeCountStub extends android.os.Binder implementsIInterface, ITimeCountService {private static final java.lang.String DESCRIPTOR = "com.example.servicedemo.nonaidl.ITimeCountService";/** Construct the stub at attach it to the interface. */public TimeCountStub() {this.attachInterface(this, DESCRIPTOR);}@Overridepublic android.os.IBinder asBinder() {return this;}@Overridepublic 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_getCount: {data.enforceInterface(DESCRIPTOR);int _result = this.getCount();reply.writeNoException();reply.writeInt(_result);return true;}}return super.onTransact(code, data, reply, flags);}static final int TRANSACTION_getCount = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);}


Client:

public class TimeCountProxy implements /*IInterface,*/ ITimeCountService {private static final java.lang.String DESCRIPTOR = "com.example.servicedemo.nonaidl.ITimeCountService";private android.os.IBinder mRemote;TimeCountProxy(android.os.IBinder remote) {mRemote = remote;}//@Override//public android.os.IBinder asBinder() {//return mRemote;//}public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR;}/** * Cast an IBinder object into an * com.example.servicedemo.nonaidl.ITimeCountService interface, generating a * proxy if needed. */public static ITimeCountService asInterface(android.os.IBinder obj) {if ((obj == null)) {return null;}android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin != null) && (iin instanceof ITimeCountService))) {return ((ITimeCountService) iin);}return new TimeCountProxy(obj);}@Overridepublic int getCount() throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();int _result;try {_data.writeInterfaceToken(DESCRIPTOR);mRemote.transact(TimeCountStub.TRANSACTION_getCount, _data, _reply,0);_reply.readException();_result = _reply.readInt();} finally {_reply.recycle();_data.recycle();}return _result;}}


Service中片段:

public class TimeCountService extends Service {...TimeCountStub stub = new TimeCountStub() {@Overridepublic int getCount() throws RemoteException {return count;}};@Overridepublic IBinder onBind(Intent intent) {Log.i(TAG, "onBind");return stub;}...}


Client中片段:

public class MainActivity extends Activity {...private ITimeCountService timeCountService;private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.i(TAG, "onServiceConnected");timeCountService = TimeCountProxy.asInterface(service);Log.i(TAG, "timeCountService: " + timeCountService);canTimeUpdateTaskRunning = true;TimeUpateTask t = new TimeUpateTask();t.execute(new Object());Log.i(TAG, "task status: " + t.getStatus());}@Overridepublic void onServiceDisconnected(ComponentName name) {Log.i(TAG, "onServiceDisconnected");}};...}


Android中不使用AIDL實現Service的遠程調用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.