Android面试常见问题汇总

1.Activity生命周期

首先说一下Activity四种状态及running,paused,stopped,killed。

当启动一个Activity时需执行onCreate()->onStart()->onResume()。此时Activity可以与用户进行交互。

若按Home键,则onPause()->onStop()。继续onPause()->onStop()->onDestroy()。

若Activity在后台重新回到与用户交互状态onRestart->onStart->onResume。

2.Activity的启动模式

四种启动模式

(1)standard:每次都重新创建activity实例,并加到任务栈中。不考虑之前是否存在,不会复用,消耗内存资源。

(2)singletop:栈顶复用,若在栈顶,则不重新创建。

(3)singleTask:栈内复用,若在栈内则不重新创建;存在则直接至于栈顶,以上的activity就都移除了。

(4)singleinstance:activity在系统中有并只有一个实例,activity独享任务栈。

3.Handler机制

实现了Android线程间的数据传递,异步处理消息。通常为了防止在主线程进行耗时操作,一般运用Handler机制将子线程数据传递给主线程。

Handler机制包含四个主要对象:Message、MessageQueue、Looper、Handler。Message是线程间传递的消息;MessageQueue是一个消息集合用来存放Runnable和Message,是一个单向链表;Looper相当于是对MessageQueue的管理机制,每个线程独享,不停循环消息队列,只要有消息就取出。

Looper有两个方法:prepare():保证每个线程只有一个Looper;loop():死循环。

使用方法:

(1)创建Handler对象,实现(覆写)handleMessage()方法;

(2)创建Runnable线程;

(3)--产生一个Looper,并自动创建一个消息队列MessageQueue();

(4)Looper轮询MessageQueue交给Handler;

(5)Handler处理。

4.Binder机制

Binder采用了linux内存管理技术,在通过内核空间传递数据时,保证数据的正确性。使用用户空间无法访问的内存空间来交换数据,保证IPC的安全性。实现进程间通信,也就是RPC,把系统的一系列组件:上层的Client和Server;中间层的ServiceManager和底层的Binder驱动程序连接,开发者只需实现client和server。

从组件视角看,包含Client、Server、ServiceManager以及binder驱动。类比两人打电话,ServiceManager相当于通讯录,binder相当于基站。

5.Android的缓存(LRUCache,DiskLRUCache)原理

缓存的策略包含添加,获取和删除三类操作。

LruCache中维护了一个集合LinkedHashMap,该LinkedHashMap是以访问顺序排序的。当调用put()方法时,就会在结合中添加元素,并调用trimToSize()判断缓存是否已满,如果满了就用LinkedHashMap的迭代器删除队尾元素,即近期最少访问的元素。当调用get()方法访问缓存对象时,就会调用LinkedHashMap的get()方法获得对应集合元素,同时会更新该元素到队头。

6.View工作流程

主要流程即measure,layout,draw三大流程。measure确定View的测量宽高,layout确定View最终的宽高和四个顶点的位置,draw将View绘制到屏幕上。

(1)measure是final方法,不能重写。onMeasure来实现,其中setMeasureDimension方法设置View宽高的测量值。

除了完成自己的measure过程以外,还会遍历去遍历所有子元素的measure方法,各个子元素再递归去执行这个过程。Measurespc是测量模式。

(2)layout作用是ViewGroup用来测定子元素的位置,ViewGroup位置确定后,layout方法确定View本身位置,onLayout确定所有子元素位置。

setFrame方法设定View四个顶点的位置。PS:测量宽高通常等于最终宽高,但也可以不等。

(3)draw就是将View绘制到屏幕上面,步骤如下:

绘制背景->绘制自己->绘制children->绘制装饰

7.View事件分发机制 

基本遵从Activity->ViewGroup->View的顺序进行事件分发,然后通过调用onTouchEvent()方法(返回true or false)进行事件的处理。我们在项目中一般会对MotionEvent.ACTION_DOWN,MotionEvent.ACTION_UP,MotionEvent.ACTION_MOVE,MotionEvent.ACTION_CANCEL分情况进行操作。

framework层,首先传到Activity,委托Window->委托DecorView进行事件分发处理。

(1)事件的分发机制,dispatchTouchEvent。parent根据触摸事件的产生位置,以及child是否愿意负责处理该系列事件,向child分发事件。

(2)事件的拦截机制,onInterceptTouchEvent。主要是parent根据它内部的状态、或者child的状态,把事件拦截下来,阻止其进一步传递到child的机制。

(3)事件的处理机制,onTouchEvent。事件序列的接受者,对事件作出处理并向parent传递处理结果。

8.自定义View

(1)创建自定义类,继承View类,并重写构造方法;

(2)重写ondraw()方法。

9.Android内存泄漏及如何检测内存泄漏

检测工具:LeakCanary

内存泄漏时会显示内存泄露的位置。

持续更新。。。有问题欢迎指正!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值