关于android:纯干货Android知识点整理一

6次阅读

共计 3368 个字符,预计需要花费 9 分钟才能阅读完成。

最近整顿了一些 Android 中的知识点,纯干货,偷偷通知你,这也是面试的高频面试题哦。

1. 解决 Android 多过程导致 Application 反复创立问题(process 造成多个 Application)

http://conorlee.top/2017/02/2…
onCreate 办法中判断过程的名称,只有在符合要求的过程里,才执行初始化操作;
形象出一个与 Application 生命周期同步的类,并依据不同的过程创立相应的 Application 实例。

2. 通过 Binder 传递数据的限度

缩小通过 intent 传递的数据,将非必须字段应用 transient 关键字润饰
将对象转化为 JSON 字符串,缩小数据体积

3. 后盾启动 Activity 生效

场景:如果咱们正在玩着游戏,此时手机后盾可能有个下载某 App 的工作在执行。当 App 下载完之后忽然弹出装置界面,中断了游戏界面的交互,这种状况会造成用户体验极差,而最终用户的吐槽对象都会转移到 Android 手机或者 Android 零碎自身。
Android10(API29)开始,对后盾过程启动 Activity 做了肯定限度,目标就是尽可能的防止以后前台用户的交互被打断,保障以后屏幕上涨势的内容不受影响。
解决办法:
Android 官网倡议咱们应用告诉来代替间接启动 Activity 操作。

4.Android 启动 activity 之 taskAffinity

单纯应用 taskAffinity 不能导致 Activity 被创立在新的工作栈中,须要配合 singleTask 或者 singleInstance!

taskAffinity + allowTaskReparenting
allowTaskReparenting 赋予 Activity 在各个 Task 两头转移的个性。一个在后台任务栈中的 Activity A,当有其余工作进入前台,并且 taskAffinity 与 A 雷同,则会主动将 A 增加到以后启动的工作栈中

5. 事件散发

dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent

步骤 1:判断以后 ViewGroup 是否须要拦挡此 touch 事件,如果拦挡则此次 touch 事件不再会传递给子 View

(或者以 CANCEL 的形式告诉子 View)。

步骤 2:如果没有拦挡,则将事件分发给子 View 持续解决,如果子 View 将此次事件捕捉,
则将 mFirstTouchTarget 赋值给捕捉 touch 事件的 View。
如果没有子 View 捕捉解决 touch 事件,ViewGroup 会通过本身的 onTouchEvent 办法进行解决。
后续的 MOVE、UP 等事件的散发交给谁,取决于它们的起始事件 Down 是由谁捕捉的。
步骤 3:依据 mFirstTouchTarget 从新散发事件。

判断是否须要拦挡:次要是依据 onInterceptTouchEvent 办法的返回值决定是否拦挡
在 Down 事件中将 touch 事件分发给子 View: 如果子 view 捕捉生产了 touch 事件,会对 mFirstTouchTarget 进行赋值
最初,Down, Move,Up 事件会依据 mFirstTouchTarget 是否为 null,决定本人解决 touch 事件,还是再次分发给子 View

非凡点:
Down 事件非凡之处:事件的终点;决定后续事件由谁来生产解决
mFirstTouchTarget 作用:记录捕捉生产 touch 事件的 view, 是一个链表构造
CANCEL 事件的触发场景:当父视图先不拦挡,而后在 MOVE 事件中从新拦挡,此时子 View 会承受到一个 CANCEL 事件

6. 自定义 View

自定义 UI 控件有 2 种形式:
继承零碎提供的成熟控件(比方 LinearLayout、RelativeLayout、ImageView 等);
间接继承自零碎 View 或者 ViewGroup,并自绘显示内容。

一共有 3 种测量模式。
EXACTLY:示意在 XML 布局文件中宽高应用 match_parent 或者固定大小的宽高;
AT_MOST:示意在 XML 布局文件中宽高应用 wrap_content;
UNSPECIFIED:父容器没有对以后 View 有任何限度,以后 View 能够取任意尺寸,比方 ListView 中的 item。

onDraw:次要负责绘制 UI 元素;
onMeasure:次要负责测量自定义控件具体显示的宽高;
onLayout:次要是在自定义 ViewGroup 中复写,并实现子 View 的显示地位,并在其中介绍了自定义属性的应用办法。

7.RecyclerView 缓存

setLayoutManager:必选项,设置 RV 的布局管理器,决定 RV 的显示格调。罕用的有线性布局管理器(LinearLayoutManager)、网格布局管理器(GridLayoutManager)、瀑布流布局管理器(StaggeredGridLayoutManager)。
setAdapter:必选项,设置 RV 的数据适配器。当数据产生扭转时,以告诉者的身份,告诉 RV 数据扭转进行列表刷新操作。
addItemDecoration:非必选项,设置 RV 中 Item 的装璜器,常常用来设置 Item 的分割线。
setItemAnimator:非必选项,设置 RV 中 Item 的动画。

RecyclerView 是如何通过测量、布局,最终绘制到屏幕上,其中大部分工作是通过委托给 LayoutManager 来实现的。
RecyclerView 的缓存复用机制,次要是通过外部类 Recycler 来实现。

RV 会将测量 onMeasure 和布局 onLayout 的工作委托给 LayoutManager 来执行,不同的 LayoutManager 会有不同格调的布局显示,这是一种策略模式

四级缓存:
(1)第一级缓存 mAttachedScrap&mChangedScrap
这两者次要用来缓存屏幕内的 ViewHolder
(2)第二级缓存 mCachedViews
它用来缓存移除屏幕之外的 ViewHolder,默认状况下缓存个数是 2,不过能够通过 setViewCacheSize 办法来扭转缓存的容量大小。如果 mCachedViews 的容量已满,则会依据 FIFO 的规定将旧 ViewHolder 摈弃,而后增加新的 ViewHolder
(3)第三级缓存 ViewCacheExtension
开发人员能够通过继承 ViewCacheExtension,并复写形象办法 getViewForPositionAndType 来实现本人的缓存机制。
(4)第四级缓存 RecycledViewPool
RecycledViewPool 同样是用来缓存屏幕外的 ViewHolder,当 mCachedViews 中的个数已满(默认为 2),则从 mCachedViews 中淘汰进去的 ViewHolder 会先缓存到 RecycledViewPool 中。ViewHolder 在被缓存到 RecycledViewPool 时,会将外部的数据清理,因而从 RecycledViewPool 中取出来的 ViewHolder 须要从新调用 onBindViewHolder 绑定数据。这就同最早的 ListView 中的应用 ViewHolder 复用 convertView 的情理是统一的,因而 RV 也算是将 ListView 的长处完满的继承过去。

RecycledViewPool 还有一个重要性能,官网对其有如下解释:

RecycledViewPool lets you share Views between multiple RecyclerViews.

能够看出,多个 RV 之间能够共享一个 RecycledViewPool,这对于多 tab 界面的优化成果会很显著。须要留神的是,RecycledViewPool 是依据 type 来获取 ViewHolder,每个 type 默认最大缓存 5 个。因而多个 RecyclerView 共享 RecycledViewPool 时,必须确保共享的 RecyclerView 应用的 Adapter 是同一个,或 view type 是不会抵触的。

好了,明天和大家分享这些,后续会继续更新,欢送关注。

感觉文章不错的,给我点个赞哇,关注一下呗!
技术交换可关注微信公众号【君伟说】,加我好友一起探讨
微信交换群:加好友 wayne214(备注技术交换)邀你入群,抱团学习共提高

正文完
 0