AIDL的简单使用

AIDL的简单使用

1 AIDL(Android Interface Definition Language):接口定义语言。

2 当需要在不同的进程之间传递对象时,比如在不同的应用之间传递对象的时候,就需要使用AIDL。

3 AID使得一个应用能够调用另一个应用的服务。

一、 服务端应用(其实就一个提供服务的应用)

1 创建AIDL文件

这里用的开发工具是Android Studio,在main文件夹下创建aidl文件夹,和java文件夹同级,在aidl文件夹中创建包,包名与应用包名必须一致,最后创建aidl文件:PeopleServiceAIDL.aidl

package com.miquan.demo;

// AIDL其实就是一个接口,定义了通讯的规则。
interface PeopleServiceAIDL {
    String findPeople(int num);
}

此时点击Android Studio菜单中的Build > Make Module xxx,然后就会生成一个对应的类了。具体位置:build > generated > source > aidl > debug > xxx

2 创建Service

PeopleService.java

package com.miquan.demo;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;

public class PeopleService extends Service {
    private IBinder mBinder = new PeopleServiceBinder();

    public PeopleService() {
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    private final class PeopleServiceBinder extends PeopleServiceAIDL.Stub {
        @Override
        public String findPeople(int num) throws RemoteException {
            return num == 0 ? "王尼玛" : "唐马儒";
        }
    }
}

在清单文件中配置Service(用隐式启动):

<service android:name=".PeopleService">
    <intent-filter>
        <action android:name="com.miquan.demo.people.service"/>
    </intent-filter>
</service>

至此服务端完成了。

二、 客户端(调用端)

首先要以同样的方法创建aidl文件,或者复制过来,要对应的。

package com.miquan.as3;

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.widget.Button;

import com.miquan.demo.PeopleServiceAIDL;

public class MainActivity extends Activity {
    private Button mButton;

    private PeopleServiceAIDL mPeopleServiceAIDL;

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

        mButton = (Button) findViewById(R.id.button);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    // 这里得到的name就是从另外一个应用中的服务得到的
                    String name = mPeopleServiceAIDL.findPeople(0);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });

        bindService(new Intent("com.miquan.demo.people.service"), mServiceConnection, BIND_AUTO_CREATE);
    }

    private ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mPeopleServiceAIDL = PeopleServiceAIDL.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mPeopleServiceAIDL = null;
        }
    };

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

时间: 2024-08-05 01:30:00

AIDL的简单使用的相关文章

【翻译】Android Interface Definition Language (AIDL)

参考地址:https://developer.android.com/guide/components/aidl.html Android Interface Definition Language (AIDL) AIDL (Android Interface Definition Language) is similar to other IDLs you might have worked with. It allows you to define the programming inter

AIDL

AIDL的作用 在Android平台,每个应用程序都是一个单独的JVM,都运行在自己的进程空间里, 通常,一个进程不允许访问另一个进程的内存空间(一个应用不能访问另一个应用).当用户(程序开发人员)想在一个App中访问另一个App的进程空间的时候,就需要进程间通信.在Android中,远程服务为我们提供了实现进程间通信的方式,其中,AIDL是应用程序开发人员常的一种方式. AIDL (Android Interface Definition Language) 是一种IDL 语言,用于生成可以在

Android:IPC之AIDL的学习和总结

为了使得一个程序能够在同一时间里处理许多用户的要求.即使用户可能发出一个要求,也肯能导致一个操作系统中多个进程的运行(PS:听音乐,看地图).而且多个进程间需要相互交换.传递信息,IPC方法提供了这种可能.IPC方法包括管道(PIPE).消息排队.旗语.共用内存以及套接字(Socket). Android中的IPC方式有Bundle.文件共享.Messager.AIDL.ContentProvider和Socket. 这次我们学习的是Android中的AIDL. 概述 AIDL(Android接

基础篇-Binder机制和AIDL使用介绍

简介: 我们知道,Android系统是基于Linux内核的,而Linux内核继承和兼容了丰富的Unix系统进程间通信(IPC)机制.例如管道(Pipe),报文队列(Message).共享内存(Share Memory)和信号量(Semaphore)等等.但是Android系统没有采用上述提到的各种进程间通信机制,而是采用Binder机制.在Android系统的Binder机制中,由一系列系统组件组成,分别是Client.Server.Service Manager和Binder驱动程序,其中Cl

Android AIDL 进程之间的通信

关于IPC应该不用多介绍了,Android系统中的进程之间不能共享内存,那么如果两个不同的应用程序之间需要通讯怎么办呢?比如公司的一个项目要更新,产品的需求是依附于当前项目开发一个插件,但是呢这个插件功能以及界面比较复杂,不能和当前项目在一个进程中,同时呢,还要用到当前项目中已经写好了的一些东西,那么因为新开发的依附于当前项目的插件和当前项目不是一个进程,因此不能共享内存,就出现了问题,于是,需要提供一些机制在不同进程之间进行数据通信,这个机制就是AIDL了. 一.一个android中AIDL的

Android深入源码分析理解Aidl整体调用流程(雷惊风)

2017年开始上班的第一天,老不想工作了,假期感觉还没开始就已经结束了,唉,时间就是这样,新的一年开始了,虽然很不想干正事,没办法,必须干起来,因为后边的路还很长,距离六十岁还很远.刚上班也没什么事,复习一下之前的东西,看了一下Aidl相关的知识,仔细瞅了瞅Aidl的调用流程,这里写篇文章整理一下,帮助大家的同时,自己也加深一下印象.对Aidl不太了解的童鞋可以先看一下我之前的一篇文章, 链接如下:http://blog.csdn.net/liuyonglei1314/article/detai

Android学习小Demo(23)Aidl实现进程间通信

我们知道,Android是靠Binder机制来实现进程间的通信,而上一篇文章中,我们利用AIDL,简单地从代码方面的角度讲解了在服务端中的Binder的存在形式,是以服务的实现存在的,而在客户端,则是以代理的形式,实现存在的只是一个关于服务端的Binder实现的引用. 理论上的东西我们要去学习掌握,但是也不能忽略了实际的动手能力,对吧. 今天,我们就一步一步地利用我们所了解地关于AIDL的知识来实现一个跨进程通信的例子. 在Android的上层应用中,每一个App都是一个单独的进程,所以,要实现

[Android Pro] AIDL进程间传递自定义类型参数

1.创建.aidl 文件 AIDL 语法简单,用来声明接口,其中的方法接收参数和返回值,但是参数和返回值的类型是有约束的,且有些类型是需要 import,另外一些则无需这样做. AIDL 支持的数据类型划分为四类,第一类是 Java 编程语言中的基本类型,第二类包括 String.List.Map 和 CharSequence,第三类是其他 AIDL 生成的 interface,第四类是实现了 Parcelable protocol 的自定义类. 其中,除了第一类外,其他三类在使用时均需要特别小

android基础----&gt;aidl服务的使用

AIDL和其他的IDL类似,它允许你定义程序接口,以便客户端与服务器端通过IPC机制交互.在android上面,一个进程一般不能访问另外进程的内存.因此,Android平台将这些跨进程访问的对象分解成操作系统能够识别的简单对象.并为跨应用访问而特殊编排和整理这些对象.用于编排和整理这些对象的代码编写起来十分冗长,所以Android的AIDL提供了相关工具来自动生成这些代码.今天,我们开始AIDL的学习. 简单说明 一,AIDL的定义: 它是一种android内部进程通信接口的描述语言,通过它我们