Android 知识点

  • 文件
  • AIDL(基于 Binder)
    • Android 接口定义语言,官方提供的进程间通信机制
    • 只有允许不同应用的客户端用 IPC 方式调用远程方法,并且想要在服务中处理多线程时,才有必要使用 AIDL
  • Binder

    • 有四个角色 Server,Client,ServerManager,Binder 驱动,前三个在用户空间,最后一个在内核空间
    • 如果需要调用远程方法,但不需要处理并发 IPC,就应该通过实现一个 Binder 创建接口
  • Messenger(基于 Binder)

    • 对 AIDL 进行封装,和使用 Handler 一样简单的来完成基于消息的跨进程通信
    • 如果您想执行 IPC,但只是传递数据,不涉及方法调用,也不需要高并发,就使用 Messenger 来实现接口
  • ContentProvider(基于 Binder)
    • 如果需要处理一对多的进程间数据共享(主要是数据的 CRUD),就使用 ContentProvider
  • Socket
    • 如果要实现一对多的并发实时通信,就使用 Socket

MVC、MVP、MVVM

MVC

Activity 一方面需要控制布局,另一方面还要写业务逻辑,逻辑比较混乱

MVP

Model 和 View 通过 Presenter 来进行交互

降低了耦合,职责划分清晰

MVVM

  • 模型层 (Model):负责从各种数据源中获取数据;
  • 视图层 (View):在 Android 中对应于 Activity 和 Fragment,用于展示给用户和处理用户交互,会驱动 ViewModel 从 Model 中获取数据;
  • ViewModel 层:用于将 Model 和 View 进行关联,我们可以在 View 中通过 ViewModel 从 Model 中获取数据;当获取到了数据之后,会通过自动绑定,比如 DataBinding,来将结果自动刷新到界面上。
    MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model),有几大优点:
  • 低耦合:视图(View)可以独立于Model变化和修改,一个 ViewModel 可以绑定到不同的 View 上,当 View 变化的时候 Model 可以不变,当 Model 变化的时候 View 也可以不变。
  • 可重用性:你可以把一些视图逻辑放在一个 ViewModel 里面,让很多 view 重用这段视图逻辑。

设计模式

单例模式

懒汉式-双重检验锁

静态内部类(加载一个类时,内部类不会被加载,仅当其某个静态成员(静态域、构造器、静态方法等)被调用时类才会被加载)

饿汉式

枚举

工厂模式

简单工厂模式(不属于23种模式之间)

定义一个工厂类,根据传入的参数不同返回不同的实例,被创建的实例具有共同的父类或接口。

工厂方法模式

定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。

简单工厂只有一个统一的工厂类,而工厂方法是针对每个要创建的对象都会提供一个工厂类,这些工厂类都实现了一个工厂基类

抽象工厂模式

工厂方法模式的一个工厂只能创建一个具体产品。而抽象工厂模式的一个工厂可以创建属于一类类型的多种具体产品。

AbstractFactory(抽象工厂):用于声明生成抽象产品的方法

ConcreteFactory(具体工厂):实现了抽象工厂声明的生成抽象产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中;

AbstractProduct(抽象产品):为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法;

Product(具体产品):定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。

抽象工厂模式与工厂方法模式最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则需要面对多个产品等级结构。

观察者模式

当一个对象被多个观察者所订阅,当这个对象发生变化时,发出通知,所有订阅的观察者就会收到通知.

  • 控件中Listener监听方式
  • Adapter的notifyDataSetChanged()方法
  • BroadcastReceiver

代理模式

通过一个代理类来访问一个真实类的功能

责任连模式

  • 事件分发
  • OkHttp 请求

模板模式

基于继承的代码复用,相同的代码放到父类中,不同的方法进行抽象让不同的子类实现.

  • View 中 draw 方法

并发编程

volatile

  • 可见性:当一个变量被volatile修饰之后,其就具备可见性,线程修改了变量的值时, 变量的新值对其他线程是立即可见的。 换句话说, 就是不同线程对这个变量进行操作时具有可见性。
  • 禁止指令重排序:一个是当程序执行到volatile变量的操作时, 在其前面的操作已经全部执行完毕, 并且结果会对后面的
    操作可见, 在其后面的操作还没有进行; 在进行指令优化时, 在volatile变量之前的语句不能在volatile变量后面执行; 同样, 在volatile变量之后的语句也不能在volatile变量前面执行。

