Android_IPC

一、概念
1.两个应用之间通信
AIDL:表示两者之间需要遵循的协议
2.范围: 如:Action或data启动另外一个应用的Activity或Service
3.角色:
1)服务端口(Server):
1)字面:与客户端口通讯的方式抽象成接口,并编写AIDL文件
2)常规:实现一个Server,处理客户端口请求
2) 客户端口(Client) :
1)字面:需要将服务端口AIDL文件CP过来,通过intent方式启动服务端Server
2)常规: app(Clilent) 唤起另外一个 APP (Server),并进行两者之间的通讯
二、代码
1.客户端口ActivityA

public class MainActivity extends AppCompatActivity {
    //用于接收实例
    private ServerAidl serverAidl;

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //连接服务
            //2.服务端给我们的Binder,调用asInterface,得到了ServerAidl实例
            serverAidl = ServerAidl.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            //连接中断
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent mIntent = new Intent(this, MessageServer.class);
        //1.绑定服务
        bindService(mIntent, mServiceConnection, Context.BIND_AUTO_CREATE);
    }

    public void getName(View v) {
        try {
            //3.获取实例的值
            Toast.makeText(this, serverAidl.getCliencName(), Toast.LENGTH_LONG).show();
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

2.客户端ActivityB

        Intent mIntent = new Intent(this, MessageServer.class);
        startService(mIntent);

3.MessageServer (ActivityA、B内容(MesageServer,ServerAidl是一样的)

public class MessageServer extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    /**
     *
     */
    private ServerAidl.Stub mBinder = new ServerAidl.Stub() {
        @Override
        public String getCliencName() throws RemoteException {
            return "小王";
        }

        @Override
        public int getAge() throws RemoteException {
            return 12;
        }

    };

}

4.ServerAidl.didl

interface ServerAidl {
String getCliencName();
int getAge();
}

5.ServerAidl.java

//这里是获取代理部分
       public static com.example.my_ipc_server.ServerAidl asInterface(android.os.IBinder obj) {
            if ((obj == null)) {
                return null;
            }
            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
            if (((iin != null) && (iin instanceof com.example.my_ipc_server.ServerAidl))) {
                return ((com.example.my_ipc_server.ServerAidl) iin);
            }
//  4.给我们返回了一个Proxy
            return new com.example.my_ipc_server.ServerAidl.Stub.Proxy(obj);
        }


  //这里是代理部分
 private static class Proxy implements com.example.my_ipc_server.ServerAidl {
            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
            //5.读取用户名
            public java.lang.String getCliencName() throws android.os.RemoteException {
                android.os.Parcel _data = android.os.Parcel.obtain();
                android.os.Parcel _reply = android.os.Parcel.obtain();
                java.lang.String _result;
                try {
                    _data.writeInterfaceToken(DESCRIPTOR);
                    //这里会调用服务端的transact
                    mRemote.transact(Stub.TRANSACTION_getCliencName, _data, _reply, 0);
                    //这里reply已经有值了
                    _reply.readException();
                    //把写入的值读取出来 
                    _result = _reply.readString();
                } finally {
                    _reply.recycle();
                    _data.recycle();
                }
              //最终将值返回
                return _result;
            }

4.这里是onTransact

 @Override
        //6.服务端口的onTransact方法将内容写入reply
        public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
            java.lang.String descriptor = DESCRIPTOR;
            switch (code) {
                case INTERFACE_TRANSACTION: {
                    reply.writeString(descriptor);
                    return true;
                }
                case TRANSACTION_getCliencName: {
                    data.enforceInterface(descriptor);
                    java.lang.String _result = this.getCliencName();
                    //服务端口将内容写入reply中
                    reply.writeNoException();
                    reply.writeString(_result);
                    return true;
                }...

你可能感兴趣的:(Android_IPC)