2019年为android开发准备的面试题(含答案)
JsonChao/Awesome-Android-Interview/Android基础面试题
JsonChao/Awesome-Android-Interview/Android高级面试题
JsonChao/Awesome-Third-Library-Source-Analysis
JsonChao/Awesome-Android-Interview/Java基础面试题
JsonChao/Awesome-Android-Interview/Java并发面试题
JsonChao/Awesome-Android-Interview/Java虚拟机面试题
francistao/LearningNotes/Part1/Android
francistao/LearningNotes/Part2/JavaSE
francistao/LearningNotes/Part2/JVM
francistao/LearningNotes/Part2/JavaConcurrent
francistao/LearningNotes/Part3/Algorithm
francistao/LearningNotes/Part4/Network
francistao/LearningNotes/Part5/ReadingNotes
SusionSuc/AdvancedAndroid
android基本功
Android面试题收集
Android 进阶之路(我的博客文章目录)
2019年为android开发准备的面试题(含答案)
LRH1993/android_interview/Android基础
LRH1993/android_interview/Android进阶
LRH1993/android_interview/开源框架
LRH1993/android_interview/Java基础
LRH1993/android_interview/Java并发
LRH1993/android_interview/Java虚拟机
LRH1993/android_interview/TCP/IP
LRH1993/android_interview/HTTP
LRH1993/android_interview/HTTPS
yangchong211/YCBlogs/Android博客大汇总
yangchong211/YCBlogs/Java博客大汇总
yangchong211/YCBlogs/Bug问题大汇总
Android开发工程师面试指南(面试题集附答案、简历模板)
Android面试之Java基础
LRH1993/android_interview/创建型模式
LRH1993/android_interview/结构型模式
LRH1993/android_interview/行为型模式
LRH1993/android_interview/剑指offer
LRH1993/android_interview/LeetCode
LRH1993/android_interview/线性表
LRH1993/android_interview/栈和队
LRH1993/android_interview/树
LRH1993/android_interview/图
LRH1993/android_interview/散列查找
LRH1993/android_interview/排序
LRH1993/android_interview/海量数据处理
======================================================================================
Android 知识梳理目录 - 好吧,这是一个很"干"的标题
AweiLoveAndroid/CommonDevKnowledge/interview
android-exchange/Android-Interview
最全的BAT大厂面试题整理
阿里、腾讯、百度、华为、京东、搜狗和滴滴面试题汇集(更新篇)
Android基础
Activity
1. 说下Activity的生命周期?
2. onStart()和onResume()/onPause()和onStop()的区别?
onStart与onStop是从Activity是否可见这个角度调用的,onResume和onPause是从Activity是否显示在前台这个角度来回调的,在实际使用没其他明显区别。
3. Activity A启动另一个Activity B会回调哪些方法?如果ActivityB是完全透明呢?如果启动的是一个Dialog呢?
4. 谈谈onSaveInstanceState()方法?何时会调用?
5. onSaveInstanceState()与onPause()的区别?
6. 如何避免配置改变时Activity重建?
7. 优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态?
8. 说下Activity的四种启动模式?(有时会出个实际问题来分析返回栈中Activity的情况)
9. 谈谈singleTop和singleTask的区别以及应用场景
10. onNewIntent()调用时机?
11. 了解哪些Activity启动模式的标记位?
12. 如何启动其他应用的Activity?
13. Activity的启动过程?
Service 和 IntentService 的区别
View的绘制流程
事件分发机制
消息分发机制
为什么一个线程只有一个Looper、只有一个MessageQueue?
如何获取当前线程的Looper?是怎么实现的?(理解ThreadLocal)
是不是任何线程都可以实例化Handler?有没有什么约束条件?
Looper.loop是一个死循环,拿不到需要处理的Message就会阻塞,那在UI线程中为什么不会导致ANR?
Handler.sendMessageDelayed()怎么实现延迟的?结合Looper.loop()循环中,Message=messageQueue.next()和MessageQueue.enqueueMessage()分析。
AsyncTask源码分析
如何保证Service不被杀死?如何保证进程不被杀死?
Binder机制,进程通信
动态权限适配问题、换肤实现原理
SharedPreference原理,能否跨进程?如何实现?
性能优化问题
Binder机制
图片加载如何避免OOM / 如何优雅的展示Bitmap大图
关于< include >< merge >< stub >三者的使用场景
界面卡顿的原因有哪些?
Activity与Fragment生命周期有何联系
Activity与Fragment之间如何进行通信?
RecyclerView与ListView缓存机制的不同
RxJava中map和flatmap操作符的区别及底层实现
对消息机制中Looper的理解
Android对HashMap做了优化后推出的新的容器类是什么?
如何优化一个ListView?
哪些情况会导致OOM?/ 如何监测内存泄露?有哪些工具?
用leak工具监测内存泄露的原理是什么?
requestLayout,invalidate,postInvalidate区别与联系
Asset目录与res目录的区别
Android中提供哪些数据持久存储的方法?
Java中的I/O流读写怎么做?
SharePreferences适用情形?使用中需要注意什么?
了解SQLite中的事务处理吗?是如何做的?
使用SQLite做批量操作有什么好的方法吗?
如果现在要删除SQLite中表的一个字段如何做?
Android中进程和线程的关系?区别?
为何需要进行IPC?多进程通信可能会出现什么问题?
什么是序列化?Serializable接口和Parcelable接口的区别?为何推荐使用后者?
Android中为何新增Binder来作为主要的IPC方式?
使用Binder进行数据传输的具体过程?
Binder框架中ServiceManager的作用?
Android中有哪些基于Binder的IPC方式?简单对比下?
是否了解AIDL?原理是什么?如何优化多模块都使用AIDL的情况?
MotionEvent是什么?包含几种事件?什么条件下会产生?
scrollTo()和scrollBy()的区别?
Scroller中最重要的两个方法是什么?主要目的是?
谈一谈View的事件分发机制?
如何解决View的滑动冲突?
谈一谈View的工作原理?
MeasureSpec是什么?有什么作用?
自定义View/ViewGroup需要注意什么?
onTouch()、onTouchEvent()和onClick()关系?
SurfaceView和View的区别?
invalidate()和postInvalidate()的区别?
使用SQLite时会有哪些优化操作?
Android包管理机制,核心PackageManagerService
Window管理,核心WindowManagerService
Android Activity启动和管理,核心ActivityManagerService
根Activity工作流程
Context关联类
Glide加载原理,缓存方案,LRU算法
Retrofit的实现与原理
OKHttp3的使用,网络请求中的Intercept
EventBus实现原理
ButterKnife实现原理
RxJava实现原理
Dagger依赖注入
热修复实现原理,解决方案
组件化原理和解决方案
Java基础
Java中引用类型的区别,具体的使用场景
int、Integer有什么区别
手写生产者/消费者 模式
final、finally、finalize区别
Thread和HandlerThread区别
Java是值传递还是引用传递
final和static关键字的区别
HashSet和HashMap的区别
深拷贝和浅拷贝的区别
clone()的默认实现是深拷贝还是浅拷贝?如何让clone()实现深拷贝?
动态代理和静态代理
Java有哪几种创建新线程的方法及区别
static修饰的方法可以被子类重写吗?为什么?
ThreadLocal的理解
HashMap HashSet HashTable的区别?
如何让HashMap可以线程安全?
Java多线程之间如何通信
线程池的实现机制
Integer类对int的优化
单例模式有哪些实现方式
synchronized volatile关键字有什么区别?以及还有哪些同样功能的关键字
HashMap和Hashtable区别?
HashMap的原理
Java Object类方法
HashCode 作用,如何重载hashCode方法
ArrayList与LinkList区别与联系
Java反射机制,Java代理模式
Java泛型
Synchronized原理
Volatile实现原理
方法锁、对象锁、类锁的意义和区别
线程同步的方法:Synchronized、lock、reentrantLock分析
Java锁的种类: 公平锁、乐观锁、互斥锁、分段锁、偏向锁、自旋锁等
线程和线程池,并发,锁等一系列问题
sleep和wait的区别
Java垃圾回收机制
类加载机制
JVM内存区域的划分,哪些区域会发生OOM
类加载过程,双亲委派模型
网络
1. HTTPS原理
对称加密: 加密数据用的密钥和解密数据用的密钥是一样的。
优点:加密解密效率通常比较高。
缺点:数据发送方、数据接收方需要协商、共享同一把密钥,并确保密钥不泄露给其他人,传输过程中容易被截获。
非对称加密: 加密数据用的密钥(公钥),跟解密数据用的密钥(私钥)是不一样的,私钥加密后的密文,只要是公钥,都可以解密,但是公钥加密后的密文,只有私钥可以解密。私钥只有一个人有,而公钥可以发给所有的人。
优点:安全。
缺点:速度慢。同时存在如何证明公钥是S的问题,因为可能有人从中间劫持,伪装服务端后发送劫持人的公钥。为了解决这个问题,引入了数字证书来保证公钥的有效性。
HTTPS在传输的过程中会涉及到三个密钥:
-
服务器端的公钥和私钥,用来进行非对称加密
-
客户端生成的随机密钥,用来进行对称加密
详细过程: 一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步。
- 客户端向服务器发起HTTPS请求,连接到服务器的443端口
- 服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人。
- 服务器将自己的证书发送给客户端,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间等等。
- 客户端收到服务器端的公钥之后,会对公钥进行检查,验证其合法性,如果发现异常,则会弹出一个警告框提示证书存在问题。如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,即客户端密钥,这样在概念上和服务器端的密钥容易进行区分。然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束。
- 客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。这部分传送的是用证书加密后的随机值,目的就是让服务端得到这个随机值,以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了。
- 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
- 然后服务器将加密后的密文发送给客户端(这部分信息是服务端用私钥加密后的信息,可以在客户端被还原)。
- 客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。
归纳总结:
- 客户端发起HTTPS请求
- 服务端的配置
- 传送证书
- 客户端解析证书
- 传送加密信息
- 服务端解密信息
- 传输加密后的信息
- 客户端解密信息
大概总结: HTTPS要使客户端与服务器端的通信过程得到安全保证,必须使用的对称加密算法,但是协商对称加密算法的过程,需要使用非对称加密算法来保证安全,然而直接使用非对称加密的过程本身也不安全,会有中间人篡改公钥的可能性,所以客户端与服务器不直接使用公钥,而是使用数字证书签发机构颁发的证书来保证非对称加密过程本身的安全。这样通过这些机制协商出一个对称加密算法,就此双方使用该算法进行加密解密。从而解决了客户端与服务器端之间的通信安全问题。
数字证书: 在HTTPS的传输过程,当服务器接收到客户端发来的请求时,会向客户端发送服务器自己的公钥,但是黑客有可能中途篡改公钥,将其改成黑客自己的,所以有个问题,客户端怎么信赖这个公钥是自己想要访问的服务器的公钥而不是黑客的呢? 这时候就需要用到数字证书。
与此相似的,要想让客户端信赖公钥,公钥也要找一个担保人,而且这个担保人的身份必须德高望重,否则没有说服力。这个担保人的就是证书认证中心(Certificate Authority),简称CA。 也就是说CA是专门对公钥进行认证,进行担保的,也就是专门给公钥做担保的担保公司。 全球知名的CA也就100多个,这些CA都是全球都认可的,比如VeriSign、GlobalSign等,国内知名的CA有WoSign。
那CA怎么对公钥做担保认证呢? CA本身也有一对公钥和私钥,CA会用CA自己的私钥对要进行认证的公钥进行非对称加密,此处待认证的公钥就相当于是明文,加密完之后,得到的密文再加上证书的过期时间、颁发给、颁发者等信息,就组成了数字证书。
不论什么平台,设备的操作系统中都会内置100多个全球公认的CA,说具体点就是设备中存储了这些知名CA的公钥。当客户端接收到服务器的数字证书的时候,会进行如下验证:
-
首先客户端会用设备中内置的CA的公钥尝试解密数字证书,如果所有内置的CA的公钥都无法解密该数字证书,说明该数字证书不是由一个全球知名的CA签发的,这样客户端就无法信任该服务器的数字证书。
-
如果有一个CA的公钥能够成功解密该数字证书,说明该数字证书就是由该CA的私钥签发的,因为被私钥加密的密文只能被与其成对的公钥解密。
-
除此之外,还需要检查客户端当前访问的服务器的域名是与数字证书中提供的“颁发给”这一项吻合,还要检查数字证书是否过期等。
2. HTTP的GET和POST的区别
Http是应用层的协议,底层基于TCP/IP协议,所以本质上,get和post请求都是TCP请求。所以二者的区别都是体现在应用层上(HTTP的规定和浏览器/服务器的限制)
- 参数的传输方式:GET参数通过URL传递,POST放在Request body中。
- GET请求在URL中传送的参数是有长度限制的,而POST没有。
- GET的目标功能是查询数据,POST的目标功能是修改数据,或者上传数据
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET请求只能进行url编码,而POST支持更多编码且不对数据类型限制
- GET在浏览器回退时是无害的,而POST会再次提交请求。
- GET请求可以被浏览器缓存,POST不可以
- 对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于 POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。不过要注意,并不是所有浏览器都会在POST中发送两次包,比如火狐