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

相关推荐
非凡ghost32 分钟前
LSPatch官方版:无Root Xposed框架,自由定制手机体验
android·智能手机·软件需求
_extraordinary_33 分钟前
MySQL 库的操作 -- 增删改查,备份和恢复,系统编码
android·mysql·oracle
西瓜本瓜@3 小时前
在Android中如何使用Protobuf上传协议
android·java·开发语言·git·学习·android-studio
似霰6 小时前
安卓adb shell串口基础指令
android·adb
fatiaozhang95279 小时前
中兴云电脑W102D_晶晨S905X2_2+16G_mt7661无线_安卓9.0_线刷固件包
android·adb·电视盒子·魔百盒刷机·魔百盒固件
CYRUS_STUDIO10 小时前
Android APP 热修复原理
android·app·hotfix
鸿蒙布道师10 小时前
鸿蒙NEXT开发通知工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
鸿蒙布道师10 小时前
鸿蒙NEXT开发网络相关工具类(ArkTs)
android·ios·华为·harmonyos·arkts·鸿蒙系统·huawei
大耳猫10 小时前
【解决】Android Gradle Sync 报错 Could not read workspace metadata
android·gradle·android studio
ta叫我小白10 小时前
实现 Android 图片信息获取和 EXIF 坐标解析
android·exif·经纬度