虚位以待(AD)
虚位以待(AD)
首页 > 软件编程 > Android编程 > android AIDL的一些写法

android AIDL的一些写法
类别:Android编程   作者:码皇   来源:互联网   点击:

Service这边只要定义一个服务: 对于传递的是基本类型:创建要传递的数据类

Service这边只要定义一个服务:


对于传递的是基本类型:创建要传递的数据类型:

    interface IDog{
    String getName();
    int getAge();
    }

然后在服务器的Service上创建Stub,Stub是存根的意思,在客户端也有一个一样的IDog类,通信的时候传递的都是IDog类型:

服务端Service的写法:

import com.example.aidlservicedemo.domain.IDog.Stub;

    public class BaseTypeService extends Service {
    private final String TAG="main";
    private DogBinder binder=null;
    private String[] names=new String[]{
    "小白","旺财","小黑"}
    ;
    private int[] ages=new int[]{
    1,2,3}
    ;
    /** * Stub的实现类,Stub内部实现了Binder * 内部实现AIDL定义的方法 */ public class DogBinder extends Stub{
    @Override public String getName() throws RemoteException {
    return names[0];
    }
    @Override public int getAge() throws RemoteException {
    return ages[1];
    }
    }
    @Override public void onCreate() {
    super.onCreate();
    // 实例化Binder对象 binder=new DogBinder();
    Log.i(TAG, "创建服务成功");
    }
    @Override public IBinder onBind(Intent intent) {
    Log.i(TAG, "绑定服务成功");
    // 返回Binder对象 return binder;
    }
    }

客户端这样来调用:

    public class BaseTypeActivity extends Activity {
    private Button btn_startService, btn_endService,btn_getServiceData;
    private IDog dogService;
    @Override protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_service);
    btn_startService = (Button) findViewById(R.id.btn_startService);
    btn_endService = (Button) findViewById(R.id.btn_endService);
    btn_getServiceData = (Button) findViewById(R.id.btn_getServiceData);
    btn_startService.setOnClickListener(click);
    btn_endService.setOnClickListener(click);
    btn_getServiceData.setOnClickListener(click);
    }
    private View.OnClickListener click = new OnClickListener() {
    @Override public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_startService: startService();
    break;
    case R.id.btn_endService: endService();
    break;
    case R.id.btn_getServiceData: getServiceDate();
    break;
    }
    }
    }
    ;
    /* * 获取数据 */ private void getServiceDate() {
    try {
    if(dogService!=null){
    StringBuilder sBuilder=new StringBuilder();
    sBuilder.append("name:"+dogService.getName());
    sBuilder.append("nage:"+dogService.getAge());
    //获取数据,这个结果应该是小白,2
    Toast.makeText(BaseTypeActivity.this, sBuilder.toString(), Toast.LENGTH_SHORT).show();
    }
    else {
    Toast.makeText(BaseTypeActivity.this, "请先绑定服务", Toast.LENGTH_SHORT).show();
    }
    }
    catch (Exception e) {
    e.printStackTrace();
    }
    }
    private ServiceConnection connBase=new ServiceConnection() {
    @Override public void onServiceDisconnected(ComponentName name) {
    dogService=null;
    }
    @Override public void onServiceConnected(ComponentName name, IBinder service) {
    // IDog.Stub.asInterface,获取接口 dogService=IDog.Stub.asInterface(service);
    //表示拿到的这个Service对象
    }
    }
    ;
    /** * 开始服务 */ private void startService(){
    Intent intent=new Intent();
    intent.setAction("cn.bgxt.Service.BASE_TYPE_SERVICE");
    //这个必须跟服务端menufest上的action一致 bindService(intent, connBase, BIND_AUTO_CREATE);
    Toast.makeText(BaseTypeActivity.this, "开始绑定服务", Toast.LENGTH_SHORT).show();
    }
    /** * 停止服务 */ private void endService(){
    if(connBase!=null) {
    unbindService(connBase);
    Toast.makeText(BaseTypeActivity.this, "服务解除绑定", Toast.LENGTH_SHORT).show();
    }
    }
    }


如果AIDL通讯传递是自定义类型:

一个常用的根据user来返回对象message信息的例子,user ,message都是自定义类型:

    public class Message implements Parcelable {
    private int id;
    private String msgText;
    private String fromName;
    private String date;
    }
    public class User implements Parcelable {
    private int id;
    private String username;
    private String password;
    }

定义两个AIDL文件

message.aidl:

parcelable Message;

user.aidl

parcelable User;

服务器代码:

    public class CustomTypeService extends Service {
    private static final String TAG = "main";
    private MsgBinder msgBinder = null;
    private static Map> map = new HashMap>();
    static {
    for (int i = 0;
    i < 3;
    i++) {
    User user = new User(i, "jack" + i, "99" + i);
    List messages = new ArrayList();
    Message msg = null;
    if (i == 0) {
    msg = new Message(i, "这两天好吗?", "Jerry", new Date().toGMTString());
    messages.add(msg);
    }
    map.put(user, messages);
    }
    }
    public class MsgBinder extends Stub {
    @Override public List getMes(User us) throws RemoteException {
    for (Map.Entry> msgs : map.entrySet()) {
    if (msgs.getKey().getUsername().equals(us.getUsername()) && msgs.getKey().getPassword().equals(us.getPassword())) {
    Log.i(TAG, "找到信息了");
    return msgs.getValue();
    }
    }
    Log.i(TAG, "没找到信息了");
    return map.get(us);
    }
    }
    @Override public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub return msgBinder;
    }
    @Override public void onCreate() {
    // TODO Auto-generated method stub super.onCreate();
    msgBinder = new MsgBinder();
    }
    @Override public void onDestroy() {
    msgBinder = null;
    super.onDestroy();
    }
    }

客户端基本是一致的:

    private static User[] users = new User[] {
    new User(0, "jack0", "990")}
    ;
    /** * 获取其他线程服务数据 */ private void getServiceDate(){
    try {
    List msgs=getMsg.getMes(users[0]);
    StringBuilder sBuilder=new StringBuilder();
    for(Message msg:msgs){
    sBuilder.append(msg.toString()+"n");
    }
    Toast.makeText(CustomTypeActivity.this, sBuilder.toString(), Toast.LENGTH_SHORT).show();
    }
    catch (Exception e) {
    Toast.makeText(CustomTypeActivity.this, "获取数据出错", Toast.LENGTH_SHORT).show();
    e.printStackTrace();
    }
    }


相关热词搜索: 写法