您的位置:首页 > 移动开发 > Android开发

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是我们实现接口的类

代码如下:

/**
 * 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相关使用并没有好的资料 所以特地发出来 方便后来者少走写弯路
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: