您现在的位置是:首页 > 正文

Android ADIL和BInder

2024-01-30 21:28:16阅读 0

目录

1.Binder

        1.1BInder是什么

        1.2为什么要用多进程

        1.3 Android系统中,涉及到多进程间的通信底层都是依赖于Binder IPC机制。

2.AIDL

        2.1AIDL简介

        2.2AIDL的使用流程

                2.2.1AIDL支持的数据类型,以及注意事件

                2.2.2创建.aildi文件 

                2.2.3编辑PayAidlInterface.aidl       

                2.2.4生成与PayAidlInterfece.aidl一样的接口文件

                2.2.5创建一个实体类Pay

                2.2.6 向客户端公开接口      

                2.2.7 创建一个客户端     

                2.2.8在AndroidManifest.xml中写上服务器的报名

                2.2.9之后再Activity里进行操作


1.Binder

        1.1BInder是什么

1.机制: Binder 是一种进程间通信的机制
2.驱动: Binder 是一个虚拟物理设备驱动
3.应用层: Binder 是一个能发起进程间通信的 JAVA
4.Binder 就是 Android 中的血管,在 Android 中我们使用 Activity,Service 等组件都需要和 AMS
system_server )进行通信,这种跨进程的通信都是通过 Binder 完成。
5.Activity,Service 等组件和 AMS 不是同一个进程,其实也是多进程通信。

        

        1.2为什么要用多进程

1.虚拟机给每一个进程分配的内存是有限制的 ,LMK 会优先回收对系统资源占用多的进程
2.为了突破内存限制,防止占用内存过多被杀
3.功能稳定性,一个进程崩溃对另外进程不造成影响:将不稳定功能放入独立进程
4.规避内存泄漏,独立的 WebView 进程阻隔内存泄漏导致问题

        1.3 Android系统中,涉及到多进程间的通信底层都是依赖于Binder IPC机制。

1.例如当进程 A 中的 Activity 要向进程 B 中的 Service 通信,这便需要依赖于 Binder IPC 。不仅于此,整 个Android 系统架构中,大量采用了 Binder 机制作为 IPC (进程间通信, Interprocess
Communication )方案。
2.也存在部分其他的 IPC 方式,如管道、 SystemV Socket
        

2.AIDL

        2.1AIDL简介

                2.1.1AIDL是什么?

                        Adroid通信接口定义语言

                2.1.2AIDL用在哪?

                        进程间通信

AIDL Android 接口定义语言),可以使用它定义客户端与服务端进程间通信( IPC )的编程接口。在 Android系统中,每个进程都运行在一块独立的内存中,在其中完成自己的各项活动,与其他进都分 隔开来。可是有时候我们又有应用间进行互动的需求,比较传递数据或者任务委托等,AIDL 就是为了满 足这种需求而诞生的。通过AIDL ,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法, 从而满足进程间通信的需求。

        2.2AIDL的使用流程

                2.2.1AIDL支持的数据类型,以及注意事件

AIDL 中可以通过可带参数以及返回值的一个或多个方法来声明接口,参数和返回值可以是任意类 型,AIDL 中支持的数据类型如下:
1.java 8 种数据类型: byte short int long float double boolean char
2.除此之外支持 String charSequence List Map
3.自定义数据类型
如果参数或返回值类型为 List Map 时:
List 中的所有元素都必须是 AIDL 支持的数据类型、其他 AIDL 生成的接口或自己声明的可打包类
型。可选择将 List 用作 通用 类(例如, List )。另一端实际接收的具体类始终是 ArrayList ,但生
成的方法使用的是 List 接口。
Map 中的所有元素都必须是 AIDL 支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类
型。 不支持通用 Map (如 Map<String,Integer> 形式的 Map )。 另一端实际接收的具体类始终
HashMap ,但生成的方法使用的是 Map 接口。
        

                2.2.2创建.aildi文件 

                

 

                2.2.3编辑PayAidlInterface.aidl       

// PayAidlInterface.aidl
package com.hopu.day14_server;

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

interface PayAidlInterface {
    //这里是具体的业务
    void setMoney(int money);
    void setUser(String user);
    
    String getInfo();
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat,
            double aDouble, String aString);
}

                2.2.4生成与PayAidlInterfece.aidl一样的接口文件

                只需要Build一下就行

                 2.2.5创建一个实体类Pay

                        1.继承PayAidlInterface.Stub

                        2.实现他的三个构造方法

public class Pay extends PayAidlInterface.Stub{
        private String user;
        private int money;

        @Override
        public void setMoney(int money) throws RemoteException {
            this.money=money;
        }

        @Override
        public void setUser(String user) throws RemoteException {
            this.user=user;
        }

