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

来源:互联网 发布:移动云商城 源码 编辑:程序博客网 时间:2024/05/21 21:01
  • 前段时间换工作面试一家做广告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