《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定位原因

相关推荐
顾北川_野11 分钟前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
&岁月不待人&22 分钟前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
Winston Wood2 小时前
Android Parcelable和Serializable的区别与联系
android·序列化
清风徐来辽2 小时前
Android 项目模型配置管理
android
帅得不敢出门3 小时前
Gradle命令编译Android Studio工程项目并签名
android·ide·android studio·gradlew
problc3 小时前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
帅得不敢出门14 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡
我又来搬代码了15 小时前
【Android】使用productFlavors构建多个变体
android
德育处主任17 小时前
Mac和安卓手机互传文件(ADB)
android·macos
芦半山17 小时前
Android“引用们”的底层原理
android·java