`
enhanceskill
  • 浏览: 2633 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
最近访客 更多访客>>
社区版块
存档分类
最新评论

AIDL简单实例

阅读更多

 

每一个应用程序都有自己的进程,进程之间不能互相访问,这叫做应用程序沙漏(application sandboxing
为了能用使应用程序能互相访问,Android提供IPC(interprocess communication protocol
IPC protocol因为需要整理封装(marshaling/un marshaling数据)而变得复杂。
因此.Android提供 AIDL(Android Interface Definition Language),它对使用了类似于java的语法,对IPC轻量级实现,并有AIDL工具自动实现stub的创建
实现步骤:
1.定义 the AIDL interface
2.为remote service实现Stub
3.将remote service提供给本地 local client

第一步:定义 the AIDL interface

package com.marakana;// 定义接口
]AIDLinterface IAdditionService {    // 可传递标记in, out, or inout.     // Primitive 类型 (例如 int, boolean, etc.) 仅能而其默认是in.   
int add(in int value1, in int value2);}

 

第二步:为remote service实现Stub

/**
* 这个类实现了remote service 到 Local client 本地
*/
public class AdditionService extends Service {
  private static final String TAG = "AdditionService";
  
  @Override
  public void onCreate() {
    super.onCreate();
    Log.d(TAG, "onCreate()");
  }
  
  //返回remote 对象

  @Override
  public IBinder onBind(Intent intent) {

    return new IAdditionService.Stub() {
      /**
       * Implementation of the add() method
       */
      public int add(int value1, int value2) throws RemoteException {
        Log.d(TAG, String.format("AdditionService.add(%d, %d)",value1, value2));
        return value1 + value2;
      }

    };
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    Log.d(TAG, "onDestroy()");
  }
}

 
第三步:将remote service提供给本地 local client
利用servcie实现onBind(),就可以连接到remote service

public class AIDLDemo extends Activity {
  private static final String TAG = "AIDLDemo";
  IAdditionService service;
  AdditionServiceConnection connection;

  /**
   * 这个类实现了真实的remote service的连接.它将IBinder类型的对象,也就是Stub的实现类
   * 转为 AIDL 接口.    asInterface方法是aild工具产生的比较重要的方法
   */
  class AdditionServiceConnection implements ServiceConnection {

    public void onServiceConnected(ComponentName name, IBinder boundService) {
       service = IAdditionService.Stub.asInterface((IBinder) boundService);
      Log.d(AIDLDemo.TAG, "onServiceConnected() connected");
      Toast.makeText(AIDLDemo.this, "Service connected", Toast.LENGTH_LONG)
          .show();
    }

    public void onServiceDisconnected(ComponentName name) {
      service = null;
      Log.d(AIDLDemo.TAG, "onServiceDisconnected() disconnected");
      Toast.makeText(AIDLDemo.this, "Service connected", Toast.LENGTH_LONG)
          .show();
    }
  }

  /** 将Activity绑定到Service. */
  private void initService() {
    connection = new AdditionServiceConnection();
    Intent i = new Intent();
    i.setClassName("com.marakana", com.marakana.AdditionService.class.getName());
    boolean ret = bindService(i, connection, Context.BIND_AUTO_CREATE);
    Log.d(TAG, "initService() bound with " + ret);
  }

  /** 解除绑定. */
  private void releaseService() {
    unbindService(connection);
    connection = null;
    Log.d(TAG, "releaseService() unbound.");
  }

  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    initService();

    // Setup the UI
    Button buttonCalc = (Button) findViewById(R.id.buttonCalc);

    buttonCalc.setOnClickListener(new OnClickListener() {
      TextView result = (TextView) findViewById(R.id.result);
      EditText value1 = (EditText) findViewById(R.id.value1);
      EditText value2 = (EditText) findViewById(R.id.value2);

      public void onClick(View v) {
        int v1, v2, res = -1;
        v1 = Integer.parseInt(value1.getText().toString());
        v2 = Integer.parseInt(value2.getText().toString());

        try {
          res = service.add(v1, v2);
        } catch (RemoteException e) {
          Log.d(AIDLDemo.TAG, "onClick failed with: " + e);
          e.printStackTrace();
        }
        result.setText(new Integer(res).toString());
      }
    });
  }

  /** Called when the activity is about to be destroyed. */
  @Override
  protected void onDestroy() {
    releaseService();
  }

}

   
资源来源:http://marakana.com/forums/android/examples/48.html

源代码:    http://marakana.com/static/tutorials/AIDLDemo.zip

 

 

 

 

分享到:
评论

相关推荐

    aidl简单实例

    在提供的"aidl简单实例"中,可能包含以下内容: - 一个简单的.aidl文件,定义了一个接口,比如`IMyService.aidl`,里面可能只有一个或多个方法。 - 服务端的实现,包括一个实现了`IMyService`接口的类,以及在服务...

    android aidl 简单例子

    本例"android aidl简单例子"提供了一个基础的示例,展示了如何在客户端和服务端通过AIDL进行通信,且两者都在同一台设备上运行。 首先,理解AIDL的基本概念是关键。AIDL定义了接口,这个接口就像一座桥梁,使得...

    android aidl简单实例

    这个“android aidl简单实例”提供了在Android 3.0 SDK平台上使用AIDL的基本步骤和示例代码。 首先,我们了解AIDL的基本概念。AIDL定义了一种服务端接口,客户端可以通过这个接口调用服务端的方法。它的工作原理是...

    android AIDL简单例子

    本篇文章将基于提供的标题“android AIDL简单例子”和描述,详细介绍AIDL的基本概念、用途,以及如何通过实例来理解和使用AIDL。 **AIDL简介** AIDL是Android开发中的一个重要组件,它允许不同进程间的Android组件...

    AIDL简单实例下载

    **Android AIDL(Android Interface Definition Language)简单实例详解** AIDL是Android系统提供的一种接口定义语言,用于在不同进程间实现通信,特别是当服务需要在后台处理并与其他应用交互时。通过AIDL,我们...

    android AidlDemo(简单aidl的例子)

    本示例"android AidlDemo(简单aidl的例子)"将带领我们深入理解如何在Android应用中使用AIDL。 1. **AIDL的基本概念** - AIDL是一种接口定义语言,它的主要作用是让不同的Android进程能够安全、高效地进行通信。 -...

    AidlDemo(简单aidl的例子.zip

    **标题解析:** "AidlDemo(简单aidl的例子.zip" 这个标题表明这是一个关于Android应用程序开发的示例项目,特别关注了AIDL(Android Interface Definition Language)的使用。AIDL是Android系统中用于进程间通信...

    简单的aidl例子

    本教程将通过一个简单的Aidl例子,帮助安卓学习新手理解其工作原理和应用。 标题中的“简单的aidl例子”指的是一个基础的AIDL示例项目,它演示了如何创建、实现以及使用AIDL接口。AIDL的基本结构包括定义接口、生成...

    AndroidAidlDemo(简单aidl的例子).rar

    这个"AndroidAidlDemo(简单aidl的例子)"压缩包提供了一个实例,帮助开发者理解并掌握如何在Android应用程序中使用AIDL。下面将详细介绍AIDL及其在实际开发中的应用。 **什么是AIDL?** AIDL是Android系统提供的一个...

    AIDL简单使用示例代码

    在本示例中,我们将探讨"AIDL简单使用"的代码实践。 首先,我们需要了解AIDL的基本结构。AIDL文件是`.aidl`格式,它定义了一个接口,该接口包含了服务和客户端之间可以调用的方法。下面是一个简单的AIDL接口示例: ...

    Android项目之AidlDemo(简单aidl的例子)

    Android项目之AidlDemo(简单的aidl的例子)。AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写。需要的小伙伴自请下载。

    AIDL的简单例子

    **Android Interface Definition Language (AIDL) 简介** AIDL(Android Interface Definition Language)是Android系统提供的一...在`aidlDemo`这个示例项目中,你将看到如何从头开始创建和使用一个简单的AIDL服务。

    一个简单的AIDL例子

    在这个简单的AIDL例子中,我们将探讨如何创建并使用AIDL文件来实现跨进程通信。 首先,我们需要理解AIDL的基本概念。AIDL文件是一种文本文件,它的作用是定义接口,这个接口会被编译成Java代码,允许客户端和服务端...

    安卓Android源码——AidlDemo(简单aidl的例子).zip

    这个压缩包包含了实现简单AIDL功能的全部源代码,帮助开发者理解这一技术。 首先,我们需要了解AIDL的基本概念。AIDL是一种接口定义语言,它允许开发者定义可以在不同Android进程间调用的方法。当一个应用需要与另...

    AidlDemo(简单aidl的例子).zip

    **标题解析:** "AidlDemo(简单aidl的例子)" 这个标题表明这是一个关于Android应用项目,重点在于演示如何使用AIDL(Android Interface Definition Language)进行进程间通信(IPC)。AIDL是Android系统提供的一种...

    aidl简单案例

    综上所述,"aidl简单案例"主要展示了如何使用AIDL进行进程间通信,包括服务端的接口定义、实现和注册,以及客户端的连接、调用和服务解绑。这是一项重要的Android技能,有助于开发跨进程通信的应用场景,如后台服务...

    Android应用源码之AidlDemo(简单aidl的例子).zip

    **Android应用源码之AidlDemo(简单aidl的例子)** 在Android开发中,AIDL(Android Interface Definition Language)是一种非常重要的工具,用于处理进程间通信(IPC, Inter-Process Communication)。AidlDemo是一...

    Aidl下的Binder简单例子

    本教程将通过一个简单的Binder服务器示例来解释AIDL和Binder机制的工作原理。 首先,我们来看"BinderServer"。在Android应用开发中,服务(Service)通常作为后台运行的任务,而当需要跨进程通信时,我们可以创建一...

    AidlDemo(简单aidl的例子)

    在`onServiceConnected`回调中,你可以通过`IBinder`获取到服务实例,然后通过`IAidlService.Stub.asInterface()`方法将其转换为接口对象,从而可以调用服务提供的方法。 5. **调用服务方法**:现在,客户端可以...

    aidl简单示例

    本示例将通过"aidlclientdemo"和"aidlserverdemo"两个项目,详细介绍如何使用AIDL进行简单的IPC操作。 首先,我们来理解AIDL的基本概念。在AIDL文件中,我们可以定义服务端提供的接口以及接口中的方法,这些方法会...

Global site tag (gtag.js) - Google Analytics