通过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
- 通过aidl实现传送远程服务中的对象
- AIDL实现远程服务
- 通过AIDL和远程服务进行进程中的通信
- Android AIDL实现远程服务
- Android通过AIDL与远程服务通信
- Android中的服务(service)--AIDL远程服务
- Android 中的AIDL,Parcelable和远程服务
- aidl 实现远程服务调用 及 回调
- Android studio 使用aidl实现远程服务
- aidl远程服务调用
- AIDL绑定远程服务
- aidl绑定远程服务
- Service (aidl远程服务)
- Android_08_用AIDL访问远程服务中的方法
- android开发中通过aidl实现远程方法调用
- 使用AIDL和远程服务实现进程通信
- Android使用AIDL和远程服务实现进程通信
- 使用AIDL和远程服务实现进程通信
- emoji 表情图片解决方法
- eclipse maven插件使用POM.XML异常
- 关于nsdata的压缩的问题base64,图片转字符串,图片的压缩的问题
- 多线程开发之NSOperation
- Linux文件及目录命名规则
- 通过aidl实现传送远程服务中的对象
- Http相关 --概念
- C++笔记——类的继承和访问控制
- MFC从资源文件获取png图片
- 递归:分治法与动态规划
- online_judge_1151
- 【杭电】[5499]SDOI
- Linux下tomcat的安装配置
- 图---Floyd