Android面试总结(一)
数据存储
Q:Android中提供哪些数据持久存储的方法?
Q:SharePreferences适用情形?使用中需要注意什么?
少量的配置类标记数据,避免复杂的前置操作
Q:了解SQLite中的事务处理吗?是如何做的?
使用SQLiteDatabase的beginTransaction()
方法可以以独占模式开启一个事务,程序执行到endTransaction()
方法时会检查事务的标志是否为成功,如果之前调用了setTransactionSuccessful()
方法设置事务的标志为成功则提交事务,否则回滚事务。多用于大量数据操作时,能明显减少耗时。
Q:使用SQLite做批量操作有什么好的方法吗?
用事务处理进行优化。在数据库操作时,如果当前没有显式事务,SQLite会默认启动一个隐式事务。隐式事务只持续在数据库操作的持续时间内,然后结束。如果数据库操作成功,则提交其更改。在批量操作的时候不开启事务会创建许多隐式事务,非常耗时。
Q:如果现在要删除SQLite中表的一个字段如何做?
SQLite不支持drop column
。
步骤
- 创建删除了某个字段的临时表
- 迁移数据
- 删除旧表
Q:使用SQLite时会有哪些优化操作?
- 批量操作时使用事务
IPC
Q:Android中进程和线程的关系?区别?
线程是CPU调度的最小单元,同时也是一种有限的系统资源。进程一般指一个执行单元,在Android中指一个应用。一个进程可以包含多个线程,因此进程和线程是包含和被包含的关系。
Q:为何需要进行IPC?多进程通信可能会出现什么问题?
- 一个进程Android分配的内存有限,早些Android版本一个进程只分配16M,如果一个应用太大,那么一个进程就无法满足。
- 守护进程:防止进程被kill
- 当前应用需要向其他应用获取数据。由于是两个应用,即两个进程。
可能出现的问题
- 静态成员和单例模式完全失效
- 线程同步机制完全失效
- SharedPreference的可靠性下降
- Application会多次创建
Q:什么是序列化?Serializable接口和Parcelable接口的区别?为何推荐使用后者?
序列化是将对象持久化到存储设备上或者通过网络传输给其它客户端。
静态成员属于类不属于对象,不会参与序列化的过程。
用
transient
关键字标记的成员变量不会参与序列化过程。
Serializable & Parcelable
- 相同点:
- 两者都可以进行序列化与反序列化;
- 不同点:
- Serializable 的数据最后是存放在硬盘上的,那么读的时候也是 I/O 操作,使用简单但是开销很大。而 Parcelabe 是存放在内存中的。这就导致了下面的一点
- Parcelable 的读写速度比 Serializable 在数据量大的时候,快很多
- Serializable 的实现十分简单,而 Parcelable 的代码量却比较多
Parcelable接口是Android特有功能,效率比实现Serializable接口高效,可用于Intent数据传递,也可以用于进程间通信(IPC)
Q:Android中为何新增Binder来作为主要的IPC方式?
Q:使用Binder进行数据传输的具体过程?
Q:Binder框架中ServiceManager的作用?
Q:是否了解AIDL?原理是什么?如何优化多模块都使用AIDL的情况?
Q:IPC方式的优缺点和适用场景
名称 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Bundle | 简单易用 | 只能传输Bundle支持的数据类型 | 四大组件间的进程通信 |
文件共享 | 简单易用 | 不适合高并发场景,并且无法做到进程间的通信 | 无并访问情形,交换简单的数据实时性不高的场景 |
AIDL | 功能强大,支持一对多并发通信,支持实时通信 | 使用稍复杂,需要处理好线程同步 | 一对多通信且有RPC需求 |
Messenger | 功能一般,支持一对多串行通信,支持实时通信 | 不能很好的处理高并发情形,不支持RPC,数据通过Message进行传输,因此只能传输Bundle支持的数据类型 | 低并发的一对多即时通信,无RPC需求,或者无须返回结果的RPC需求 |
ContentProvider | 在数据源访问方面功能强大,支持一对多并发数据共享 | 可以理解闭为受约束的AIDL,主要提供数据源的CRUD操作 | 一对多的进程间的数据共享 |
Socket | 功能强大,可以通过网络传输字节流,支持一对多并发实时通信 | 实现细节稍微有点烦琐,不支持直接的RPC | 网络数据交换 |