Android之IPC(aidl)

IPC(Inter-Process Conmunication) 进程间通讯

在同一进程中,各个组件进行通信是十分方便的,普通的函数调用就可以解决;但是,对于处于不同进程中的组件来说,要进行通信,就需要用到Android的IPC机制了。

IBinder/Binder是Android远程对象的基本接口,它是Android用于提高IPC通信而设计的一套轻量级远程调用机制的核心部分。该接口描述了与一个远程对象进行通信的抽象协议。

AIDL: Android interface definition language Android接口定义语言:专门用来解决进程之间的通信。

  1. 远程服务:运行在其他应用里面的服务
  2. 本地服务:运行在自己应用里面的服务
  3. 进程间通信 IPC
  4. aidl支持的类型:基本数据类型,String,CharSequence, List, Map, 自定义(实现Parcelable接口的)对象

AIDL 实现步骤:

  1. 先把Iservice.java文件变为aidl文件,不要修饰符
  2. 会自动生成一个Stub类,实现IPC
  3. 我们定义的MyBinder类直接实现Stub类,Stub是继承Binder实现IService接口
  4. 想要保证应用程序的aidl文件是同一个,要求aidl文件所在的包名相同
  5. 通过Stub类的静态方法Stub.asinterface(IBinder obj)获取IService对象

实现操作:

Remote服务器端:

记得在清单文件中注册服务,并设置action动作,以便在另一个应用中连接通信。

// IService.aidl
package com.example.lenovo.remoteservice;

// Declare any non-default types here with import statements

interface IService {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */

     int callAddMethod(int a, int b);
}

public class MyRemoteService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBinder();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        return super.onUnbind(intent);
    }

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

    public int  addMethod(int a, int b){
       return a+b;
    }

    class MyBinder extends IService.Stub{
        @Override
        public int callAddMethod(int a, int b) throws RemoteException {
            return addMethod(a, b);
        }
    }
}

Local客服端:

public class MainActivity extends Activity {
    private Button button;

    IService iService;
    private MyConn conn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        conn = new MyConn();
        Intent intent = new Intent();
        intent.setAction("com.example.lenovo.remoteservice");
        bindService(intent, conn, BIND_AUTO_CREATE);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    int res = iService.callAddMethod(3, 4); //远程服务计算3+4的运算
                    Toast.makeText(MainActivity.this, "由远程方法计算的结果为: 3+4=" + res, Toast.LENGTH_SHORT).show();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private class MyConn implements ServiceConnection{

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
              iService  =  IService.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }
    }

    @Override
    protected void onStop() {
        super.onStop();
        unbindService(conn);
    }
}

aidl的应用场景:支付宝

Messenger:

实现IPC通信,底层也是使用了AIDL方式。和AIDL方式不同的是,Messenger方式是利用Handler形式处理,因此,它是线程安全的,这也表示它不支持并发处理;而AIDL方式是非线程安全的。支持并发处理。因此,我们使用AIDL处理的时候需要注意线程安全的问题。很多情况下,我们应用中不需要并发处理。因此,我们通常只需要使用Messenger方式。

实现思想:

在进程A中创建一个Message, 将这个Message对象通过Messenger.send(message)方法传递到进程B, send(message)方法是不可以对Message对象直接传递,需要使用Parcel对象进行编集;再将Parcelable对象传到进程B中,然后解集。再把Message对象添加到消息队列中,Handler会对其进行处理。

 实现步骤:

  1. 创建一个服务类继承Service
  2. 在服务中定义一个Handler对象
  3. 再声明定义一个Messenger对象: private Messenger messenger = new Messenger(handler);
  4. 在onBind()方法中返回一个IBinder对象: return messenger.getBinder();
  5. 在本地客户端中通过绑定服务获取返回的IBinder对象,进行send(message)操作
  6. 在远程服务端对发送的消息进行相应的处理
时间: 2025-01-06 05:01:43

