一、Android
组件、控件
- Activity生命周期
- Activity从前台切换到后台,然后再回到前台,生命周期回调方法
- Activity上方弹出Dialog,生命周期回调方法
- Activity上方有Dialog,按Home键时生命周期回调方法
- Activity横竖屏切换时,生命周期回调方法
- 下拉状态栏是否影响Activity生命周期回调方法
- Activity的缓存方法onSaveInstanceState
- Activity启动模式
- Activity栈
- Activity启动流程
- Service生命周期
- Service启动方式
- Fragment生命周期
- Activity之间通信方式
- Activity与Service通信方式
- Fragment之间通信方式
- Context,Application与Activity的Context对象区别
- AlertDialog、popupWindow和Activity区别
- 广播的动态注册与静态注册,广播类型,本地广播
- ContentProvider的作用
- AndroidManifest的作用
- Intent可以传递哪些数据
- Bundle机制
- View事件分发机制
- View点击事件被拦截,如何才能传递到子View
- View渲染机制
- 自定义View
- RecycleView使用、原理、优化
- RecycleView与ListView区别
- ListView的优化
- Listview图片加载错乱的原理与解决方案
- ViewPager使用,如何只初始化当前Fragment,其它不初始化
- SurfView
- LinearLayout、RelativeLayout、FrameLayout的特性与使用场景
- layout_gravity和gravity区别
- layout_weight
动画
- 动画有哪几类
- 差值器与估值器
数据存储
- Android中数据存储方式
- SharedPreferences是否进程同步,如何做到进程同步
- SQLite的基础操作
- SQLite升级,增加字段的语句
消息机制
- Handler机制
- Handler如何绑定线程
- Looper如何创建与启动
进程间通信
- Android中进程间通信方式
- AIDL机制
- Binder机制
- 序列化的作用,Android中两种序列化的区别
- 为什么引入Parcelable
进程、线程、线程池
- Android进程分类
- Android中进程内存的分配,能否自己分配定额内存
- 多进程使用场景
- AsyncTask原理,如何取消AsyncTask
- IntentService
- HandlerThread
- ActicityThread
- ANR的原因,如何分析
- App崩溃异常捕捉
- OOM是否可以try catch
- 内存泄露如何产生
- 为什么不能在子线程更新UI
- 在子线程更新UI的方式
- 为什么在Service中创建子线程而不是在Activity中
图片加载
- LRUCache原理
- 图片加载原理
- 加载大图,如何预防OOM
- Bitmap如何回收
资源目录
- asset和res目录的区别
容器
- SpareArray原理
JNI
- 如何调用Java层代码
虚拟机
- 对Dalvik、ART虚拟机的基本了解
- Android类加载机制
Gradle
- Android Studio build流程
性能
- 如何统计应用启动时长
- 如何保证应用启动不卡顿,加快启动速度
- 如何保持应用稳定性
- 如何去除重复代码
- 启动优化、布局优化、内存优化、网络优化、电量优化
框架
- Android架构图
- 应用安装流程
- 应用启动流程
- 系统启动流程
- 权限管理系统,动态权限适配方案,权限组概念
- App沙箱化机制
开源框架
- RxJava功能与原理,相比平时的异步操作的优势
- OkHttp功能与原理,如何处理网络缓存
- EventBus功能与原理
- Glide功能与原理,使用的缓存,如何控制内存缓存大小
架构
- 模块化的实现及好处
- 组件化
- MVC、MVP、MVVM
- 观察者模式,单例模式
- 适配器模式、装饰者模式、外观模式的异同
高级
- 动态加载
- 插件化
- 热修复
项目
- 进程如何保活
- 如何唤醒其他进程
- 多线程断点续传原理及实现
- 开启摄像头的主要步骤
- 微信主页面的实现方式
- 微信上消息小红点的原理
二、Java
面向对象
- 抽象类与接口的区别
- 内部类、静态内部类与匿名内部类,以及在项目中的应用
- 静态内部类的设计意图
- Java四种引用,软引用与弱引用区别,强引用置为null,会不会被回收
- Object类的equals和hashCode方法重写
- ==、equals、hashCode区别
String
- String、StringBuffer、StringBuilder区别
- String为何设计成不可变的
- String to Integer
容器
- HashMap原理
- HashMap与HashSet区别
- ConcurrentHashMap原理
- TreeMap原理
- Set原理,Hash如何防止碰撞
- 多线程操作List
- Arraylist和Linkedlist的区别,以及应用场景
- List、Set、Map区别
- 容器与并发容器
进程、线程、线程池
- 进程与线程区别,为什么要有线程
- ThreadLocal原理
- 如何实现线程同步
- volatile原理
- synchronize原理
- lock、ReentrantLock原理
- synchronized与Lock区别
- static synchronized方法的多线程访问和作用
- 同一个类里面两个synchronized方法,两个线程同时访问的问题
- CAS介绍
- wait与notify
- wait与sleep区别
- 手写生产者/消费者模式
- 死锁发生条件,如何避免死锁
- 开启线程的三种方式,run()与start()方法区别
- 线程如何关闭,如何防止线程的内存泄漏
- Java线程池
- 线程池的上限
注解
- 对注解的了解
IO、NIO
- 对NIO的了解
虚拟机
- JVM内存模型,内存区域,堆和栈,开线程影响哪块内存
- 垃圾回收机制,对象创建,新生代与老年代
- 垃圾回收机制与调用System.gc()区别
- Java类加载器
- 双亲委派模型
- OSGI
- 对象的生命周期
三、网络协议
Http、Https
- Https请求慢的解决办法,DNS,携带数据,直接访问IP
- Https如何验证证书的合法性,哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解
TCP、UDP
- TCP与UDP的区别
- TCP三次握手与四次挥手
Socket、WebSocket
- WebSocket与Socket区别
四、数据结构与算法
排序
- 快速排序,实现及时间复杂度、空间复杂度
- 堆排序,实现及时间复杂度、空间复杂度
树
- 二叉树,深度遍历与广度遍历
- B树,B+树
图
- 有向无环图
链表
- 判断单链表是否成环
- 翻转一个单向链表
- 合并多个单有序链表(假设都是递增的)
其它
- 两个不重复的数组集合中,求共同的元素
- 对上一问进行扩展,海量数据,内存中放不下,怎么求出
五、其它
- 视频加密传输
- 逻辑地址与物理地址,为什么使用逻辑地址
- 加密算法(Base64、MD5、对称加密和非对称加密)和使用场景
网友评论