【最新Android高级面试知识点干货分享(七)】

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

九、Android事件分发机制

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

Android触摸事件

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

十、 Handler消息处理机制

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

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:计算机虚拟内存分页机制
      image
      (图片来源于网络)

关于【内存映射】:

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

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

序列化方式 开发者 原理 性能 实现方式
Serializable Java 通过标准IO流进行数据读写 实现 Serializable接口
Parcelable Android 底层采用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开发者文档):

image

$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第三方开源库的复习笔记)

原创文章 80 获赞 34 访问量 17万+

猜你喜欢

转载自blog.csdn.net/u011153817/article/details/105862600