Android之IPC(aidl)的相关文章

Android:IPC之AIDL的学习和总结

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

Android Service IPC通信之Messenger机制

概述 之前我写过一篇博客介绍Service:Android Service全面解析,里面讲过如何实现Service的跨进程(IPC)通信,主要是通过编写AIDL接口文件来实现的.本篇我们来讲讲Service IPC通信的另外一种方式-Messenger. Messenger,也称为信使,通过它可以在不同的进程间传递message对象,在message中放入我们需要传递的数据你就可以实现跨进程通信和传递数据了.所以说Messenger机制是基于消息的跨进程通信方式. 可以看到,我们可以在客户端发送

Android 之 IPC 进程通信全解析

Android 之 IPC 进程通信全解析 本篇博客的框架 什么是IPC IPC(Inter-Process Communication) 进程间通信,是指两个不同进程之间数据交换的过程. 在明确其之前,需要先搞懂几个概念: 线程:CPU可调度的最小单位,是程序执行流的最小单元:线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源. 进程: 一个执行单元,在PC 和移动设备上一

饿了么开源项目Hermes:新颖巧妙易用的Android进程间通信IPC框架

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51464518 Android进程间通信IPC是比较高级的话题,很多Android程序员碰到IPC就觉得头疼,尤其是AIDL这类东西. 公司最近在研究DroidPlugin插件开发,DroidPlugin把每个子app都变成一个进程.这样的话子app和主app如果需要共享数据,就需要IPC.所以我开发了Hermes框架,让IPC变得非常简单优雅

Android中的AIDL Android studio中建aidl

1.aidl: android interface definition language,是一种它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口icp:interprocess communication :内部进程通信 2.既然aidl可以定义并实现进程通信,那么我们怎么使用它呢?文档/android-sdk/docs/guide/developing/tools/aidl.html中对步骤作了详细描述: --1.Create your .aidl fil

[转]Android 如何建立AIDL

建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下:       (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件.该文件的语法类似于Java代码,但会稍有不同.详细介绍见实例52的内容.       (2)如果aidl文件的内容是正确的,ADT会自动生成一个Java接口文件(*.java).       (3)建立一个服务类(Service的子类).       (4)实现由aidl文件生成的Java接口.       (5)在AndroidMa

Android service binder aidl 关系

/********************************************************************************** * Android service binder aidl 关系 * 声明: * 最近一直被Android中的service.binder.aidl这三者之间的关系给搞得有点难受, * 于是就自己花了点时间,将他们之间的关系给画出来,这样思维上就清晰多了,也方便 * 和朋友沟通,减少沟通成本. * * 2016-1-10 晴 深圳

Android进程间通信之----Aidl传递对象

转载请注明出处 CSDN废墟的树 前言 有关Android进程间通信之Aidl编程的基本使用步骤已经在上一篇博客中有讲解,Android studio 下的aidl编程实现Android的夸进程间通信.上一篇博客中只是演示了怎么利用Aidl实现跨进程间传递Java基本类型,以及Aidl传递Bitamap对象.可能在一些场景下你需要跨进程传递一个对象,那么Aidl是否能传递一个对象呢?答案是肯定的,网上也有很多相关的资料,之所以写这篇博客:一是当作自己学习笔记咯,二是把自己遇到的问题分享出来. A

android 怎样用AIDL Service 传递复杂数据

大家都知道在Android中通过AIDL可以跨进程调用Service中的数据,网上也有很多实例,但是大部分实例都是关于基本数据类型的远程调用,很少讲到复杂数据的调用,今天我用一个例子来演示一下怎样用AIDL Service 传递复杂数据. 我们分2步开始: 第一步:部署我们的服务端,也就是Service端: 1:在Service端我先自定义2个类型:Person和Pet.因为我们需要跨进程传递Person对象和Pet对象,所以Person类和Pet类都必须实现Parcelable接口,并要求在实