打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
AIDL简介

AIDL简介

分类: Android 4.0 AIDL 285人阅读 评论(0) 收藏 举报

        通常每个应用程序都在他自己的进程内运行,但有时需要在进程之间传递对象(IPC通信)。此时可以通过应用程序UI的方式写一个运行在不同进程中的service。在Android平台中,一个进程通常不能访问其他进程中的内存区域。所以它们需要把对象拆分成操作系统能理解的简单形式,以便伪装成对象跨边界访问。而要完成这些需要AIDL机制。

        AIDL(Android接口描述语言)是一个IDL语言,它可以生成一段代码,可以是一个在Android设备上运行的两个进程使用内部通信进程进行交互。如果你想在一个进程中(例如在一个Activity中)访问另一个进程中(例如service)某个对象的方法,你就可以使用AIDL来生成这样的代码来伪装传递各种参数。

        要使用AIDL,service需要以AIDL文件的方式提供服务接口,AIDL工具将生成一个相应的java接口,并且在生成的服务器接口中包含一个功能调用的stub()服务桩类。service的onBind方法会返回实现类的对象,之后你就可以使用它了。

        AIDL文件

        framework中包含的aidl是在frameworks/base/Android.mk中定义的。该文件定义了两处aidl文件列表。

        第一处是给LOCAL_SRC_FILES变量中使用 “+=” 进行赋值,该变量将包含在framework.jar目标中的所有源文件,包括aidl文件和java文件。

        第二处是给aidl_files变量使用“:=”赋值符号进行赋值,该变量仅仅包含android.jar目标中所有的aidl文件。

        因此,当给Frameworks中添加新的aidl文件时,需要考虑文件是否要公开到SDK中。如果需要,则需要把该文件路径同时添加到以上两个变量中;如果不需要公开到SDK中,则只需要把文件路径添加到LOCAL_SRC_FILES变量中。

      在完成这些操作后编译仍会出现问题,此时需要运行,make update-api命令,此时改变的文件是current.txt改变的内容如下:

+  public abstract interface IEneaService implements android.os.IInterface {

+  }

+

+  public static abstract class IEneaService.Stub extends android.os.Binder implements android.os.IEneaService {

+    ctor public IEneaService.Stub();

+    method public android.os.IBinder asBinder();

+    method public static android.os.IEneaService asInterface(android.os.IBinder);

+    method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;

+  }

+

        这时,如果希望在写的Activity中使用的情况下,需要首先获取服务,这个步骤是通过"ServiceManager.getService()"这个API实现。然后使用service handle来调用service暴露出来的函数。ITestService om = ITestService.Stub.asInterface(ServiceManager.getService("Test"));

       下面是个简单的例子:

/** HelloServer.java*/package com.Test.helloserver;import android.app.Activity;import android.os.Bundle;import android.os.ServiceManager;import android.os.ITestService;import android.util.Log;public class HelloServer extends Activity {    private static final String DTAG = "HelloServer";    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                ITestService om = ITestService.Stub.asInterface(ServiceManager.getService("Test"));        try {			    Log.d(DTAG, "Going to call service");			    om.setValue(20);			    Log.d(DTAG, "Service called succesfully");        }        catch (Exception e) {			    Log.d(DTAG, "FAILED to call service");    			e.printStackTrace();        }    }}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Binder:为什么要通过onTransact()调用目标方法
【转】Android-Adding SystemService
Android 进程间通信(AIDL)使用详解
使用AIDL实现进程间的通信
使用AIDL实现进程间的通信之复杂类型传递
Binder机制,从Java到C (1. IPC in Application Remote Service)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服