Android之——AIDL小结

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47071683
  • AIDL (Android Interface Definition Language )
  • AIDL 适用于 进程间通信,并且与Service端多个线程并发的情况,如果只是单个线程 可以使用 Messenger ,如果不需要IPC 可以使用Binder
  • AIDL语法:基础数据类型都可以适用,List Map等有限适用。static field 不适用。
  • AIDL基本用法

1、实现.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-08-05 10:41:31

Android之——AIDL小结的相关文章

Android之——AIDL深入

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47071927 在上一篇博文<Android之--AIDL小结>中,我们简单介绍了一下Android AIDL的用法,而在这篇博文中,我们将深入讲解Android AIDL的用法,同样,在这里我们也通过一个小例子来学习Android 中 AIDL的用法. 好处:多个应用程序之间建立共同的服务机制,通过AIDL在不同应用程序之间达到数据的共享和数据相互操作, 本文包括: 1 .创建

Android适配方案小结(三)

在Android适配方案小结(一).(二)中,我们了解了一些基本概念. 那么在具体开发中,我们应该注意什么呢. 首先,我们必须要知道,其实适配的关键在于两点: (1)不同分辨率设备的适配,这点在单位的使用上用dp.sp以及图片资源存放于不同的drawable文件夹就可以解决问题: (2)不同尺寸的适配,这点主要靠将相关值以及布局文件放置于不同的文件夹中来解决. 2.1 values文件夹 可以在工程下创建不同的values文件夹:values-sw480dp, values-sw600dp, v

Android Studio &#39;AIDL is missing&#39; 且 不识别R文件

最近刚开始用Android Studio,出的问题还真不少.昨天不知为何不能新建项目了,这两天重装了几次才搞定. 可又出了这个问题: 上网查了不少才得以解决,网址如下: Execution failed for task ':app:compileDebugAidl': aidl is missing http://stackoverflow.com/questions/29766830/execution-failed-for-task-appcompiledebugaidl-aidl-is-

Android技术22:Android中AIDL

在Android中进程内部通过全局变量,文件,preference,数据库作为数据的载体实现数据共享和通信.然后在进程之间则需要借助Binder实现IPC调用.Android进程通信框架:服务端,客户端,Linux binder驱动.Binder驱动成为连接两端的桥梁.我们首先通过aidl语言实现一个简单的多进程通信.具体实现步骤如下: 1.定义aidl文件 IService.aidl,定义一个接口,test() ,不包含负责的类和数据. 1 package com.demo.ipc; 2 3

彻底明白Android中AIDL及其使用

1.为什么要有AIDL? 无论学什么东西,最先得弄明白为什么要有这个东西,不要说存在即是合理,存在肯定合理,但是你还是没有明白.对于AIDL有一些人的浅显概念就是,AIDL可以跨进程访问其他应用程序,和其他应用程序通讯,那我告诉你,很多技术都可以访问,如广播(应用A在AndroidManifest.xml中注册指定Action的广播)应用B发送指定Action的广播,A就能收到信息,这样也能看成不同应用之间完成了通讯(但是这种通讯是单向的):还如ContentProvider,通过URI接口暴露

Android Camera 使用小结。两种方法:一是调用系统camera app,二是自己写camera程序。

源文链接:http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html Android Camera 使用小结 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Intent和MediaStroe调用系统Camera App程序来实现拍照和摄像功能,二是根据Camera API自写Came

Android自动化问题小结

Android 自动化case小结: 1.jenkins  job  运行   Android 自动化case     出现 com.meilishuo.testcase.profile.AlbumShare:INSTRUMENTATION_RESULT: shortMsg=keyDispatchingTimedOutINSTRUMENTATION_RESULT: longMsg=Timed out while dispatching key eventINSTRUMENTATION_CODE:

Android开发 AIDL使用自定义对象作参数或返回值

http://www.pocketdigi.com/20121129/952.html 默认,AIDL支持对象作参数,但需要该对象实现Parcelable接口,且aidl文件应该是该类在同一包下,需要单独给该类定义一个aidl文件.定义模型类:EnglishItem.java: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40

Android Camera 使用小结

转载地址:http://www.cnblogs.com/franksunny/archive/2011/11/17/2252926.html Android Camera 使用小结 Android Camera 使用小结 Android手机关于Camera的使用,一是拍照,二是摄像,由于Android提供了强大的组件功能,为此对于在Android手机系统上进行Camera的开发,我们可以使用两类方法:一是借助Intent和MediaStroe调用系统Camera App程序来实现拍照和摄像功能,