(AIDL)Android Interface definition language

来源:互联网 发布:龙珠激斗刷龙石软件 编辑:程序博客网 时间:2024/06/03 17:37

AIDL:接口定义语言(Android Interface definition language)

aidl是实现进程间通信的一种方法,习惯上用 服务端客户端 来区分通信的两端

1、服务端:被调用的一端

步骤:

1、创建.aidl文件
2、实现接口
3、将接口暴露给客户端

2、客户端:调用的一端

步骤:
1、绑定服务
 2、绑定服务后回调被绑定服务中的方法
下面是一个使用aidl进行加法运算的Demo

服务端:

1.1、创建.aidl文件,如下图:


客户端与服务端创建的.aidl文件应完全相同,包括包名,.aidl的文件名,以及.aidl文件中定义的接口,如下图:


IMyAidlInterface.aidl:
interface IMyAidlInterface {

    /**     * Demonstrates some basic types that you can use as parameters     * and return values in AIDL.     */    int add(int num1,int num2);}

在服务端中创建 IRemoteService ,如上图,并IRemoteService注册到清单文件中
创建 IRemoteService:
public classIRemoteService extends Service {
    //创建.aidl文件---(IRemoteService注册到清单文件中)--->实现接口------>将接口暴露给客户端      //1.2实现接口      private IBinder mIBinder = new IMyAidlInterface.Stub() {        @Override        public int add(int num1, int num2) throws RemoteException {            return num1 + num2;        }    };    //1.3将接口暴露给客户端        @Nullable      @Override     public IBinder onBind(Intent intent) {         return mIBinder;    }}
注册IRemoteService:

<service android:name=".IRemoteService"         android:exported="true"         android:process=":remote"/>
客户端:
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"              xmlns:tools="http://schemas.android.com/tools"              android:id="@+id/activity_main"              android:layout_width="match_parent"              android:layout_height="match_parent"              android:gravity="center"              android:orientation="horizontal"              tools:context="com.viciy.aidlclient.MainActivity">    <EditText        android:id="@+id/et_num1"        android:layout_width="60dp"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:gravity="center"/>    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="+"        android:textColor="@android:color/black"        android:textSize="30dp"/>    <EditText        android:id="@+id/et_num2"        android:layout_width="60dp"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:gravity="center"/>    <TextView        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="="        android:textColor="@android:color/black"        android:textSize="30dp"/>    <EditText        android:id="@+id/et_num3"        android:layout_width="60dp"        android:layout_height="wrap_content"        android:layout_margin="10dp"        android:gravity="center"/>    <Button        android:id="@+id/bt_add"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="add"/>
</LinearLayout>
MainActivity.class:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private TextView num1;    private TextView num2;    private TextView num3;    private Button   btAdd;    private int num4;    IMyAidlInterface myAidlInterface;    //2.2服务绑定后的回调    private ServiceConnection conn = new ServiceConnection() {
        /**         * 服务绑定成功后调用,获取服务端的接口;         * 这里的service就是服务端onBind返回的,         * 已实现的IBinder接口         */        @Override        public void onServiceConnected(ComponentName name, IBinder service) {            myAidlInterface = IMyAidlInterface.Stub.asInterface(service);        }
        /**         * 解除绑定时调用;         * 清空接口,防止内存溢出         */        @Override        public void onServiceDisconnected(ComponentName name) {            myAidlInterface = null;        }    };    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //2.1绑定服务        bindService();        //初始化界面        initView();    }    //绑定服务    private void bindService() {        Intent intent = new Intent();        intent.setComponent(new ComponentName("com.viciy.aidlserver",                "com.viciy.aidlserver.IRemoteService"));        bindService(intent,conn, Context.BIND_AUTO_CREATE);    }    private void initView() {        num1=(TextView)findViewById(R.id.et_num1);        num2=(TextView)findViewById(R.id.et_num2);        num3=(TextView)findViewById(R.id.et_num3);        btAdd=(Button)findViewById(R.id.bt_add);        btAdd.setOnClickListener(this);    }    @Override    public void onClick(View v) {        int num1 = Integer.parseInt(this.num1.getText().toString());        int num2 = Integer.parseInt(this.num2.getText().toString());        try {            num4 = myAidlInterface.add(num1,num2);        } catch (RemoteException e) {            e.printStackTrace();        }        num3.setText(num4+"");    }    @Override    protected void onDestroy() {        super.onDestroy();        //解除绑定        unbindService(conn);    }}


1 0
原创粉丝点击