Android面试题最全总结系列 (持续更新中...)

前言

自己一直做Java、Android相关的知识总结->KnowledgeSummary系列。这个GitHub的repo想作为自己对于Android核心知识点以及一些面试题的总结,因为很多知识点理解的不够深刻,所以通过这个来强迫自己做总结,目前已经初具规模,我基本每天都会更新这个repo,后续还会持续更新下去,大家有兴趣可以点个star关注下,感谢。

在做这个知识总结系列,发现有的比较零散的面试题不太适合开个doc文档来写,于是想着把这些零散的面试题做个总结,所以想收录在这篇文章里面,并且每个面试题尽量提供一个参考答案,因为如果只是把面试题列出来,我举得一点意思都没有,这样的面试题网上一搜一大把,所以我希望为每一个面试题提供一个参考,但不能保证这些答案完全正确。

我的目标是这份面试题能够长期更新,因为比较多,暂时就不分类了。

原文链接

如何计算一个View的层级
Art和Dalvik区别
socket判断http请求或http响应的传输结束
OnLowMemory和OnTrimMemory的比较
BlockCanary核心原理分析
onRestart 什么时候调用
Handler 如何防止内存泄漏
TCP可靠性的保证机制总结
synchronized 和 ReentrantLock 的区别和使用选择
synchronized,volitale的异同
SparseArray和ArrayMap使用场景
Android 中 getRawX()和 getX()区别
Android中的MotionEvent手势事件
onInterceptTouchEvent()函数与 onTouchEvent()的区别
Http 1.0和Http 2.0的区别
View.getLocationInWindow和View.getLocationOnScreen区别
http和https的区别
为什么要有内部类,静态内部类和普通内部类区别是什么
Java中四种线程池的总结
Intent传递数据的限制大小
onStartCommand 的几种模式
RelativeLayout的onMeasure方法是怎么Measure的
主线程的死循环是否一致耗费CPU资源
Service 和 IntentService 的区别
SQLite增删改查以及升级的sql语句
Service的生命周期Activity之间的通信方式
SurfaceView和TextureView的区别
onSaveInstanceState和onRestoreInstanceState调用时机
LeakCanary原理
Android系统为什么会设计ContentProvider
Service和Activity通信
OOM 是否可以try catch
AlertDialog,Toast 对Activity生命周期的影响
HTTP与TCP的区别和联系
viewstub可以多次inflate么?多次inflate会怎样?
onWindowFocusChanged 执行时机

如何计算一个View的层级

【参考】:

int i = 0;
private void getParents(ViewParent view){
   
    if (view.getParent() == null) {
    
        Log.v("tag", "最终==="+i); return;
    }
    i++;
    ViewParent parent = view.getParent(); 
    Log.v("tag", "i===="+i);
    Log.v("tag", "parent===="+parent.toString());
    getParents(parent); 
}

因为public abstract class ViewGroup extends View implements ViewParent
ViewGroup是ViewParent的实现类,所以可以直接转, LinearLayout是ViewGroup 的子类。

Art和Dalvik区别

【参考】:
Android 4.4发布了一个ART运行时,准备用来替换掉之前一直使用的Dalvik虚拟机

Art: Android Runtime,编译机制:AOT,预编译机制
Dalvik:编译机制:JIT,即时编译

ART 的机制与 Dalvik 不同。在Dalvik下,应用每次运行的时候,字节码都需要通过即时编译器(JIT,Just-In-Time)转换为机器码,这会拖慢应用的运行效率,而在ART 环境中,应用在安装的时候,字节码就会预先编译成机器码,使其成为真正的本地应用。这个过程叫做预编译(AOT,Ahead-Of-Time)。这样的话,应用的启动(首次)和执行都会变得更加快速。

什么是Dalvik

Dalvik是Google公司自己设计用于Android平台的Java虚拟机。Dalvik虚拟机是Google等厂商合作开发的Android移动设备平台的核心组成部分之一,它可以支持已转换为.dex(即Dalvik Executable)格式的Java应用程序的运行,.dex格式是专为Dalvik应用设计的一种压缩格式,适合内存和处理器速度有限的系统。Dalvik经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik应用作为独立的Linux进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。

什么是ART

Android操作系统已经成熟,Google的Android团队开始将注意力转向一些底层组件,其中之一是负责应用程序运行的Dalvik运行时。Google开发者已经花了两年时间开发更快执行效率更高更省电的替代ART运行时。ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是依靠一个Just-In-Time(JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运行。ART则完全改变了这套做法,在应用安装的时候就预编译字节码到机器语言,这一机制叫Ahead-Of-Time(AOT)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。

ART优点:

  • 系统性能的显著提升
  • 应用启动更快、运行更快、体验更流畅、触感反馈更及时
  • 更长的电池续航能力
  • 支持更低的硬件

ART缺点:

  • 更大的存储空间占用,可能会增加10%-20%
  • 更长的应用安装时间

socket判断http请求或http响应的传输结束

【参考】:先把 header 直到\r\n\r\n 整个地址记录下来

如果是短连接,没有启用 keepalive,则可以通过是否关闭了连接来判断是否传输结束, 即在读取时可判断 read() != -1。传输完毕就关闭 connection,即 recv 收到 0 个字节。
如果是长连接,那么一个 socket(tcp)可能发送和接收多次请求,那么如何判断每次的 响应已经接收?

  1. 先读请求头,一直到\r\n\r\n 说明请求头结束,然后解析 http 头,如果 Content-Length=x 存在,则知道 http 响应的长度为 x。从头的末尾直接读取 x 字节就是响应内容。
  2. 如果 Content-Length=x 不存在,那么头类型为 Transfer-Encoding: chunked 说明响应 的长度不固定,则在响应头结束后标记第一段流的长度,即直到流里有\r\n0\r\n\r\n 结束
  3. 如果 recv 返回 SOCKET_ERROR 时,说明对方已经断开连接,但是可能是非正常断开 (断网或者客户端进程结束

OnLowMemory和OnTrimMemory的比较

【参考】:OnLowMemory 被回调时,已经没有后台进程;而 onTrimMemory 被回调时,还有后台进程。
OnLowMemory 是在最后一个后台进程被杀时调用,一般情况是 low memory killer 杀进程 后触发;而 OnTrimMemory 的触发更频繁,每次计算进程优先级时,只要满足条件,都会触发。
通过一键清理后,OnLowMemory 不会被触发,而 OnTrimMemory 会被触发一次。

BlockCanary核心原理分析

【参考】:

public static void loop() {
   
        final Looper me = myLooper();
        if (me == null) {
   
            throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
        }
        final MessageQueue queue = me.mQueue;

        // Make sure the identity of this thread is that of the local process,
        // and keep track of what that identity token actually is.
        Binder.clearCallingIdentity();
        final long ident = Binder.clearCallingIdentity();

        for (;;) {
   
            Message msg = queue.next(); // might block
            if (msg == null) {
   
                // No message indicates that the message queue is quitting.
                return;
            }

            
  • 16
    点赞
  • 87
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值