Android AIDL 小结

1、AIDL (Android Interface Definition Language )

2、AIDL 适用于 进程间通信,并且与Service端多个线程并发的情况,如果只是单个线程 可以使用 Messenger ,如果不需要IPC 可以使用Binder

3、AIDL语法:基础数据类型都可以适用,List Map等有限适用。static field 不适用。

4、AIDL基本用法

第一步:实现.aidl文件

接口描述文件
1、导入的包名
2、如果有使用Object对象,需要该对象 implement Parcelable 接口,并且需要导入该接口包名+类名;
如果是primitive type 不需要这步。
3、定义方法名称。
4、所有的.aidl文件已经需要传递的对象接口需要在Service 与Client中各一份

package com.aidl;
import com.aidl.Data;
interface IaidlData
{
    int getPid();

    String getName();

    com.aidl.Data getData();
}

2、在Service中实现.aidl 接口。实际实现的接口是在 gen中自动生成的 IaidlData.java的抽象内部类 Stub

1、需要在配置文件Androidmanifest.xml文件中声明Service,并且添加intent-filter 节点 的action属性,
   此属性一般可以使用 aidl的包名+文件名(因为该值在服务器与客户端一致)
2、需要实现IaidlData.aidl文件中定义的接口。
   aidl文件是一个接口描述文件,会在gen中自动生成一个同名的IaidlData.java接口文件,该接口文件包含一个抽象类stub,其继承了android.os.Binder、实现IaidlData接口

   故,我们实际需要实现的是Stub抽象类。

public class AidlService extends Service
{
    public void onCreate()
    {
        Log.d("aidl", "aidlService--------------onCreate");
    }

    public IBinder onBind(Intent intent)
    {
        return mBinder;
    }

    private final IaidlData.Stub mBinder = new IaidlData.Stub()
    {
        public int getPid()
        {
            return Process.myPid();
        }

        public String getName() throws RemoteException
        {
            return "go or not go is a problem";
        }

        public Data getData() throws RemoteException
        {
            Data data = new Data();
            data.id = Process.myPid();
            data.name = "go or not go is a problem";
            return data;
        }
    };
}

3、绑定Service ,并且获取IaidlService 对象

1、建立连接,使用Action属性定位需要的Service
   actoin的属性的采用aidl文件的类名+包名(与服务一致),之前需要在服务中设置相同的action属性,否则找不到服务。

2、获取服务返回的stub对象,mIaidlData = IaidlData.Stub.asInterface(service);

package com.clent;

import com.aidl.IaidlData;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import android.view.View;

