Android远程服务编写和调用教程

2019-12-10 18:59:12刘景俊

AIDL语言的语法和Java其实很像,你甚至可以先编写一个Java接口,然后删掉public、protected、private这些权限限定词即可。例子如下IWxbService.aidl:

package com.dumaisoft.wxbremoteservice;

interface IWxbService {
 void setName(String name);
 String getName();
}

注意几点: 
1.接口名和aidl文件名相同。 
2.接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static。 
3.Aidl默认支持的类型包话java基本类型(int、long、boolean等)和(String、List、Map、 CharSequence),使用这些类型时不需要import声明。对于List和Map中的元素类型必须是Aidl支持的类型。如果使用自定义类型作 为参数或返回值,自定义类型必须实现Parcelable接口。 
4.自定义类型和AIDL生成的其它接口类型在aidl描述文件中,应该显式import,即便在该类和定义的包在同一个包中。 
5.在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数、输出参数还是输入输出参数。 
6.Java原始类型默认的标记为in,不能为其它标记 
IWxbService.aidl文件的位置是在com.dumaisoft.wxbremoteservice包中,只要语法正确,则会在ADT的gen目录下的com.dumaisoft.wxbremoteservice包中生成java文件IWxbService.java。 
IWxbService.aidl定义了一个远程接口,它包含两个方法getName和setName。

第三步,编写服务类

添加一个WxbService类,它继承了Service类,源代码如下:

package com.dumaisoft.wxbremoteservice;

import com.dumaisoft.wxbremoteservice.IWxbService.Stub;

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

public class WxbService extends Service {

 private ServiceImpl serviceImpl;

 //继承由IWxbService.aidl生成的com.dumaisoft.wxbremoteservice.IWxbService.Stub类
 class ServiceImpl extends Stub{
  private String _name;
  @Override
  public void setName(String name) throws RemoteException {
   _name = name;
  }

  @Override
  public String getName() throws RemoteException {
   return _name;
  }
 }

 //将ServiceImpl做一个简单的单例模式
 private ServiceImpl getInstance(){
  if(serviceImpl == null){
   serviceImpl = new ServiceImpl();
  }
  return serviceImpl;
 }

 @Override
 public IBinder onBind(Intent intent) {
  return getInstance();
 }
}