AIDL

作者: 来自猴子的暴击 | 来源:发表于2016-09-07 11:10 被阅读76次

    创建一个接口,再里面定义方法

    package com.example.taidl;  
    interface ICalcAIDL  
    {  
        int add(int x , int y);  
        int min(int x , int y );  
    }
    

    build一下gen目录下会生成ICalcAIDL.java文件

    /*
     * This file is auto-generated.  DO NOT MODIFY.
     * Original file: /Users/dream/Downloads/android/androidProject/TAIDL/src/com/example/taidl/ICalcAIDL.aidl
     */
    package com.example.taidl;
    public interface ICalcAIDL extends android.os.IInterface
    {
    /** Local-side IPC implementation stub class. */
    public static abstract class Stub extends android.os.Binder implements com.example.taidl.ICalcAIDL
    {
    private static final java.lang.String DESCRIPTOR = "com.example.taidl.ICalcAIDL";
    /** Construct the stub at attach it to the interface. */
    public Stub()
    {
    this.attachInterface(this, DESCRIPTOR);
    }
    /**
     * Cast an IBinder object into an com.example.taidl.ICalcAIDL interface,
     * generating a proxy if needed.
     */
    public static com.example.taidl.ICalcAIDL asInterface(android.os.IBinder obj)
    {
    if ((obj==null)) {
    return null;
    }
    android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
    if (((iin!=null)&&(iin instanceof com.example.taidl.ICalcAIDL))) {
    return ((com.example.taidl.ICalcAIDL)iin);
    }
    return new com.example.taidl.ICalcAIDL.Stub.Proxy(obj);
    }
    @Override 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_add:
    {
    data.enforceInterface(DESCRIPTOR);
    int _arg0;
    _arg0 = data.readInt();
    int _arg1;
    _arg1 = data.readInt();
    int _result = this.add(_arg0, _arg1);
    reply.writeNoException();
    reply.writeInt(_result);
    return true;
    }
    case TRANSACTION_min:
    {
    data.enforceInterface(DESCRIPTOR);
    int _arg0;
    _arg0 = data.readInt();
    int _arg1;
    _arg1 = data.readInt();
    int _result = this.min(_arg0, _arg1);
    reply.writeNoException();
    reply.writeInt(_result);
    return true;
    }
    }
    return super.onTransact(code, data, reply, flags);
    }
    private static class Proxy implements com.example.taidl.ICalcAIDL
    {
    private android.os.IBinder mRemote;
    Proxy(android.os.IBinder remote)
    {
    mRemote = remote;
    }
    @Override public android.os.IBinder asBinder()
    {
    return mRemote;
    }
    public java.lang.String getInterfaceDescriptor()
    {
    return DESCRIPTOR;
    }
    @Override public int add(int x, int y) 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);
    _data.writeInt(x);
    _data.writeInt(y);
    mRemote.transact(Stub.TRANSACTION_add, _data, _reply, 0);
    _reply.readException();
    _result = _reply.readInt();
    }
    finally {
    _reply.recycle();
    _data.recycle();
    }
    return _result;
    }
    @Override public int min(int x, int y) 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);
    _data.writeInt(x);
    _data.writeInt(y);
    mRemote.transact(Stub.TRANSACTION_min, _data, _reply, 0);
    _reply.readException();
    _result = _reply.readInt();
    }
    finally {
    _reply.recycle();
    _data.recycle();
    }
    return _result;
    }
    }
    static final int TRANSACTION_add = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    static final int TRANSACTION_min = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);
    }
    public int add(int x, int y) throws android.os.RemoteException;
    public int min(int x, int y) throws android.os.RemoteException;
    }
    

    新建一个Service

    package com.example.taidl;
    
    import android.app.Service;
    import android.content.Intent;
    import android.os.IBinder;
    import android.os.RemoteException;
    import android.util.Log;
    
    public class CalcService extends Service{
    
        private static final String TAG = "server";  
    
        public void onCreate()  
        {  
            Log.e(TAG, "onCreate");  
        }  
    
        public IBinder onBind(Intent t)  
        {  
            Log.e(TAG, "onBind");  
            return mBinder;  
        }  
    
        public void onDestroy()  
        {  
            Log.e(TAG, "onDestroy");  
            super.onDestroy();  
        }  
    
        public boolean onUnbind(Intent intent)  
        {  
            Log.e(TAG, "onUnbind");  
            return super.onUnbind(intent);  
        }  
    
        public void onRebind(Intent intent)  
        {  
            Log.e(TAG, "onRebind");  
            super.onRebind(intent);  
        }  
        private final ICalcAIDL.Stub mBinder = new ICalcAIDL.Stub() {
    
            @Override
            public int min(int x, int y) throws RemoteException {
                return x + y;
            }
    
            @Override
            public int add(int x, int y) throws RemoteException {
                // TODO Auto-generated method stub
                return x - y;
            }
        };
    }
    

    创建了一个mBinder对象,并在Service的onBind方法中返回
    注册Service

    <service android:name="com.example.taidl.CalcService">
                <intent-filter>  
                   <action android:name="com.example.taidl.calc" />  
    
                   <category android:name="android.intent.category.DEFAULT" />  
               </intent-filter>  
    </service>
    

    我们一会会在别的应用程序中通过Intent来查找此Service;这个不需要Activity,所以我也就没写Activity,安装完成也看不到安装图标,悄悄在后台运行着。服务端编写完毕。下面开始编写客户端:

    package com.example.tclient;
    
    import com.example.taidl.ICalcAIDL;
    
    import android.app.Activity;
    import android.content.ComponentName;
    import android.content.Context;
    import android.content.Intent;
    import android.content.ServiceConnection;
    import android.os.Bundle;
    import android.os.IBinder;
    import android.util.Log;
    import android.view.View;
    import android.widget.Toast;
    
    public class MainActivity extends Activity {
    
        private ICalcAIDL mCalcAidl;
    
        private ServiceConnection mServiceConn = new ServiceConnection()
        {
            @Override
            public void onServiceDisconnected(ComponentName name)
            {
                Log.e("client", "onServiceDisconnected");
                mCalcAidl = null;
            }
    
            @Override
            public void onServiceConnected(ComponentName name, IBinder service)
            {
                Log.e("client", "onServiceConnected");
                mCalcAidl = ICalcAIDL.Stub.asInterface(service);
            }
        };
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
        }
    
        /**
         * 点击BindService按钮时调用
         * @param view
         */
        public void bindService(View view)
        {
            Intent intent = new Intent();
            intent.setAction("com.example.taidl.calc");
            bindService(intent, mServiceConn, Context.BIND_AUTO_CREATE);
        }
        /**
         * 点击unBindService按钮时调用
         * @param view
         */
        public void unbindService(View view)
        {
            unbindService(mServiceConn);
        }
        /**
         * 点击12+12按钮时调用
         * @param view
         */
        public void addInvoked(View view) throws Exception
        {
    
            if (mCalcAidl != null)
            {
                int addRes = mCalcAidl.add(12, 12);
                Toast.makeText(this, addRes + "", Toast.LENGTH_SHORT).show();
            } else
            {
                Toast.makeText(this, "服务器被异常杀死,请重新绑定服务端", Toast.LENGTH_SHORT)
                        .show();
    
            }
    
        }
        /**
         * 点击50-12按钮时调用
         * @param view
         */
        public void minInvoked(View view) throws Exception
        {
    
            if (mCalcAidl != null)
            {
                int addRes = mCalcAidl.min(50, 12);
                Toast.makeText(this, addRes + "", Toast.LENGTH_SHORT).show();
            } else
            {
                Toast.makeText(this, "服务器未绑定或被异常杀死,请重新绑定服务端", Toast.LENGTH_SHORT)
                        .show();
    
            }
    
        }
    }
    

    将服务端的aidl文件完整的复制过来,包名一定要一致。

    相关文章

      网友评论

        本文标题:AIDL

        本文链接:https://www.haomeiwen.com/subject/xrsjettx.html