Android面试总结

简历

简历

Activity生命周期

Activity生命周期

Fragment生命周期

Fragment生命周期

Activity的启动模式

  • standard: 默认标准模式,每启动一个Activity都会创建一个实例。
  • singleTop:栈顶复用,如果在栈顶就调用onNewIntent复用,从onResume()开始。
  • singleTask:栈内复用,本栈内只要有该类型Activity就会将其顶部的Activity出栈。
  • singleInstance:单例模式,系统会单独给该Activity创建一个栈,并且该栈中只有该Activity。

案例:A、B、C、D分别是四种Activity的启动模式,那么A->B->C->D->A->B->C->D分别启动,最后的activity栈是怎么样的?

答案:两个栈,前台栈是只有D,后台栈从底至上是A、B、C

启动a,再由a启动b,最后按返回键返回到a的生命周期流程:

  1. a.create-->a.start-->a.resume
  2. a.pause-->b.create-->b.start-->b.resume-->a.stop
  3. b.pause-->a.start-->a.resume-->b.stop-->b.destroy

请说说Handler、Looper、MessageQueue之间的关系

  1. Handler负责消息的发送和处理:Handler发送消息给MessageQueue和接收Looper返回的消息并且处理消息。
  2. Looper负责管理MessageQueue:Looper会不断地从MessageQueue取出消息,交给Handler处理。
  3. MessageQueue是消息队列(实时上它是用链表实现的),负责存放Handler发送过来消息。
  4. 一个Looper对应一个线程(自己所在的线程,如:线程B)。Looper的loop()方法运行在自己所在的线程(线程B)中,当Handler在线程A发送一条消息存放到MessageQueue时,Looper的loop()方法在线程B把消息取出来,并交给Handler处理,所以Handler的处理消息的方法是运行在Looper所在的线程(线程B)的。由于多个线程之间共享内存空间,所以Handler可以在线程A把消息存放到MessageQueue,Looper可以在线程B把消息取出来,一存一取之间就实现了线程的切换。

Handler的主要作用:线程切换。

ANR

ANR的产生是因为程序响应不及时,但是当主线程没有消息需要处理的时候,程序自然也就不需要做出任何响应了,所以这时候阻塞线程,也不会有“程序未响应(ANR)”的问题。而Looper阻塞线程正是为了等待新的消息(比如用户的操作、界面的更新等),然后快速处理响应。

ANR的形成,各个组件上出现ARN的时间限制是多少

  1. 只要是主线程耗时的操作就会ARN 如io
  2. broadcast超时时间为10秒 按键无响应的超时时间为5秒 前台service无响应的超时时间为20秒,后台service为200秒

怎么查看 ANR Log

  • 初步:Logcat 的 ANR 日志查看 CPU 使用率。如果 CPU 使用率很高,表明有耗时计算。过滤ActivityManager。
  • 深入:查看 “/data/anr/traces.txt” 文件。

View绘制原理

performTraversals

measure

layout

draw

Android事件分发机制

事件分发工作流程图

事件分发工作流程图

以角色为核心的图解说明

以角色为核心的图解说明

以方法为核心的图解说明

以方法为核心的图解说明

参考文章

添加新评论