首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android面试总结(一)

上周开始面试,突然决定的,结果很仓促。没想到还剩三周过年的情况下,面试机会很多,就一天接到了3个电话面试和一个视频面试。结果都不理想,乘着周末,先好好总结下。把这几天答得不好的问题好好总结下。

apk签名流程是怎样的?

1、计算摘要(hash算法提取出原始数据的摘要);

2、密钥加密(密钥对摘要加密,生成签名信息);

3、签名信息写入原始数据的签名区域块里面,带上数字证书;

apk校验过程是怎样的?

1、计算摘要(hash算法计算出原始数据的摘要);

2、解密签名(发送过来的公钥对签名信息解密,得出摘要);

3、比较2个摘要,相同校验通过;

这里注意的是keystore文件存储了证书、密钥、公要等;

为肾膜要打成dex文件,有什么好处吗?

遵从dex文件格式,dex各个类能共享数据,降低了冗余,而且dex文件是传统jar文件的50%左右。

内存泄漏具体场景有哪些?

1、handler:非静态内部类默认持有外部引用。Activity销毁了,但是Handler的message没有执行完毕,handle没有被回收。由于非静态内部类默认持有外部引用,因为handler可达,所以当前activity也是可达,jvm就不会回收。

解决办法:handler.removeMessage,或者使用弱应用。

2、单例导致内存泄漏:由于单例使用的context,activity里面传入的是activity.this,static生命周期是整个应用的周期,导致activity实例被static持有不能释放,导致内存泄漏。

解决方法:使用getapplicationContext,或者在application初始化。

3、匿名内部类也会导致内存泄漏。原理是非静态内部类默认持有外部类应用,导致外部类引用无法被释放;

4、静态变量使用内部类。非静态内部类默认持有外部类引用,持有的activity无法被释放,所以内存泄漏,解决方法是ondestory置空static变量;

5、网络请求回调接口。异步请求需要时间回调,如果当前持有activity引用的话。activity没法被gc回收。static和弱引用可以解决,或者使用onDestory在网络请求cancel掉。

6、Rxjava异步没有完成,activity会存在泄漏,可以rxjava可以dispose。

7、toast异步任务。穿进去的context是当前activity的话,当前activity销毁但是toast持有引用,无法销毁。解决使用applicationcontext。

总结:异步调用,持有引用无法释放;内部类内存泄漏,内部类默认持有外部引用,外部引用无法被释放;static变量,静态变量使用内部类和单例,static是整个生命周期,activity生命周期短于static。handler也是这样的。

glide相关问题

1、glide会造成内存泄漏吗?

glide加载图片的时候,突然关闭界面,会内存泄漏吗?glide又一个判断生命周期的方法requestFragmentManager加入到fragmentManager中,activity销毁或者fragment不可见的时候,会停止加载glide。

mvvm使用过吗?和mvp区别在哪里?

使用databinding作为工具实现view model双向绑定,数据发生变化可以通知ui更新。和mvp接口在view和presenter之前通信区别,接口多某个参数可能要修改多个文件。

说几个常用的框架和他们的设计模式

1、rxjava

异步观察者模式,observable发生变化时,observer响应事件;

2、okhttp3

责任链模式,将网络请求的各个阶段封装到了各个链条中,实现了解偶。getResponseWithInterceptorChain()将拦截器构成拦截链,然后链式执行process()方式完成请求;

Gc方式

1、可达性分析算法

节点搜寻,从GC ROOTS的对象作为起始点,开始搜寻,当某个对象没有被引用链连接时,这个对象就是不可用的。

2、计数器(没用)

给对象添加引用计数器,有地方引用他时就加一,引用失效就减一,计数器为0就说明当前对象没有被引用。但是会存在对象相互引用的问题,所以java虚拟机没有使用这个方法。

Android模块化使用过吗?怎么使用的?

用过arouter

看过源码吗?

1、init();

先找到routers包下所有的class文件类名,如果本地缓存有效从本地获取,无效就去dex获取;

根据类名把实例加载到warehouse中。

2、navigation();

根据path的postcard去查找路由信息,完成数据填充。拦截然后导航。

3、数据填充到intent中之后,调用ActivityCompat的startActivity或者startActivityForResult方法启动activity。

说下事件分发机制吧

阿巴阿吧

线程间通信方式了解吗?

1、共享内存机制

同步,synchronized,while轮询

共享内存式,多个线程需要访问某个方法,给方法加锁。

2、消息通信机制

wait,notify。管道通信。

  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/68495a2af3675737c774f413b
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券