android 跨进程通讯 AIDL

跨进程如何通讯?两个进程无法直接通讯,通过Android系统底层间接通讯。基于service的aidl实现跨进程通讯。

什么叫AIDL? Android interface definition language,Android接口定义语言

什么时候使用?
AIDL IPC 多线程 多应用

Binder IPC 没有多线程 多应用

message IPC 没有多线程

 

使用

eclipse 

 

Androidstudio

new-folder-AIDL Folder 生成AIDL目录

 在目录中 new - AIDL - AIDL FILE 生成,要编译后,才可以调用

 

案列

 

新建两个app.

服务端app

new-folder-AIDL Folder 生成AIDL目录

 在目录中 new - AIDL - AIDL FILE 新建一个aidl文件

// IMyAidlInterface.aidl
package com.base.aidl;

// Declare any non-default types here with import statements

interface IMyAidlInterface {

        //计算两个数的和
        int add(int num1, int num2);

}

再提供一个service提供调用

public class IRemoteService extends Service {

    //当客户端绑定这个服务时 会执行
    @Override
    public IBinder onBind(Intent intent) {
        return iBinder;
    }

    private IBinder iBinder = new IMyAidlInterface.Stub(){

        @Override
        public int add(int num1, int num2) throws RemoteException {
            Log.e("TAG", "收到的数是:"+ num1+","+ num2);
            return num1+num2;
        }
    };
}

 

xml注册

        <service
            android:name=".IRemoteService"
            android:enabled="true" >
            <intent-filter>
                <action android:name="com.base.aidl.IRemoteService" />
            </intent-filter>
        </service>

 

客服端app

新建一个和服务端一样的AIDL,(包名,名称都要一样)

activity代码

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText eTNum1;
    private EditText eTNum2;
    private EditText eTNum3;
    private IMyAidlInterface iMyAid;


    private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            //绑定成功
            iMyAid = IMyAidlInterface.Stub.asInterface(iBinder);
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {
            //绑定结束
            iMyAid = null;
        }
    };

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

        initView();

        //启动绑定
        bindSer();
    }

    private void bindSer() {
        Intent intent = new Intent();
        intent.setComponent(new ComponentName("com.base.aidl", "com.base.aidl.IRemoteService"));
        bindService(intent, conn, Context.BIND_AUTO_CREATE);
    }

    private void initView() {

        eTNum1 = (EditText) findViewById(R.id.ed_num1);
        eTNum2 = (EditText) findViewById(R.id.ed_num2);
        eTNum3 = (EditText) findViewById(R.id.ed_res);

        findViewById(R.id.btn_add).setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        int num1 = Integer.parseInt(eTNum1.getText().toString());
        int num2 = Integer.parseInt(eTNum2.getText().toString());

        int num3;

        try {
            num3 = iMyAid.add(num1, num2);
            eTNum3.setText(num3 + "");
        } catch (RemoteException e) {
            e.printStackTrace();
            eTNum3.setText("出错了");
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(conn);
    }
}

 

布局省略

AIDL 数据类型

 

short不支持

list要表明 in 或者 out

parcelable 序列化

 

posted @ 2016-03-01 14:51  说好范特西  阅读(344)  评论(0编辑  收藏  举报