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
内存泄漏时会显示内存泄露的位置。
持续更新。。。有问题欢迎指正!!