指点成金-最美分享吧

登录

最新Android高级面试知识点--事件分发Binder机制

佚名 举报

篇首语:本文由小编为大家整理,主要介绍了最新Android高级面试知识点--事件分发Binder机制相关的知识,希望对你有一定的参考价值。

【最新Android高级面试知识点干货分享(六)】
转载请注明出处!

九、android事件分发机制

事件分发机制是个必考点,网上也有很多很好的文章,在复习的过程中,建议按照源码自己动手动画画,下图就是我自己整理的,有不对或不完整的地方,欢迎留言,我将确认后更改更新。

注意:Android事件从ACTION_DOWN开始往下传,依次ACTION_MOVE---->ACTION_UP,如果某一个事件被截断,不再往下传,则会生成一个ACTION_CANCEL事件传下去。

十、 Handler消息处理机制

下图是我根据源码整理的笔记图。
公供参考,希望读者也自己整理一遍,加深理解记忆。

$10.1、 Looper循环实现原理
  • 在Looper.prepare()里面创建了MessageQueue、Thread对象;
  • 在Looper.loop()方法里面用while无限循环从MessageQueue中取出。

十一、Android Binder机制

进程间通信
基于传输性能与安全的考虑,安卓建立了一套有别于传统IPC的进程间通信。
它是一套通信机制,下面是基于此整理的几个分开的知识点。

$11.1、 Linux 中mmap内存映射
  • Linux中Page Cache页缓存概念

      指将磁盘数据读取到内核空间的一块缓存空间
  • 标准IO、直接IO与mmap区别

    • 标准IO(又称缓存IO):2次CPU拷贝,

    • 直接IO:1次CPU拷贝,但没有缓存,适用于数据库系统

    • mmap:1次CPU拷贝,有内核缓存(内部采用延迟机制,会将数据回写进磁盘)

    • page:计算机虚拟内存分页机制

      (图片来源于网络)

关于【内存映射】:

计算机上有个页表,将虚拟内存上的页号与物理内存上的页帧号对应起来的过程就是内存映射。
$11.2、 Parcelable与Serializable

二者都是序列化与反序列化类,区别如下:

序列化方式开发者原理性能实现方式
SerializableJava通过标准IO流进行数据读写实现 Serializable接口
ParcelableAndroid底层采用Binder通信机制,利用mmap内存映射实现数据读写实现Parcelable接口,并实现writeToParcel、describeContents函数以及静态的CREATOR变量
$11.3、 AIDL

接口编程语言
可牵涉的知识面或者知识点:JVM编译或者apk打包流程、动态代理等

原理:编写interface,利用JVM在编译时,将xx.aidl文件(以IPerson.aidl为例)自动生成为java文件,且继承自android.os.Interface。

自动生成的IPerson.java接口文件里面,自动生成了2个静态内部类:Stub、Proxy
Stub:是抽像类,继承自android.os.Binder,同时实现IPerson:

/****        **自动生成的interface接口类        **        */        public interface IPerson extends android.os.IInterface        /** Local-side IPC implementation stub class. */    public static abstract class Stub extends android.os.Binder implements ext.sunny.com.activitylifedemo.IPerson        private static final java.lang.String DESCRIPTOR = "ext.sunny.com.activitylifedemo.IPerson";    /** Construct the stub at attach it to the interface. */    public Stub()        this.attachInterface(this, DESCRIPTOR);       

因此,应用层(服务端,比如Service)只需实例化Stub对像,就可以实现aidl接口的方法

 val mBinder: Stub = object : Stub()         override fun getName(): String             return "SunnyAIDL:$userName"                override fun setName(name: String?)             userName = name                

同时自动生成的这个类,还提供了asInterface(object:IBinder?)方法,以便获取接口对像,内部采用Proxy代理模式实现,主要是方便客户端调用接口方法:
(在Android中,主要是ServiceConnection中实现)

 /***     * 开始绑定Service     */    fun startAIDL(view: View)         var aidlIntent = Intent(this,personService!!::class.java)        this.bindService(aidlIntent,object :ServiceConnection            override fun onServiceDisconnected(name: ComponentName?)                 iPerson=null                        override fun onServiceConnected(name: ComponentName?, service: IBinder?)                 iPerson = IPerson.Stub.asInterface(service)                    , Context.BIND_AUTO_CREATE)    

十二、Apk打包流程

整体流程图如下(图片来源于Android开发者文档):

$12.1、 AAPT

Android资源打包工具。

工具路径:

D:\developer\Android\sdk\build-tools\28.0.3\aapt2.exe

可以通过aapt package 命令来对项目中的资源文件进行打包,会生成R.java文件。

同时也可以用aapt l等命令对apk中的信息【如:资源信息、应用版本信息,包名。。。】进行查询。

】:从AndroidStudio3.0开始,默认启用AAPT2,而AAPT已被弃用。AAPT2对比AAPT,前者在资源格式规则校验上更加严格,不再以忽略或警告来提示,而是直接以Error的形式出现。详情可见:https://developer.android.google.cn/studio/command-line/aapt2

$12.2、 AIDL工具

工具路径:

    D:\developer\Android\sdk\build-tools\28.0.3\aidl.exe

作用:

    编译aidl文件成为 Java接口。具体可见上面。

(下一篇将整理分享关于Android第三方开源库的复习笔记)

以上是关于最新Android高级面试知识点--事件分发Binder机制的主要内容,如果未能解决你的问题,请参考以下文章