####synchronized

Synchronized的作用主要有三个:

(1)确保线程互斥的访问同步代码

(2)保证共享变量的修改能够及时可见(这个可能会被许多人忽略了)

(3)有效解决重排序问题。

同步方法:

private synchronized void test() {

}

同步代码块:

synchronized(obj){
}

静态方法加锁:

static synchronized void test();

源码原理

Retrofit 原理

Retrofit主要是在create方法中采用动态代理模式实现接口方法,这个过程构建了一个ServiceMethod对象,根据方法注解获取请求方式,参数类型和参数注解拼接请求的链接,当一切都准备好之后会把数据添加到Retrofit的RequestBuilder中。然后当我们主动发起网络请求的时候会调用okhttp发起网络请求,okhttp的配置包括请求方式,URL等在Retrofit的RequestBuilder的build()方法中实现,并发起真正的网络请求。

EventBus 原理

EventBus 采用事件驱动,一个事件是由于另一个事件的出发而被调用.

EventBus 中最重要的变量为 Map<Class<?>, CopyOnWriteArrayList<Subscription>> subscriptionsByEventTy ,key 为事件类型,value 为对该事件类型的所有订阅方法.

OkHttp 原理

ARouter 原理

注解处理器

在程序编译期间,根据注解生成 Java 代码.

HashMap原理

Android Studio 编译过程

RecycleView 优化

  • 使用 DiffUtil 局部刷新
  • recyclerView.setHasFixedSize(true)item 高度固定,设置这个选项可以提高性能.
  • 复用 RecycledViewPool ,为多个 RecyclerView 间公用一个 对象池
  • getExtraLayoutSpace ,改变滑动时预判的范围,达到预加载数据
  • 不要将 RecyclerView 添加到 ScrollView 中,尽量给 RecyclerView 不同 ItemType 实现
  • addOnScrollListener 滑动时停止加载

Android 各版本区别

Android 5.0

  • Material design
  • 系统由以往的Dalvik模式改为采用ART

Android 6.0

HTTP client

Android 7.0

  • 通知栏快捷回复
  • 加入原生分屏多任务功能
  • 引入全新的JIT编译器,使得App安装速度快了75%,编译代码的规模减少了50%

Android 8.0

  • 画中画
  • Notification Dots :程序图片小红点,长按查看预览
  • 后台进程限制
  • 运行时权限策略变化:API 24之前申请一个权限,会将权限组的权限同时授予.24之后只会授予申请的权限,之后申请权限组时,会自动授予不会提示.

Android 9.0

  • 全面屏支持
  • 前台服务需要添加权限

Dalvik,ART

Dalvik每次运行要通过即时编译器(JIT)将字节码转变为机器码,安装快,运行慢.

ART 在第一次安装时将字节码预编译(AOT)成机器码,安装慢,以后启动直接执行,运行效率高.占用空间比 Dalvik 大,以空间换时间

预编译可以解决运行时不用重复编译,减少 CPU 使用频率,改善电池续航

Android 7.0混编模式(JIT+AOT),App 安装时不编译,运行时先走解析器,将热点函数识别用 JIT 进行编译并缓存,当手机充电 or 待机时对代码进行 AOT编译,运行几次之后速度会变好.

Android 优化

启动优化

分为 冷启动和 热启动

不可控阶段:点击 app 到初始化 Application 之间,系统托管,从 Zygote fork 创建新进程, GC 回收等都不可控

  • 样式改为图片,避免白屏
  • Application 的 onCreate 中避免做过多处理,如果有必要用IntentService处理(推送)
  • 首页对 Back键做处理 返回首页而不是退出 App

内存优化

减少内存溢出

UI 优化

  • 打开 GPU 绘制选项,查看界面重叠绘制情况,尽可能减少红色区域
  • 自定义 View 的 onDraw 方法尽量避免新的局部变量
  • 减少布局层次,使用 marge 和 include 对布局进行复用

APK 安装包优化

一个安装包主要有 classes.dex resources.arsc assets lib res 目录

首先要解决 classes.dex 的大小是开启混淆,评估引用 libary 的大小

assets 主要是存放的数据库文件,网页一些,将不用的进行删除

lib 上线时将 x86架构的进行排除在外

res 对图片进行压缩,使用 xml 复用一些图片

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章