《Android开发艺术探索》初步记录

目录

    • [0 前言](#0 前言)
    • [1 Activity的生命周期和启动模式](#1 Activity的生命周期和启动模式)
    • [2 IPC](#2 IPC)
      • [2.1 多进程带来的问题](#2.1 多进程带来的问题)
      • [2.2 多进程方式](#2.2 多进程方式)
      • [2.3 序列化](#2.3 序列化)
      • [2.4 其他](#2.4 其他)
    • [3 View的事件体系](#3 View的事件体系)
      • [3.1 基础知识](#3.1 基础知识)
      • [3.2 View的滑动](#3.2 View的滑动)
      • [3.3 事件分发](#3.3 事件分发)
      • [3.4 滑动冲突](#3.4 滑动冲突)
    • [4 View的工作原理](#4 View的工作原理)
    • [5 理解RemoteViews](#5 理解RemoteViews)
      • [5.1 PendingIntent](#5.1 PendingIntent)
    • [6 Android的Drawable](#6 Android的Drawable)
    • [7 Android动画](#7 Android动画)
    • [8 理解Windows和WindowManager](#8 理解Windows和WindowManager)
    • [9 四大组件的工作过程](#9 四大组件的工作过程)
    • [10 Android消息机制](#10 Android消息机制)
    • [11 Android中线程和线程池](#11 Android中线程和线程池)
    • [12 Bitmap的加载和缓存](#12 Bitmap的加载和缓存)
    • [13 综合技术](#13 综合技术)
    • [14 JNI和NDK编程](#14 JNI和NDK编程)
    • [15 性能优化](#15 性能优化)

0 前言

简单的记录。

1 Activity的生命周期和启动模式

2 IPC

  • binder
    内存映射、1MB
  • socket
    更倾向于不同设备、跨网络进程之间通信
    Android每个应用会分配一个uid

2.1 多进程带来的问题

1)静态成员和单例模式失效

2)线程同步机制失效

3)sp不安全

4)application多次创建

2.2 多进程方式

intent、共享文件、持久化存储

binder相关AIDL、Messenger、ContentProvider

socket

2.3 序列化

使用intent、binder、网络请求、磁盘等需要让对象序列化

Parcelable

Serializable

2.4 其他

intent 支持传递bundle数据

bundle实现了Parcelable ( ArrayMap)

3 View的事件体系

3.1 基础知识

  • 四个顶点 相对父容器 top bottom left right 左上角 右下角顶点
  • translationX translationY View左上角相对于父容器偏移量
  • MotionEvent:move down up cancel等
    事件中获取触碰的坐标
    getX/getY :相对于当前View
    getRawX/getRawY: 相对于屏幕

TouchSlop:系统认为滑动的最小距离

VelocityTracker:手指滑动中的速度,滑动像素/时间

GestureDector:手势检测,单击、滑动、长按、双击等

Scroller:弹性滑动

3.2 View的滑动

1.scrollTo/scrollBy

滑动内容不能滑动View本身

2.动画

操作translationX translationY

View动画一样不能滑动View本身

属性动画Android3.0以上可以

3.改变布局参数LayoutParams

弹性滑动,渐进式滑动

把一次滑动分为若干小滑动,并在一个时间段完成

handler延时、sleep、scroller等等

3.3 事件分发

系统需要把一个MotionEvent传给一个具体的View

dispatchTouchEvent:用于分发事件,受当前View的onTouchEvent和子元素View的dispatchTouchEvent影响

onInterceptTouchEvent:在分发事件的内部,表示是否拦截

onTouchEvent:是否消耗事件

对一个根ViewGroup:

1.点击事件发生后,会传递给它,然后调用分发方法,如果拦截方法返回true,事件会给这个ViewGroup处理,接着调用它的处理方法

2.如果拦截返回false,就给它的子元素,然后子元素的分发方法会调用,直到被处理

传递优先级

onTouchListener > onTouchEvent > onClickListener

viewGroup默认不拦截

view默认处理返回true

view一旦拦截一个事件序列,所有事件都由他处理

Activity -> PhoneWindow -> DecorView(setContentView设置的View的父容器)

setContentView设置的View可以称为顶级View(根View)

3.4 滑动冲突

类型:

滑动方向不一致、一致、两者的嵌套

1的基本思路是根据滑动方向来选择事件给谁

滑动方向的判断有多种,可以用与水平方向夹角,获取水平高度、垂直高度的距离差等

一致的话需要根据具体的需求来看

嵌套同上

外部拦截法:

点击事件先经过父容器拦截,需要就拦截,反之不拦截

(主要是move事件),down不能拦截,拦截的话move、up不能传给子元素

内部拦截法:

让子元素判断

优先外部拦截法,好理解

4 View的工作原理

ViewRoot,View绘制三大流程都是由它完成

Activity被创建完,会将DecorView加到Window中;同时创建ViewRootImpl对象,和DecorView进行关联

MeasureSpec 测量规格

32位,前2位测量模式,后30位测量大小

测量模式:

三种

EXACTLY:父容器已经检测出View需要的精确大小,对应match_partent

AT_MOST:父容器指定了一个大小,不能大于这个值,对应wrap_parent

另一个父容器不对View进行限制

LayoutParams需要和父容器一起决定View的MeasureSpec

普通的View,MeasureSpec由父容器的MeasureSpec和自身的LayoutParams决定

自定义View

1.继承View实现onDraw方法

2.继承系统的View,如TextView

3.继承系统的ViewGroup,如LinearLayout

4.继承自定义的ViewGroup,看起来就像几个View组合在一起

注意:

1.直接继承View或ViewGruop,如上面的1,需要自己支持wrap_parent、padding

2.View内部由View.post,尽量不要用handler

3.View中如果有线程或动画,需要及时停止

4.如果有滑动冲突,处理好

5 理解RemoteViews

可以在其他进程显示,用于通知栏和桌面小部件,通过binder传到SystemServer进程;不支持自定义View

5.1 PendingIntent

它是一种挂起的intent,操作不是当前执行,通过用于间接的 Intent 跳转需求

常见的应用是广播通知后的点击事件,系统显示通知时,并没有执行,而是点击后,系统通知这个应用间接执行 PendingIntent#send() ,而不是通过当前应用执行。

给Remote设置单击事件

支持启动Activity、Service、发送广播

相同匹配规则:

两个PendingIntent内部intent相同和requestCode相同

intent的话,ComponentName和intent-filter匹配

6 Android的Drawable

表示图像,BitMapDrawable、ShapeDrawable、LayerDrawable等

7 Android动画

View动画、帧动画、属性动画

8 理解Windows和WindowManager

Window的具体实现在WMS中

WindowManager常用功能,添加View、更新View、删除View

Window和View通过View RootImpl建立联系

9 四大组件的工作过程

Android中Service学习记录
Android中广播接收器BroadcastReceiver学习
Android中ContentProvider学习记录

10 Android消息机制

Looper无限循环查找消息队列是否有消息,有则处理;没有则等待,不占用cpu

MessageQueue的next返回null的时候loop方法退出死循环,loop阻塞

不允许子线程更新ui,若加锁会过度复杂

ThreadLocal

11 Android中线程和线程池

Android中几种线程交互方式

HandlerThread

一个带有handler的线程,有消息队列,具体例子IntentService

IntentService

优先级高、执行完任务自动停止

线程池:

1.避免频繁创建、销毁的开销

2.控制最大并发数,

工作流程:

1)任务进来,先判断当前线程是否大于核心线程数,没有的话启动一个核心线程来执行任务;

2)已经超过,加入任务队列排队;

3)任务队列满了,变为最大线程数

4)线程数到了最大线程数,执行拒绝策略

12 Bitmap的加载和缓存

常用BitMap缓存LRU、DiskLruCache

缓存的增加、获取、删除

一个图片加载器需要

图片同步加载、异步加载、缓存、压缩、网络拉取,防止OOM

13 综合技术

crash

给程序设置CrashHandler,crash信息上传到服务器

动态加载-插件化

热插拔-不发新版更新某些模块

打包

14 JNI和NDK编程

NDK:让Android更方便地通过JNI来访问本地代码

15 性能优化

布局优化,include标签

绘制优化,onDraw不要做耗时任务,以及新建局部对象

内存泄漏,静态变量、单例、hanlder、资源没有及时销毁

ANR,一个进程发生了ANR,通过data/anr/trace.txt定位原因

相关推荐
还鮟3 小时前
CTF Web的数组巧用
android
小蜜蜂嗡嗡4 小时前
Android Studio flutter项目运行、打包时间太长
android·flutter·android studio
aqi004 小时前
FFmpeg开发笔记(七十一)使用国产的QPlayer2实现双播放器观看视频
android·ffmpeg·音视频·流媒体
zhangphil6 小时前
Android理解onTrimMemory中ComponentCallbacks2的内存警戒水位线值
android
你过来啊你6 小时前
Android View的绘制原理详解
android
移动开发者1号9 小时前
使用 Android App Bundle 极致压缩应用体积
android·kotlin
移动开发者1号9 小时前
构建高可用线上性能监控体系:从原理到实战
android·kotlin
ii_best14 小时前
按键精灵支持安卓14、15系统,兼容64位环境开发辅助工具
android
美狐美颜sdk14 小时前
跨平台直播美颜SDK集成实录:Android/iOS如何适配贴纸功能
android·人工智能·ios·架构·音视频·美颜sdk·第三方美颜sdk
恋猫de小郭18 小时前
Meta 宣布加入 Kotlin 基金会,将为 Kotlin 和 Android 生态提供全新支持
android·开发语言·ios·kotlin