Android Studio中AIDL使用方法

一、简介:
AIDL:Android Interface Define Language(Android接口定义语言),主要用于服务端与客户端进程间通信(服务端与多客户端)

二、配置
Android Studio中使用(最好采用project模式)
1、第一类:
简单数据传递(基本数据类型,String ,List,Map)

<1>服务端配置(不需要界面)

①.创建aidl自定义接口文件 —IMyAidlInterface.aidl

步骤:File –> New –> AIDL –> AIDL File

然后可以看到在src/main目录下生成了一个目录aidl,点开aidl,可以看到刚才创建的IMyAidlInterface.aidl文件
这里写图片描述
IMyAidlInterface.aidl代码如下:

package com.example.lambert.aidltest;

interface IMyAidlInterface {

    String getValue();

}

②编译(因为Android Studio不能像Eclipse那样自动编译aidl文件,所以需要手动编译)
点击Build –> Make Module’server’
然后可以看到在build/generated/source/debug/com.example.lambert.aidlproject/目录下生成了一个文件IMyAidlInterface,表示编译成功;
这里写图片描述

③编写Service

package com.example.lambert.aidltest;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

public class MyService extends Service {
    @Override
    public IBinder onBind(Intent intent) {

        //记得要return一个IMyService,否则客户端调用的时候会报空指针
        return new IMyService();
    }


    public class IMyService extends IMyAidlInterface.Stub {

        @Override
        public String getValue() throws RemoteException {
            return "This is Lambert Server";
        }
    }

}

④在AndroidMenifest.xml中对Service进行配置:

 <!-- MyService -->
        <service
            android:name=".MyService"
            android:process=":remote">
            <intent-filter>
                <action android:name="com.example.lambert.aidlproject.MyService" />
            </intent-filter>
        </service>

到此为止,服务端配置完毕。

<2>客户端配置

①需要将服务端配置的整个aidl目录一并拷贝到客户端所在工程src/main目录下(包名与文件名必须与服务端一模一样)
这里写图片描述

②编译(同服务端)

这里写图片描述

③绑定服务

MainActivity.java

package com.example.lambert.client;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import com.example.lambert.aidlproject.IMyAidlInterface;
import com.example.lambert.aidlproject.Person;

public class MainActivity extends Activity implements View.OnClickListener {
    private IMyAidlInterface mService;
    private Button btn_bind, btn_get;
    private TextView tv;
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mService = IMyAidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;
        }
    };

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

    private void init() {
        btn_bind = (Button) findViewById(R.id.btn_bind);
        btn_get = (Button) findViewById(R.id.btn_get);
        tv = (TextView) findViewById(R.id.tv);

        btn_bind.setOnClickListener(this);
        btn_get.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_bind:
                Intent intent = new Intent();
                intent.setAction("com.example.lambert.aidlproject.MyService");
                //从 Android 5.0开始 隐式Intent绑定服务的方式已不能使用,所以这里需要设置Service所在服务端的包名
                intent.setPackage("com.example.lambert.aidlproject");
                bindService(intent, connection, Context.BIND_AUTO_CREATE);
                break;
            case R.id.btn_get:
                try {
                    String str = mService.getValue();
                    tv.setText(str);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
                break;
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (serviceConnection != null) {
            unbindService(connection);
        }
    }

}

通过 mService = IMyAidlInterface.Stub.asInterface(service); 可以获取到服务端的代理对象,从而可以通过回调方法从服务端获取到我们所需的数据。

2.第二类:自定义复杂数据类型(Parcelable)

<1>服务端配置(不需要界面)

①.在上述aidl目录下创建复杂数据对象aidl文件(这里以Person.aidl为例)对复杂对象进行声明:

这里写图片描述

Person.aidl

// Person.aidl
package com.example.lambert.aidlproject;
parcelable Person;

②在src/main/java目录下创建Person.java文件

这里写图片描述

Person.java

package com.example.lambert.aidlproject;

import android.os.Parcel;
import android.os.Parcelable;

public class Person implements Parcelable {
    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };
    private String name;

    public Person(String name) {
        this.name = name;
    }

    protected Person(Parcel in) {
        name = in.readString();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
    }

}

③修改IMyAidlInterface.aidl如下:

package com.example.lambert.aidlproject;
//PS:这里需要注意import导入Person,第一类不需要导入
import com.example.lambert.aidlproject.Person;

interface IMyAidlInterface {

    Person getValue();

}

④Service类也做出相应修改

    public class IMyService extends IMyAidlInterface.Stub {

        @Override
        public Person getValue() throws RemoteException {
            return new Person("Rose");
        }
    }

}

⑤编译(同上)

到此为止,服务端配置完毕。

<2>客户端配置
①拷贝Person.aidl和Person.java文件到客户端工程下:

Person.aidl可以拷贝到aidl目录下:
这里写图片描述

Person.java文件需要拷贝到src/main/java目录下,并且所在包名必须与服务端保持一致,但是客户端工程包名与服务端包名未必一致,所以在这里我们需要重新创建一个包com.example.lambert.aidlproject(服务端工程包名),并将Person.java文件拷贝至此;
这里写图片描述

另:IMyAidlInterface.aidl做同上修改,当然也可以直接拷贝过来

②编译(同上)
③MainActivity代码也做相应修改

  try {
                    Person person = mService.getValue();
                    tv.setText(person.toString());
                } catch (RemoteException e) {
                    e.printStackTrace();
                }

客户端配置完毕。

关于AIDL在Android Studio中的使用暂且简单介绍到这里。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值