Android复习笔记(9) - 调用远程服务


远程服务操作步骤

  • 远程绑定服务时无法通过同一个接口来调用方法,这时就需要使用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);
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值