您的位置:首页 > 移动开发 > Android开发

Android Studio中AIDL使用方法

2016-06-02 15:55 796 查看
一、简介:

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中的使用暂且简单介绍到这里。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: