[Android] AIDL的使用情况和实例介绍

AIDL是什么?

  AIDL (Android Interface Definition Language), Android接口定义语言,Android提供的IPC (Inter Process Communication,进程间通信)的一种独特实现。

什么情况下要使用AIDL

  使用AIDL只有在你允许来自不同应用的客户端跨进程通信访问你的service,并且想要在你的service种处理多线程的时候才是必要的。 如果你不需要执行不同应用之间的IPC并发,你应该通过实现Binder建立你的接口,或者如果你想执行IPC,但是不需要处理多线程。那么使用Messenger实现你的接口。

定义一个AIDL接口的步骤

  必须在一个.aidl文件中使用java编程语言语法定义你的AIDL接口,然后在提供service的应用中和任何绑定到这个service的应用中的源代码中(在src目录吓)保存它。

  

  当你编译包含.aidl文件的应用时,Android SDK工具基于这个.aidl文件生成一个IBinder接口,并且把它保存到项目的gen目录吓.service必须恰当的实现这个IBinder接口 之后客户端应用可以绑定到这个服务上,然后从IBinder调用方法来执行IPC。

使用AIDL建立一个邻接的service需要遵循下面的步骤:

1. 建立.aidl文件 

  这个文件使用方法签名定义了语言接口 

  

2.实现这个接口 

  Android SDk工具基于你的.aidl文件使用java语言生成一个接口 这个接口有一个内部抽象类,叫做Stub,它是继承Binder并且实现你AIDL接口的 你必须继承这个Stub类并且实现这些方法

  

3.暴露这个接口给客户端 

  实现一个service并且覆盖onBind()方法返回你的Stub实现类。

你的.aidl文件必须被复制到其他应用程序中来让他们访问你service的接口,你必须维护原始接口的支持(向后兼容)。

用一个实例来分步骤说明

在server项目中建立.aidl文件 

  AIDL使用一个简单的语法让你声明一个带有一个或者多个带有参数和返回值方法的接口 参数和返回值可以是任何类型,甚至是AIDL生成的接口。

  

  IService.aidl

  


package com.example.aidl;

interface IService {

    String hello(String name);
}

在server项目中建立服务类

  当你编译你的应用时,Android SDK工具生成一个.java接口文件用你的.aidl文件命名生成的接口包含一个名字为Stub的子类,这是一个它父类的抽象实现,并且声明了.aidl中所有的方法。

  

  Stub也定义了一些辅助的方法,最显著的就是asInterface(),它是用来接收一个IBinder(通常IBinder传递给客户端的onServiceConnected()回调方法)并且返回一个Stub接口的实例 。

  一旦你为service实现了接口,你需要把它暴露给客户端,这样他们才能绑定到上面 为了给你的service暴露接口,继承Service并且实现onBind()方法返回一个你实现生成的Stub类。

   AIDLService.java

public class AIDLService extends Service {

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // Return the interface
        return new IService.Stub() {
            @Override
            public String hello(String name) throws RemoteException {
                // TODO Auto-generated method stub
                return "hello"+name;
            }
        };
    }

在server项目AndroidManifest中申明Service

<service
  android:name="com.example.service.AIDLService" >
   <intent-filter>
<action android:name="android.intent.action.AIDLService" />
  </intent-filter>
        </service>

把server项目中的aidl文件带包拷贝到client项目中(包名要相同)

MainActivity.java

public class MainActivity extends Activity {

    IService RemoteService; //监听服务
    private ServiceConnection mConnection = new ServiceConnection() {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            Log.i("mConnection", service+"");
            RemoteService = IService.Stub.asInterface(service);

            try {
                String s= RemoteService.hello("finch");
Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub

        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initService();
    }
    //连接服务
        private void initService() {
            Intent i = new Intent( );
            i.setAction("android.intent.action.AIDLService");
            boolean ret = bindService(i, mConnection, Context.BIND_AUTO_CREATE);
        }

        //断开服务
        private void releaseService() {
            unbindService(mConnection);
            mConnection = null;
        }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        releaseService();
    }
}

运行结果:

文章中AIDL例子代码下载

时间: 2024-11-06 20:23:13

[Android] AIDL的使用情况和实例介绍的相关文章

[Android] IntentService使用详解和实例介绍

IntentService定义 IntentService继承与Service,用来处理异步请求.客户端可以通过startService(Intent)方法传递请求给IntentService.IntentService在onCreate()函数中通过HandlerThread单独开启一个线程来依次处理所有Intent请求对象所对应的任务. 这样以免事务处理阻塞主线程(ANR).执行完所一个Intent请求对象所对应的工作之后,如果没有新的Intent请求达到,则**自动停止**Service:

实例介绍 Java(android) 回调函数使用方法

在Android开发中经常用到回调机制,其中最典型的就是控件被触发的实现方式,简单而言,如Button被Click后,是系统调用了OnClick方法,而我们为Button注册了OnClickListener监听器,当被触发Click后,OnClickListener中的OnClick方法就会被回调,我们就能在其中执行相应操作了. 下面举一个简单的例子介绍回调的实现方式: 回调函数使用的简单例子 程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序

Android AIDL实例解析

AIDL这项技术在我们的开发中一般来说并不是很常用,虽然自己也使用新浪微博的SSO登录,其原理就是使用AIDL,但是自己一直没有动手完整的写过AIDL的例子,说来丢人呐,所以就有了这篇简单的文章.        AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成 AIDL可识别的参数(可能是多个参数),

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

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

Android AIDL使用详解_Android IPC 机制详解

一.概述 AIDL 意思即 Android Interface Definition Language,翻译过来就是Android接口定义语言,是用于定义服务器和客户端通信接口的一种描述语言,可以拿来生成用于IPC的代码.从某种意义上说AIDL其实是一个模板,因为在使用过程中,实际起作用的并不是AIDL文件,而是据此而生成的一个IInterface的实例代码,AIDL其实是为了避免我们重复编写代码而出现的一个模板 设计AIDL这门语言的目的就是为了实现进程间通信.在Android系统中,每个进程

【Java/Android性能优3】Android性能调优工具TraceView使用介绍

本文转自:http://blog.csdn.net/innost/article/details/9008691 在软件开发过程中,想必很多读者都遇到过系统性能问题.而解决系统性能问题的几个主要步骤是: 测评:对系统进行大量有针对性的测试,以得到合适的测试数据. 分析系统瓶颈:分析测试数据,找到其中的hotspot(热点,即bottleneck). 性能优化:对hotspot相关的代码进行优化. 由上述步骤可知,性能优化的目标对象是hotspot.如果找到的hotspot并非真正的热点,则性能优

第一章 Android系统的编译和移植实例

第一章 Android系统的编译和移植实例 这一章节主要介绍了Android系统的编译和移植技术,作为建立在Linux内核的基础上的Android操作系统,它的编译和移植不论在过程还是技术方面都和嵌入式Linux非常相似. 首先要准备一套可以正常运行Linux系统的一套开发版,需要在其移植Android系统,并能够正常运行. 移植的主要过程为: 1.下载Android Linux 内核 2.安装交叉工具链 3.移植Android Linux 内核支持的平台 4.安装Android SDK 5.获

Java 代码优化过程的实例介绍

衡量程序的标准 衡量一个程序是否优质,可以从多个角度进行分析.其中,最常见的衡量标准是程序的时间复杂度.空间复杂度,以及代码的可读性.可扩展性.针对程序的时间复杂度和空间复杂度,想要优化程序代码,需要对数据结构与算法有深入的理解,并且熟悉计算机系统的基本概念和原理:而针对代码的可读性和可扩展性,想要优化程序代码,需要深入理解软件架构设计,熟知并会应用合适的设计模式. 首先,如今计算机系统的存储空间已经足够大了,达到了 TB 级别,因此相比于空间复杂度,时间复杂度是程序员首要考虑的因素.为了追求高

Android AIDL开发

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