我发现面试官对 Android 这些知识点百问不厌!(已整理

Binder IPC 机制中涉及到的内存映射通过 mmap() 来实现,mmap() 是操作系统中一种内存映射的方法。内存映射简单的讲就是将用户空间的一块内存区域映射到内核空间。映射关系建立后,用户对这块内存区域的修改可以直接反应到内核空间;反之内核空间对这段区域的修改也能直接反应到用户空间。

5. ContentProvider的设计模式

6. 多线程的实现方法(synchronized和lock的异同)

  1. 继承Thread类创建线程

  2. 实现Runnable接口创建线程,推荐使用这种方式,可以复用runnable

  3. 实现Callbale接口,通过FutureTask包装器来创建一个带返回值的线程

synchronized

在用法上,它是java的关键字,一般我们不太需要关注他的锁的释放,代码执行完毕或者报错会自动释放锁,并且无法判断锁的状态。

lock

是一个接口,我们使用_ReentrantLock_ 比较多,有多个获取锁的方式,可以trylock直接返回获取成功或者失败,线程不用一直等待。在finally中必须要释放该锁。

7. 说一下View的事件分发机制

为什么要有事件分发

注:引用G神的博客

Android中的view是树形结构的,view可能会重叠在一起,当我们点击的地方有多个view的时候,这个时间该给谁,这就是为什么要有事件分发。

先来看看view的树形结构:

上面多出来两个东西是phonewindowdecorview,其中,主题颜色和标题栏内容等主要就是decorview来负责显示的,那PhoneWindow是做什么的呢?

PhoneWindow 继承window,并且是window唯一的实现类,window是一个抽象类,是所有视图的最顶层容器,视图的外观和行为都归他管,不论是背景显示,标题栏还是事件处理都是他管理的范畴,它其实就像是View界的太上皇。

DecorViewPhoneWindow 的一个内部类,其职位相当于小太监,就是跟在 PhoneWindow 身边专业为 PhoneWindow 服务的,除了自己要干活之外,也负责消息的传递,PhoneWindow 的指示通过 DecorView 传递给下面的 View,而下面 View 的信息也通过 DecorView 回传给 PhoneWindow

事件分发、拦截、消费

| 类型 | 相关方法 | Activity | ViewGroup | View |

| — | — | — | — | — |

| 事件分发 | dispatchTouchEvent | √ | √ | √ |

| 事件拦截 | onInterceptTouchEvent | X | √ | X |

| 事件消费 | onTouchEvent | √ | √ | √ |

Activity作为原始的事件分发者,不需要拦截事件,如果需要这个事件不分发下去就行了。

同样的,view在事件传递的最末端,也不需要拦截事件,不处理回传回去就行了。

事件在收集之后最先传递给Activity,然后依次向下传递:

Activity -> PhoneWindow -> DectorView -> ViewGroup -> … -> view

如果没有任何View消费掉事件,那么这个事件会按照反方向回传,最终传回给Activity,如果最后 Activity 也没有处理,本次事件才会被抛弃 :

Activity <- PhoneWindow <- DecorView <- ViewGroup <- … <- View

上面的模式是一个非常经典的责任链模式

8. 说一下View从app启动到显示在界面上的绘制流程

在activity的attach方法里面,会创建一个PhoneWindow。

在onCreate中调用setContentView,setContentViewwindow的一个抽象方法,真正实现类是PhoneWindow

@Override

public void setContentView(int layoutResID) {

if (mContentParent == null) {

//1.初始化

//创建DecorView对象和mContentParent对象 ,并将mContentParent关联到DecorView上

installDecor();

} else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {

mContentParent.removeAllViews();//Activity转场动画相关

}

//2.填充Layout

if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {

final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,

getContext());

transitionTo(newScene);//Activity转场动画相关

} else {

//将Activity设置的布局文件,加载到mContentParent中

mLayoutInflater.inflate(layoutResID, mContentParent);

}

//让DecorView的内容区域延伸到systemUi下方,防止在扩展时被覆盖,达到全屏、沉浸等不同体验效果。

mContentParent.requestApplyInsets();

//3. 通知Activity布局改变

final Callback cb = getCallback();

if (cb != null && !isDestroyed()) {

//触发Activity的onContentChanged方法

cb.onContentChanged();

}

mContentParentExplicitlySet = true;

}

核心方法就两个:installDecor() 和 mLayoutInflater.inflate(layoutResID, mContentParent) ;

installDecor会创建一个DecorView 对象,该对象将作为整个应用窗口的根视图。然后配置不同窗口修饰属性(style theme等)。

mLayoutInflater.inflate就是解析xml,深度优先地递归解析xml,一层层添加到root view上,最终返回root view.解析的部分大致包含两点:

1.解析出View对象

2.解析View对应的Params,并设置给View。

9. 知道什么会引起ANR吗 怎么避免

有四种情况会造成ANR发生:

  1. 5秒内无法响应屏幕触摸事件或键盘输出

  2. 在执行前台广播的onReceive()函数时10秒没有处理完成,后台为20秒

  3. 前台服务20秒内,后台服务在200秒内没有执行完成

  4. ContentProviderpublish在10s内没进行完

如何避免:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

总结

其实要轻松掌握很简单,要点就两个:

  1. 找到一套好的视频资料,紧跟大牛梳理好的知识框架进行学习。
  2. 多练。 (视频优势是互动感强,容易集中注意力)

你不需要是天才,也不需要具备强悍的天赋,只要做到这两点,短期内成功的概率是非常高的。

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

低效漫长且无助。下面资料部分截图是我花费几个月时间整理的,诚意满满:特别适合有3-5年开发经验的Android程序员们学习。

[外链图片转存中…(img-4oo6mAv3-1710702215086)]

  • 11
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值