最近有一些面试,有些当时没答上来。这里记录下,欢迎交流。
虽然感觉有些问题太具体以及业务相关,并不适合考察面试者的思维和能力。
1. WebSocket是什么?与Http有什么关系?Websockt的持久连接又是什么?
a. WebSocket一种在单个 TCP 连接上进行全双工通讯的协议。能够实现服务端给客户端推送,实时同步。
b. 都采用TCP协议
Websocket使用和 HTTP 相同的 TCP 端口。
Websocket 通过 HTTP/1.1 协议的101状态码进行握手。
c. WebSocket 允许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
ps: Websocket,SPDY 和 HTTP 2.0 都可以实现服务端推送
2. 安卓事件的底层分发实现,EventBus的事件分发原理
b. 图解 Android 事件分发机制 的前两张图
3. 如何从浏览器跳转到应用某个页面,如何从通知栏打开应用某个页面,如何从微信跳转到应用某个页面
a. 跳转实现:
-
为了能够从微信浏览器点击链接直接跳转到应用,需要从应用宝申请专门的链接。会先跳到应用宝的下载页面,然后检测应用是否已经安装,如果已经安装,会弹框提示用户打开应用。但发现网易云能够直接从微信浏览器页面跳到应用,估计是微信浏览器有直接跳转的白名单?
-
但在手机浏览器中只能跳转到应用下载页面。所以需要js判断当前的浏览器,如果是微信浏览器,就使用
应用宝的链接,如果是其他浏览器,就使用Chrome Intent,即一种custom scheme。
- Scheme方式的跳转是在浏览器中进行的。而
Deep Linking可以直接从http链接跳转到应用而不需要浏览器中转,比如短信消息里的链
接。
在Android M之前,点击一个链接会弹出一个对话框,询问用户使用哪个应用打开 - 包括浏览器应用。但是谷歌在Android M 上的Deep Linking技术支持自动认证(auto-verify)机制,让用户不必在弹出框的列表中选择,而是直接跳转到他们的App。
b: 跳转处理:
如何优雅地从浏览器打开本地应用
但其中除了可以用
New_Task启动新的Activity,不影响原来的任务栈之外,也可以 使用FLAG_ACTIVITY_REORDER_TO_FRONT将页面提到栈顶
4. 用什么黑科技,能监听某个特定应用的启动
https://github.com/jaredrummler/AndroidProcesses 但需要保活,轮询
5. webview的优化,进度条显示,页面加载速度的优化技巧,多图加载的优化技巧,内存泄漏的原因
a. 增加进度条:
加progressBar,通过WebChromeClient设置进度。范例:浅谈WebView的页面跳转 但setWebViewClient(new WebViewClient())时不需要覆盖shouldOverrideUrlLoading方法
b. 速度优化:
“在初始化的同时,通过Native来完成一些网络请求等过程,使得WebView初始化不是完全的阻塞后续过程”,以加快WebView的加载。
也提到通过前端(JS) 服务端 客户端配合来加快WebView的加载,但的确是为了几十毫秒就需要做很多工作,所以用户量庞大的APP适用
WebView性能、体验分析与优化
缓存机制
http://dev.qq.com/topic/591d537a5bf956911a014c63
WebSettings settings = webView.getSettings(); settings.setAppCacheEnabled(true); settings.setDatabaseEnabled(true); settings.setDomStorageEnabled(true);//开启DOM缓存,关闭的话H5自身的一些操作是无效的 settings.setCacheMode(WebSettings.LOAD_DEFAULT);
图片延迟加载
WebView三部曲:性能优化
c. 内存泄漏优化:
另起进程来运行WebView;使用Application的Context来new WebView
https://juejin.im/entry/57d6434067f3560057e50b20
d. WebView安全
http://developers.googleblog.cn/2017/07/webview.html
声明启用安全浏览
6. hashmap实现快速存储和查找的原理
- 采用 Hash 算法决定集合元素的存储位置
- 数组+链表的结构,利用数组的查找效率为O(1) ,快速找到key所对应的索引
- 动态扩容,提高存取效率
- JDK1.8还结合了红黑树
通过分析 JDK 源代码研究 Hash 存储机制
补充:
ContentProvider
http://www.jianshu.com/p/f5ec75a9cfea
http://wangkuiwu.github.io/2014/07/06/ContentProvider-Uri/
greenDao及其升级:
http://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650821932&idx=1&sn=d26c09af7cbbfb1b0a95517bd78cc784&chksm=80b781b2b7c008a4a8dab45756e4d433b1c56e1c61762f98ee3b8a2b89a00756f82d6bb4d6b6&scene=0#rd
https://github.com/yuweiguocn/GreenDaoUpgradeHelper/blob/master/README_CH.md
网友评论