远程服务操作步骤
- 远程绑定服务时无法通过同一个接口来调用方法,这时就需要使用AIDL技术
- 将接口扩展名改为“.aidl”
- 去掉权限修饰符
- gen文件夹下会生成同名接口
- 将服务中自定义的IBinder类改为继承接口中的Stub
- 用Stub.asInterface()方法把ServiceConnection中返回的IBinder转为接口类型
- 将服务中自定义的IBinder类改为继承接口中的Stub
- 用Stub.asInterface()方法把ServiceConnection中返回的IBinder转为接口类型
AIDL使用自定义类型
AIDL
默认只能使用
Java
中基本数据类型和
String
、
List
、
Map
,
List
和
Map
中的元素类型也只能是这些类型。
如果需要使用其他类型数据,使用的类必须实现
Parcelable
接口以完成序列化和反序列化工作
例:
/**
* 1.实现Parcelable的bean
* @author jiangwei
*
*/
public class Person implements Parcelable {
private int id;
private String name;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int describeContents() {
return 0;
}
public Person() {
}
public Person(int id, String name, int age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
/**
* 写入的方法
*/
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(id);
dest.writeString(name);
dest.writeInt(age);
}
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {
//按写入顺序传入
@Override
public Person createFromParcel(Parcel source) {
return new Person(source.readInt(), source.readString(), source.readInt());
}
@Override
public Person[] newArray(int size) {
return new Person[size];
}
};
}
//2.需要为Person类写一个aidl文件
package wei.jiang.servicetest.bean;
parcelable Person;
//3.远程业务接口
interface RemoteInteface {
void haha(in Person person);
}
//4.远程Service
public class RemoteService extends Service{
class MyBinder extends Stub {
@Override
public void haha(Person person) {
System.out.println(person.getName() + "haha");
}
}
@Override
public IBinder onBind(Intent intent) {
System.out.println("onbind");
return new MyBinder();
}
}
//5.把远程接口与实现类所在包带类一起复制到调用的程序中
//6.调用的Activity
public class MainActivity extends Activity {
private RemoteInteface inteface;
//成员匿名内部类方法中中调用Stub.asInterface方法得到业务接口
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
inteface = Stub.asInterface(service);
}
};
private Intent intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//绑定服务
public void click(View v) {
intent = new Intent();
intent.setAction("cn.xzmy.remoteservice");
bindService(intent, conn , Context.BIND_AUTO_CREATE);
}
//调用远程方法
public void click2(View v) {
try {
System.out.println("click2");
Person person = new Person(11, "weijiang", 32);
inteface.haha(person );
} catch (RemoteException e) {
e.printStackTrace();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(conn);
}
}