- 前段时间换工作面试一家做广告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) {
}
}
}
好了下面可以运行看结果了
- 注意要先运行第一个远程服务的应用
运行结果如下:
就是这些了,欢迎大家交流讨论!