android studio 使用AIDL实现IPC
2015-08-15 20:05
671 查看
在android中,要想在进程间传递对象那个,需要把它们解析成OS原语,而不能简单的传引用过去,理由我认为应该是每个进程都有自己的内存空间吧.
AIDL可以简化进程间传递对象的源码.它和COM,Corba这样的接口类似,可以让你在service中创建公共方法.这些方法可以接受和返回对象参数,并在进程之间传递值
# 实现AIDL接口
AIDL支持下面的数据类型:
.J***A的基本类型(int,boolean,float,chat,etc)
.String CharSequence
.List
.Map
.AIDL生成的接口
.实现Parcelable接口的类
# 实战部分
# 实现Pasrcelable的类
在这里我先附上我的工程结构图
其中DemoMessage是我们实现接口的类
代码如下:
#创建该类的AIDL定义,并在定义Service的AIDL接口的时候使用它
鼠标右击main
便可以创建AIDL文件
其中该项目中DemoMessage是对应的AIDL定义
内容如下
这里要注意的是报名一定要和AndroidManifest中的一样 不一样会导致错误哦 ,不过android studio比较智能 这个是不需要你关心的
#创建AIDL Service使用的AIDL接口
再新建一个aidl文件,取名随意
内容如下:
这就是服务中所需要的接口
# 实现和公开AIDL Service的定义
构建工程 你会在
发现多了这个Java文件
这个接口呢 会包含一个Stub的内部类,而该类会把接口作为抽象类实现
让service扩展Stub并实现要求的功能
代码如下
# 使用:
其他和普通绑定服务并没有特别的地方
ps :也是折腾好久,第一次接触这东西 再加上android studio相关使用并没有好的资料 所以特地发出来 方便后来者少走写弯路
AIDL可以简化进程间传递对象的源码.它和COM,Corba这样的接口类似,可以让你在service中创建公共方法.这些方法可以接受和返回对象参数,并在进程之间传递值
# 实现AIDL接口
AIDL支持下面的数据类型:
.J***A的基本类型(int,boolean,float,chat,etc)
.String CharSequence
.List
.Map
.AIDL生成的接口
.实现Parcelable接口的类
# 实战部分
# 实现Pasrcelable的类
在这里我先附上我的工程结构图
其中DemoMessage是我们实现接口的类
代码如下:
/** * Created by chan on 15-8-15. */ public class DemoMessage implements Parcelable { private String m_content; private String m_title; private int m_id; public DemoMessage(String content,String title,int id){ m_id = id; m_title = title; m_content = content; } protected DemoMessage(Parcel in) { m_content = in.readString(); m_title = in.readString(); m_id = in.readInt(); } public static final Creator<DemoMessage> CREATOR = new Creator<DemoMessage>() { @Override public DemoMessage createFromParcel(Parcel in) { return new DemoMessage(in); } @Override public DemoMessage[] newArray(int size) { return new DemoMessage[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(m_content); dest.writeString(m_title); dest.writeInt(m_id); } @Override public String toString(){ return m_content + "|" + m_title + "|" + m_id; } }
#创建该类的AIDL定义,并在定义Service的AIDL接口的时候使用它
鼠标右击main
便可以创建AIDL文件
其中该项目中DemoMessage是对应的AIDL定义
内容如下
这里要注意的是报名一定要和AndroidManifest中的一样 不一样会导致错误哦 ,不过android studio比较智能 这个是不需要你关心的
#创建AIDL Service使用的AIDL接口
再新建一个aidl文件,取名随意
内容如下:
// DemoAdil.aidl package com.chan.aidl; import com.chan.aidl.DemoMessage; // Declare any non-default types here with import statements interface DemoAdil { List<DemoMessage> getMessage(); }
这就是服务中所需要的接口
# 实现和公开AIDL Service的定义
构建工程 你会在
发现多了这个Java文件
这个接口呢 会包含一个Stub的内部类,而该类会把接口作为抽象类实现
让service扩展Stub并实现要求的功能
代码如下
/** * Created by chan on 15-8-15. */ public class ChanService extends Service { private IBinder m_iBinder = new DemoAdil.Stub(){ @Override public List<DemoMessage> getMessage() throws RemoteException { List<DemoMessage> messages = new ArrayList<DemoMessage>(); messages.add(new DemoMessage("content","title",940525)); return messages; } }; @Nullable @Override public IBinder onBind(Intent intent) { return m_iBinder; } }
# 使用:
private DemoAdil m_demoMessages; private ServiceConnection m_serviceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { m_demoMessages = (DemoAdil) DemoAdil.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { m_demoMessages = null; } };
其他和普通绑定服务并没有特别的地方
ps :也是折腾好久,第一次接触这东西 再加上android studio相关使用并没有好的资料 所以特地发出来 方便后来者少走写弯路
相关文章推荐
- 关于Android长按出现复制粘贴栏在顶部占位问题解决方法
- Android底层原理之从Binder源码分析Android进程间通信过程
- Android 真机连接本地PC服务器
- Android之Intent
- android---adapter的刷新
- Android 仿支付宝9.0芝麻信用分效果
- Android之AsyncTask源码解析
- Mac 安装Android Studio
- Android 之ExpandableListView使用
- Android中的Selector
- Android LaunchMode的详解
- android No enclosing instance of type BasicActivity is accessible. Must qualify the allocation with
- Android消息机制详解
- Android layout适配4种方式笔记小结
- Android大图片裁剪终极解决方案
- AndroidManifest总结
- Android studio 卡的问题
- Android中Service概述
- Android studio 日志分类
- Android上传图片到本地服务器