public class AidlClientActivity extends Activity
{
    IaidlData mIaidlData;

    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }    

    protected void onStart()
    {
        super.onStart();
        Log.d("aidl" , "onstart ----------bindservice-----"+IaidlData.class.getName());
        Intent intent = new Intent(IaidlData.class.getName());
        bindService(intent, mSecondaryConnection, BIND_AUTO_CREATE);
    }

    private ServiceConnection mSecondaryConnection = new ServiceConnection()
    {
        public void onServiceConnected(ComponentName className, IBinder service)
        {
            Log.d("aidl", "onServiceConnected----------------");
            mIaidlData = IaidlData.Stub.asInterface(service);
        }

        public void onServiceDisconnected(ComponentName className)
        {
            mIaidlData = null;
        }
    };

    public void onClick(View view)
    {
        System.out.println( " onclick--------------- : ");
        if(mIaidlData != null)
        {
            try
            {
                System.out.println( " name : "+mIaidlData.getName());

                System.out.println( " id   : "+mIaidlData.getPid());

                System.out.println( " data : "+mIaidlData.getData().id +"   "+mIaidlData.getData().name);
            }
            catch (RemoteException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

    protected void onDestroy()
    {
        super.onDestroy();
        unbindService(mSecondaryConnection);
    }
}

4、如果aidl文件中需要传递Object对象,需要添加对应的.aidl文件

1、定义该对象Data,并实现Parcelable
2、添加Data.aidl文件,并采用如下方式编写导入Data
3、需要在引用到Data的.aidl文件中 import com.aidl.Data
4、需要在服务端和 客户端都添加 Data.aidl与 Data.java文件 并且需要一致。

Data.aidl
aidl文件:
package com.aidl;
parcelable Data;

5、添加 对应的Object类,并且实现Parcelable接口

public class Data implements Parcelable
{
    public int id;
    public String name;

    public static final Parcelable.Creator<Data> CREATOR = new Parcelable.Creator<Data>()
    {
        public Data createFromParcel(Parcel in)
        {
            return new Data(in);
        }

        public Data[] newArray(int size)
        {
            return new Data[size];
        }
    };

    public Data()
    {
    }

    private Data(Parcel in)
    {
        readFromParcel(in);
    }    

    public void readFromParcel(Parcel in)
    {
        id = in.readInt();
        name = in.readString();
    }

    public int describeContents()
    {
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags)
    {
        dest.writeInt(id);
        dest.writeString(name);
    }
}
时间: 2024-10-26 07:10:52

Android AIDL 小结的相关文章

Android AIDL开发

Introduction   在Android中, 每个应用程序都运行在自己的进程中,拥有独立的内存空间.但是有些时候我们的应用程序需要跟其它的应用程序进行通信,这个时候该怎么办呢?显然, Java中不允许跨进程内存共享.无法直接交换数据.Android中可以采用AIDL的方式实现进程间通信(interprocess communication(IPC)). Android Developer原文介绍如下:AIDL (Android Interface Definition Language)

Android AIDL使用详解

1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口 icp:interprocess communication :内部进程通信 2.既然aidl可以定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了详细描述: --1.Create

Using self-defined Parcelable objects during an Android AIDL RPC / IPC call

Using self-defined Parcelable objects during an Android AIDL RPC / IPC call In my previous post “Using the Android Interface Definition Language (AIDL) to make a Remote Procedure Call (RPC) in Android” I’ve explained the basics on how inter-process c

Android AIDL 使用示例

介绍: AIDL 即  Android Interface Definition Language 使用: 1.新建.aidl文件 1 //AIDL 文件所在的包 2 package com.houny.demo_aidl.aidl; 3 4 //接口名必须和AIDL文件名一致 5 interface ISay{ 6 boolean Say(); 7 boolean SayInt(int i); 8 boolean SayString(String str); 9 } 2.新建Service,并

android aidl摘要

/*在Android中, 每个应用程序都有自己的进程,当需要在不同的进程之间传递对象时,该如何实现呢? 显然, Java中是不支持跨进程内存共享的.因此要传递对象, 需要把对象解析成操作系统能够理解的数据格式, 以达到跨界对象访问的目的.在JavaEE中,采用RMI通过序列化传递对象.在Android中, 则采用AIDL(Android Interface Definition Language:接口描述语言)方式实现. AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,供编译器生成代码

Android AIDL自动生成Java文件测试

/******************************************************************************** * Android AIDL自动生成Java文件测试 * 说明: * 知道有aidl这东西已经挺久了,但是一直没有花时间来系统了解一下其工作机制,现在 * 花点时间一点一点验证一下其功能. * * 2016-5-8 深圳 南山平山村 曾剑锋 ***********************************************

(转载)你真的理解Android AIDL中的in,out,inout么?

前言 这其实是一个很小的知识点,大部分人在使用AIDL的过程中也基本没有因为这个出现过错误,正因为它小,所以在大部分的网上关于AIDL的文章中,它都被忽视了--或者并没有,但所占篇幅甚小,且基本上都是官方文档的译文,译者读者其实都不知其然.这几天在研究AIDL,偏偏我又是个执拗的性子,遇着不清不楚的东西就是想把它捋清楚,就下了些功夫研究了下AIDL中的定向tag,研究了下它的 in , out , inout . 整理而成此博文. 1.概述 首先要说的是定向tag是AIDL语法的一部分,而 in

android fota小结

fota在make中有个关键的目标target-files-package,该目标生成一个用于做升级包的zip文件.升级包中的内容是定义好的文件列表. 同时有一个主要的脚本./build/tools/releasetools/ota_from_target_files,这个脚本可以根据不同的参数生成完整的升级包和差分升级包. 完整的升级包是采用覆盖的形式升级,差分升级则是采用patch的方式升级. 在update-binary中会有升级的函数定义,在update-script中会调用不同的函数进

Android aidl Binder框架浅析

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38461079 ,本文出自[张鸿洋的博客] 1.概述 Binder能干什么?Binder可以提供系统中任何程序都可以访问的全局服务.这个功能当然是任何系统都应该提供的,下面我们简单看一下Android的Binder的框架 Android Binder框架分为服务器接口.Binder驱动.以及客户端接口:简单想一下,需要提供一个全局服务,那么全局服务那端即是服务器接口,任何程序即客