        @Override
        public String getInfo() throws RemoteException {
            return "账号是:"+user+",钱是:"+money;
        }

        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {

        }
    }
}

                2.2.6 向客户端公开接口      

                          创建一个 Service 以便对外提供具体的业务 

public class PayService extends Service {
    public PayService() {
    }

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

                 2.2.7 创建一个客户端 

                        把服务端的.aidl的包复制过来,之后Build一下生成接口 

                                             

                 2.2.8在AndroidManifest.xml中写上服务器的包名

<queries>
        <package android:name="com.hopu.day14_server"/>
    </queries>

                 2.2.9之后再Activity里进行操作

                        我这里创建了三个按钮,对应的是绑定,解绑(这个没有写),和对话

public class MainActivity extends AppCompatActivity {
    private Button but_bind;
    private Button but_unbind;
    private Button but_cull;
    private PayAidlInterface payAidlInterface;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        but_bind=findViewById(R.id.but_bing);
        but_cull=findViewById(R.id.but_cull);
        but_unbind=findViewById(R.id.but_unbing);
        but_bind.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent();
                intent.setComponent(new ComponentName("com.hopu.day14_server","com.hopu.day14_server.PayService"));
                bindService(intent,conn,BIND_AUTO_CREATE);
                Log.i("Activity","绑定成功");
            }
        });
        but_unbind.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

            }
        });
        but_cull.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    payAidlInterface.setUser("123");
                    payAidlInterface.setMoney(10);
                    String info=payAidlInterface.getInfo();
                    Log.i("Activity",info);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    public ServiceConnection conn=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            payAidlInterface=PayAidlInterface.Stub.asInterface(iBinder);
            Log.i("Activity",payAidlInterface+"");
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
    };
}

网站文章

  • 版本管理-SVN冲突爆红后如何通过颜色和快捷键准确无误地合并代码(一)

    版本管理-SVN冲突爆红后如何通过颜色和快捷键准确无误地合并代码(一)

    SVN冲突出现场景如今是一个团结协作的时代,开发一个系统,往往会多人协作共同完成。版本管理是必不可少的,常用的软件有Git,SVN等。今天说一下,SVN管理版本时,如果出现冲突后,如何快速解决冲突。首...

    2024-01-30 21:27:47
  • pom.xml配置文件讲解

    Maven 构件工程的属性文件 pom.xml文件(实践用):    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    2024-01-30 21:27:39
  • 分享112个PHP源码,总有一款适合您

    分享112个PHP源码,总有一款适合您

    php

    2024-01-30 21:27:33
  • vue watch监听对象及对应值的变化

    vue watch监听对象及对应值的变化

    var vm=new Vue({ data:{ a:1, b:{ c:1 } }, watch:{ a(val, oldVal){//普通的watch监听 console.log(&quot;a: &quot;+val, oldVal); }, b:{

    2024-01-30 21:27:26
  • 各位大侠门,遇到这种抉择,你会怎么选择!

    如果有一个公司给你2w一个月,但是去维护一个用webform做的项目,并且就只有你一个人维护,项目规模比较大,项目是针对中国和国外市场交易的平台,但是旧项目大概一年以后不会再使用,会换成java版本,...

    2024-01-30 21:26:47
  • 免费分享嵌入式stm32基础项目开发:心率检测仪的设计与实现

    本教程主要给大家谅解了嵌入式stm32开发 心率检测仪的设计与实现,需要的朋友们可以下载来看看,作为参考!项目描述:通过心律传感器采集我们的心律数据,然后通过串口传送到上位机中,上位机用Qt实现,当Qt接收数据之后,把数据绘制曲线,并计算显示心率心律波形。适合人群:零基础学员;在校大学生、应届毕业生、IT爱好者、跳槽换工作者、其他行业人员。课程内容:1:心律传感器简介及adc的原理

    2024-01-30 21:26:40
  • CentOS7安装docker

    1、yum更新sudo yum update2、安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的sudo yum install -y yum-utils device-mapper-persistent-data lvm23、设置yum源为阿里云sudo yum-config-manager --add-r...

    2024-01-30 21:26:33
  • 总结每天10问之Java基础1

    Java 基础OOP相关1、什么是B/S架构?什么是C/S架构答:B/S中B是Brower,浏览器的意思;S是Server,即Brower/Server,用户通过浏览器访问服务。C/S中C是Clien...

    2024-01-30 21:26:06
  • C#将word文档转为PDF

    C#将word文档转为PDF

    C#将word文档转为PDF

    2024-01-30 21:26:00
  • 2021-09-29

    2021-09-29

    小程序时间刻度尺组件库(vue通用) 实现效果:页面进来的时间 刻度尺当前时间点 以前表示不可预约 样式为红色 时间点之后的样式为蓝色 Demo效果: 实现思路:刻度尺上面的小刻度数用循环遍历出来的 ...

    2024-01-30 21:25:54