通过aidl实现传送远程服务中的对象

本文介绍了如何使用AIDL在Android中实现远程服务间传递对象。详细探讨了创建接口、定义传输类、编写服务以及调用服务的过程,并强调了在复制AIDL相关文件时的注意事项。
摘要由CSDN通过智能技术生成
  • 前段时间换工作面试一家做广告sdk的公司,面试的时候面试官问到说,如何通过远程服务来传递一个对象。当场我也就蒙逼了。
  • 这个问题萦绕耳旁几天了,今天终于静下心来,研究了一番,感觉有些心得便迫不及待地写下这篇博客。
  • 因为aidl的使用方法,网上一大堆我就不赘述了。
    那么开始吧!

一、首先看远程服务的新建的目录结构

这里写图片描述

1、首先来看定义的接口中的内容(MyInterface.aidl)
package com.example.aidlromateservice;
import com.example.aidlromateservice.MyBean;
interface MyInterface {
     MyBean getBean();
     void show();
}

对aidl有一定了解的同学都知道,接口中定义的两个方法,一个是常规的返回void,另一个则是返回一个MyBean对象
另外,import com.example.aidlromateservice.MyBean;是依赖于MyBean.aidl的,所以在没有MyBean.aidl的时候,加上这个import语句是会报错的。

2、下面看我们自定义的需要在网络中传输的一个类
package com.example.aidlromateservice;
import android.os.Parcel;
import android.os.Parcelable;
public class MyBean implements Parcelable{
    public int count;
    public String str;

    public MyBean(Parcel in){
        count=in.readInt();
        str=in.readString();
    }
    public MyBean() {
    }
    @Override
    public int describeContents() {
        return 0;
    }
    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(count);
        dest.writeString(str);
    }
    public static final Parcelable.Creator<MyBean> CREATOR = new Parcelable.Creator<MyBean>(){

        @Override
        public MyBean createFromParcel(Parcel arg0) {
            return new MyBean(arg0);
        }
        @Override
        public MyBean[] newArray(int size) {
            return new MyBean[size];
        }

    };
}

关于Parcelable的用法这里不做详细的解释,因为我也只是知道是这样用的。

3、下面是关键的MyBean.aidl
package com.example.aidlromateservice;
parcelable MyBean;
4、最后便是我们要对其他应用提供的service
public class MyService extends Service {

    @Override
    public IBinder onBind(Intent arg0) {
        return new MyBinder();
    }
    class MyBinder extends Stub{

        @Override
        public void show() {
            callShow();
        }
        @Override
        public MyBean getBean() throws RemoteException {
            return getmyBean();
        }
    }
    public void callShow(){
        System.out.println("show可以调用");
    }
    public MyBean getmyBean(){
        MyBean myBean = new MyBean();
        myBean.count=10;
        myBean.str="我爱编程";
        return myBean;
    }
}

好了服务端的基本都已经完成了,对了,别忘记注册服务哦

  <service android:name="com.example.aidlromateservice.MyService">
            <intent-filter >
                <action android:name="com.wlz.aidltest"/>
            </intent-filter>
        </service>

注意,这里的action是必须的
然后便是要用这个远程服务,即是调用远程服务的方法,先看目录

二、来看调用远程服务的应用demo的目录

这里写图片描述

1、注意
  • Mybean.java和MyInterface.aidl是从远程服务应用demo里获取的
  • copy过来的是MyBean.java,而不是MyBean.aidl
  • 注意哦!这两个copy过来的文件的包名也要跟copy过来的地方的包名一致。
2、下面来看看怎么调用
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent=new Intent();
        intent.setAction("com.wlz.aidltest");
        MyServiceConnection conn = new MyServiceConnection();
        bindService(intent, conn, BIND_AUTO_CREATE);
    }

    class MyServiceConnection implements ServiceConnection{

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {

            MyInterface asInterface = Stub.asInterface(service);
            try {
                asInterface.show();
            } catch (RemoteException e) {
                e.printStackTrace();
            };

            MyBean bean=new MyBean();
            try {
                bean = asInterface.getBean();
                System.out.println(bean.count+":::"+bean.str);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void onServiceDisconnected(ComponentName name) {

        }

    }

}

好了下面可以运行看结果了

  • 注意要先运行第一个远程服务的应用
    运行结果如下:
    这里写图片描述

就是这些了,欢迎大家交流讨论!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值