Activity(A)跳转到Activity(B)又回到Activity(A),怎么保证数据的持久化?
如果跳转到活动B后,活动A被回收,此时再返回活动A,活动A会经历那些阶段?
由于资源相关配置发生改变,导致Activity被杀死和重新创建(例如屏幕旋转)
.广播接收器中的onReceive()方法中可以进行读取文件等IO操作吗?为什么?会发生什么?
内部类的分类和特点?
内部类主要有4种:静态内部类、非静态内部类、局部内部类、匿名内部类
Intent的类型?
Android中子线程与UI线程的交互?
进程间的通信?
管道,队列,信号量,共享内存,socket
造成死锁的条件?
互斥、请求与保持、不可剥夺、循环等待
Http的状态码
200:请求成功
301:永久重定向
302:临时重定向
404:url错误
500:服务端发生错误
503:服务端当前不能处理,一段时间后可能能处理
502:服务器尝试执行请求时,从上有服务器收到了无效的响应
504:服务器尝试执行请求时,没有及时收到上游服务器的响应
tcp1.0,1.1,2.0的区别?
1.0需要主动建立长连接,1.1.默认长连接。1.1支持只发送header信息而不用发送请求体,并且还支持host域
2.0支持多路复用,数据压缩和服务器推送
进程的通信方式?
管道:分为匿名管道和命名管道,有亲缘关系的可以使用匿名管道,没有的使用命名管道
信号量:它是一个计数器,可以用来控制多个进程对共享资源的访问。经常作为一种锁机制来防止多个进程同时访问一个资源
套接字:可以用于不同机器之间的进程通信
共享内存:它可以映射一段能够被其他进程所访问的内存,这段内存由一个进程创建,但是可以被多个进程访问。它是最快的ipc方式
进程的五种状态?
创建状态
就绪状态:进程已经准备好,只要分配到cpu就能够立即执行
执行状态
阻塞状态:正在执行的进程由于某些事件(IO)而暂时无法运行
终止状态:进程结束或者出现错误
tcp/ip五层?
应用层、传输层、网络层、数据链路层、物理层
tcp/ip七层?
应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
Anr?
5s内触摸事件没有响应
10s内broadcastReceiver没有响应
20s内Service没有处理完成
哪些对象可以作为gc root?
虚拟机栈中引用的对象
本地方法栈中引用的对象
方法区中的静态属性引用的对象
方法去中常量引用的对象
Handler的内存泄漏?
Android的数据存储?
IntentService的本质就是Handler+HandlerThread
不建议通过bindService()来启动IntentService。因为采用bindService方式启动的话,那么对应的生命周期如下:onCreate()-> onBind() -> onunbind() -> onDestory()也就是说并不会调用onStartCommand()方法,也就不会将消息发送到对应的消息队列,这样的话onHandleIntent就不会回调,那么就无法实现多线程的操作
SharedPreference是Android平台上的一个轻量级存储方式,提供了string、int、long、set、float、boolean六种数据类型,最终会以xml形式进行存储,通常用来做一些简单数据的持久化缓存
当首次创建SharedPreference对象时,会根据文件名将文件下的内容一次性加载到mMap容器中,每次edit时都会创建一个新的EditorImpl对象,当修改或者添加数据时会将数据添加到mModifiled容器中,然后进行commit或者apply操作时会比较mMap和mModifiled数据并对mMap的数据进行修正并写入到文件中,当调用get方式时则直接从mMap中读取
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
一共分4步:
如果要保证hashmap的时间复杂度为O(1),那么得保证每一步都是O(1),从代码中可以看出假如出现了哈希冲突,也就是成为了链表的话时间复杂度就是O(n)了,我们只有保证链表长度为1时时间复杂度才是O(1),所以hashmap的时间复杂度为O(1)需要我们手动保证,应该尽量减少hash冲突,它只有在理想情况下才能保证时间复杂度为O(1)。
Activity并不负责视图控制,它只是控制生命周期和处理事件。真正控制视图的是Window,Window是一个抽象类,实际Activity持有的是一个PhoneWindow,它才是真正的窗口。Window的内部有一个DecorView,它是View的根布局。DecorView·是FrameLayout的子类,它是Android的根节点视图,它的内部包含一个竖直方向的LinearLayout,其中有标题栏和内容栏,内容栏叫做contentView,所以我们在onCreate()方法中调用的都是setContentView()方法而不是setView()
View的绘制主要有三个过程:measure、layout、draw
假如是View:那么就直接通过measure()完成测量,measure()中进行基本的测量逻辑判断,在measure()中会调用onMeasure()方法来计算View的宽高并存储,onMeasure()中会调用setMeasureDimension()来存储计算后的View宽高,最后调用getDefaultSize()完成测量
假如是ViewGroup:它除了完成自身ViewGroup的测量外,还会去遍历调用所有子元素的measure方法,在ViewGroup中没有重写onMeasure(),而是提供了一个measureChildren()方法
从顶级View开始依次调用layout(),其中子View的layout()会调用setFrame()来设定自己的四个顶点,,接着调用onLayout()来确定坐标
它的绘制顺序是:
listView比较单一,只有纵向效果,RecyclerView支持多种布局(线性布局、表格布局、瀑布流布局)
在RecyclerView中如果存在的LayoutManager不能满足需求,可以在LayoutManager的API中自定义layout
RecyclerView中有已经封装好的API来实现自己的动画效果,而ListView并没有实现,需要自己在Adapter中实现Item的动画效果
在事件分发机制中,Touch事件在进行分发时,由父View向子View传递,一旦子View消费这个时间,那么接下来的事件进行分发就直接由子View处理。但是嵌套滚动机制可以弥补这个不足,使得子View与父View都能够同时处理这个Touch事件。而RecyclerView实现了NestedScrollingChild,所以能够实现嵌套滚动机制
ListView没有
RecyclerView比ListView多两级缓存,支持多个离开屏幕的ItemView缓存,支持开发者自定义缓存处理逻辑,支持所有RecyclerView共用一个RecyclerViewPool(缓存池)
ListView使用缓存时会先判断源数据是否发生改变,如果发生了改变,则会从mScrapViews中读取View缓存,如果没有发生改变,则从mActivityViews中通过匹配pos获取View缓存,如果成功则返回view,失败就又从mScrapViews中读取view缓存
RecyclerView先会尝试从mAttachScrap中通过匹配pos获取holder缓存,失败的话再去从mCachedViews中通过匹配pos获取holder缓存,再失败就从mViewCachedExtension中定义holder缓存,还是不行的话就去从mRecyclerViewPool中获取holder缓存,假如在mRecyclerViewPool中获取holder缓存成功的话,那么清楚holder所有标志位,确保能够重新bindView;如果失败的话,那么调用createViewHolder方法
RecyclerView的缓存机制虽然更加完善,但是并不是最大的优点,RecyclerView更大的亮点就是提供了局部刷新的接口,通过局部刷新,就能够避免调用许多无用的bindView
RecyclerView的重新绘制分为三步:onMeasure、onLayout、onDraw
其中onLayout分三步:
ListView和RecyclerView的最大区别在于数据源改变时的缓存的处理逻辑,ListView是将所有的mActivityViews移到二级缓存mScrapViews中,而RecyclerView则是更加灵活地修改每个View的标志位,区分是否需要重新bindView
如果列表页展示界面需要支持动画,频繁刷新,局部刷新,建议使用RecyclerView。ListView在使用上更加简单