`
zhuxinzx
  • 浏览: 293700 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android中的AIDL

 
阅读更多

今天要给大家分享的是Android AIDL的使用。在Android中,每个应用程序都可以有自己的进程。在写UI应用的时候,经常要用到Service。在不同的进程中,怎样传递对象呢?显然,Java中不允许跨进程内存共享。因此传递对象,只能把对象拆分成操作系统能理解的简单形式,以达到跨界对象访问的目的。在J2EE中,采用RMI的方式,可以通过序列化传递对象。在Android中,则采用AIDL的方式。理论上AIDL可以传递Bundle,实际上做起来却比较麻烦。

AIDL(AndRoid接口描述语言)是一种借口描述语言。编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的。如果需要在一个Activity中,访问另一个Service中的某个对象,需要先将对象转化成AIDL可识别的参数(可能是多个参数),然后使用AIDL来传递这些参数,在消息的接收端,使用这些参数组装成自己需要的对象。

AIDL的IPC的机制和COM或CORBA类似,是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值。如果要使用AIDL,需要完成2件事情:1、引入AIDL的相关类;2、调用aidl产生的class。

今天的两个实例用到两个Android工程,一个是AIDL的服务端另一个是客户端。

服务端的实现步骤:

首先看一下服务端,工程目录如下:

 

首先创建IaidlServerService.aidl文件,代码如下(一个简单方法,另一个返回对象方法),当我们点击保存时会在gen目录下生成对应的java文件,如上图红色部分:

 

package com.chapter8.aidl;
 
import com.chapter8.aidl.Book;
 
interface IAIDLServerService {
    String sayHello();
    Book getBook();
}

 第二步:因为这个接口里有传递对象,所以对象要特殊处理一下,这里继承了Parcelable,Book.java代码如下:

如果大家不明的地方,请参见,下面连接的文章:

《Android高手进阶教程》17.Android Intent传递对象的两种方法

package com.chapter8.aidl;
 
import android.os.Parcel;
import android.os.Parcelable;
 
public class Book implements Parcelable {
 
    private String bookName;
    private int bookPrice;
 
    public Book() {
 
    }
 
    public Book(Parcel parcel) {
        bookName = parcel.readString();
        bookPrice = parcel.readInt();
    }
 
    public String getBookName() {
        return bookName;
    }
 
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
 
    public int getBookPrice() {
        return bookPrice;
    }
 
    public void setBookPrice(int bookPrice) {
        this.bookPrice = bookPrice;
    }
 
    public int describeContents() {
        return 0;
    }
 
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeString(bookName);
        parcel.writeInt(bookPrice);
    }
 
    public static final Parcelable.Creator<book> CREATOR = new Creator<book>() {
        public Book createFromParcel(Parcel source) {
 
            return new Book(source);
        }
 
        public Book[] newArray(int size) {
            return new Book[size];
        }
    };
}

 第三步:写一个与Book类对应的aidl,命名为Book.aidl,代码非常简单,代码如下:

parcelable Book

 第四步:新建一个名为AidlServerService的Service。代码如下:

package com.chapter8.aidl;
 
import com.chapter8.aidl.IAIDLServerService.Stub;
import com.chapter8.aidl.IAIDLServerService;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
 
public class AidlServerService extends Service {
    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
 
    /**
     * 在AIDL文件中定义的接口实现。
     */
    private IAIDLServerService.Stub mBinder = new Stub() {
 
        public String sayHello() throws RemoteException {
            return "Hello";
        }
 
        public Book getBook() throws RemoteException {
            Book mBook = new Book();
            mBook.setBookName("Android应用开发");
            mBook.setBookPrice(50);
            return mBook;
        }
    };
}

 第五步:在AndroidManifest.xml注册Service,代码如下:

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.chapter8.aidl" android:versionCode="1"
    android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name="AidlServerActivity" android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="AidlServerService" android:process=":remote">
            <intent-filter>
                <action android:name="com.chapter8.aidl.IAIDLServerService"></action>
            </intent-filter>
        </service>
    </application>
</manifest>

 第六步:运行服务端工程,到设备上,好让客户端调用,服务端的Activity什么都没做。效果如下:

客户端的具体实现步骤:

第一步:新建客户端工程,目录结构如下:

第二步:引入Aidl文件以及用到的类,如上面的com.chapter8.aidl包。直接从服务端里代码copy过来就OK。

第三步:修改main.xml布局文件,增加一个按钮,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:id="@+id/textview"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
<Button
    android:id="@+id/button"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="调用AIDL服务"
    />
</LinearLayout>

 第四步:修改AidlClientActivity.java代码如下:

package com.chapter8.aidlclient;
 
import com.chapter8.aidl.IAIDLServerService;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
 
public class AidlClientActivity extends Activity {
 
    private TextView mTextView;
    private Button mButton;
 
    private IAIDLServerService mIaidlServerService = null;
 
    private ServiceConnection mConnection = new ServiceConnection() {
 
        public void onServiceDisconnected(ComponentName name) {
            mIaidlServerService = null;
        }
 
        public void onServiceConnected(ComponentName name, IBinder service) {
            mIaidlServerService = IAIDLServerService.Stub.asInterface(service);
            // aidl通信
            try {
                String mText = "Say hello: " + mIaidlServerService.sayHello()
                        + "/n";
                mText += "书名: " + mIaidlServerService.getBook().getBookName()
                        + "/n";
                mText += "价格: " + mIaidlServerService.getBook().getBookPrice();
                mTextView.setText(mText);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
    };
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // 初始化控件
        mTextView = (TextView) findViewById(R.id.textview);
        mButton = (Button) findViewById(R.id.button);
        // 增加事件响应
        mButton.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // bindService
                Intent service = new Intent(
                        "com.chapter8.aidl.IAIDLServerService");
                bindService(service, mConnection, BIND_AUTO_CREATE);
            }
 
        });
    }
 
}

 第五步:运行客户端工程,效果如下:

分享到:
评论

相关推荐

    android中aidl的基本应用

    描述 :整理了下android中的aidl, 项目中主要是用作于Activity和Service之间进行跨进程的通信和调用,定义了几种基本类型的接口,其中涵盖了自定义参数类型的传递。 注意: 解压后有两个android程序,一个client端 ...

    Android中AIDL的Binder连接池Demo

    在Android系统中,IPC(Inter-Process Communication)是不同进程之间通信的重要机制,而AIDL(Android Interface Definition Language)则是实现IPC的一种方式。AIDL允许我们定义接口,使得服务可以在不同的进程中...

    Android中aidl开发简单示例

    在Android系统中,AIDL(Android Interface Definition Language)是一种接口定义语言,用于处理进程间通信(IPC, Inter-Process Communication)。这个"Android中aidl开发简单示例"提供了AIDL的基本使用方法,通过...

    android中aidl的使用

    ### Android中AIDL的使用详解 #### 一、AIDL简介 AIDL(Android Interface Definition Language)是Android系统提供的一种接口定义语言,用于定义不同进程间通信(IPC, Inter-Process Communication)的服务接口。...

    Android中AIDL的使用Demo

    自定义类型需要先在AIDL中声明。 三、生成Binder类 当编译Android工程时,AIDL文件会被编译成Java代码,生成一个实现了该接口的 Binder 类。这个类负责处理跨进程调用,将方法调用转换为消息传递。 四、服务端实现...

    Android中AIDL的使用步骤、传递对象以及各部分代码的执行线程

    在Android系统中,AIDL(Android Interface Definition Language)是一种用于跨进程通信(IPC,Inter-Process Communication)的机制,使得应用程序的不同组件可以在不同的进程中相互通信。本篇文章将详细讲解AIDL的...

    [经验分享]Android中AIDL实现(跨进程通信.pdf

    Android 中的 AIDL (Android Interface Definition Language) 是一种跨进程通信(IPC)机制,允许一个应用的组件与另一个应用的组件进行通信。在 Android 开发中,不同应用或应用的不同部分通常运行在不同的进程空间...

    Android AIDL 服务端与客户端实现Demo

    - AIDL支持基本类型、List、Map以及自定义类型的传递,但自定义类型必须同样在AIDL中定义。 - AIDL接口方法的参数和返回值都会进行序列化和反序列化,因此可能消耗一定的性能。 - 当服务端进程被杀死后,客户端的 ...

    android_aidl例子

    在Android开发中,AIDL(Android Interface Definition Language)是一种重要的工具,用于实现应用程序间的跨进程通信(IPC,Inter-Process Communication)。AIDL使得一个应用能够暴露其服务给其他应用调用,即使...

    android studio aidl demo

    通过“android studio aidl demo”,你可以动手实践,理解AIDL的工作流程,掌握如何在Android应用中实现高效、可靠的进程间通信。这不仅有助于提升应用的架构设计,还能解决多应用协作时遇到的问题。在实际开发中,...

    android的aidl解析

    在Android系统中,AIDL(Android Interface Definition Language)是一种接口定义语言,用于实现进程间通信(IPC, Inter-Process Communication)。它允许应用程序组件在不同进程中运行并相互通信,解决了Android中...

    Android服务Aidl的示例demo

    Android下Aidl的使用,详细请参见博客:http://www.cnblogs.com/plokmju/p/android_Service_aidl_NormalType.html 和 http://www.cnblogs.com/plokmju/p/android_Service_aidl_CustomType.html

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

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

    Android Studio编写AIDL文件后如何实现自动编译生成

    在目录src/main 下新建了aidl 文件夹之后,在aidl文件夹中也创建了相同的包路径, 创建AIDL文件 XXX.aidl 如果XXX.aidl引用了一个java下的model例如引用了a.b.c.Model; 则需要在XXX.aidl文件中声明import a.b.c....

    AndroidAIDL

    - 在AIDL文件中定义接口,接口中的方法参数和返回值必须是Android支持的类型或者自定义的Parcelable对象。 实现服务: - 在服务类中,声明实现AIDL接口的成员变量,并重写`onBind()`方法,返回Stub的实例。 客户端...

    android aidl demo

    aidldemo android aidl demo 入门 简介。Android 中AIDL的使用与理解 (一)

    Android的AIDL例子

    总结,AIDL是Android系统中实现进程间通信的重要工具,它简化了复杂的跨进程调用流程,使得服务端和客户端可以高效协作。理解和掌握AIDL的使用,对于开发复杂的Android应用程序至关重要。通过`AidlClient`和`...

    Android aidl Binder框架浅析

    **Android aidl Binder框架浅析** 在Android系统中,服务间的通信是通过Binder机制实现的,它是Android系统中进程间通信(IPC)的核心组件。Binder框架允许不同进程间的对象互相调用方法,使得数据和操作可以在不同...

    android AidlDemo(简单aidl的例子)

    在Android开发中,AIDL(Android Interface Definition Language)是一种用于进程间通信(Inter-Process Communication, IPC)的工具,使得不同应用之间的服务可以共享数据和功能。本示例"android AidlDemo(简单aidl...

Global site tag (gtag.js) - Google Analytics