最近在准备面试,将刷过的面经,看过的面试题记录在这里
-
软引用和弱引用的区别
SoftReference 内存不足时回收
WeakReference 不管内存是否充足都会回收 -
Activity的启动模式、任务栈以及使用场景?
-
如何压缩减小少APK安卓安装包大小
从资源、图片、代码等
-
子线程中如何使用Handler
1、 Looper.prepare() looper.loop()
2、 getMainLooper() -
Service启动的方式以及生命周期
- startService()
onCreate()--->onStartCommand()
与宿主组件无关,如果已经启动了,则只会调用onStartCommand() 方法, 关闭服务需调用stopService(),生命周期只回调onDestory() - bindService()
onCreate() --->onBind()--->onunbind()--->onDestory()
注意:绑定服务不会调用onstart()或者onstartcommand()方法, 和宿主组件相关,如果宿主挂了,则服务同样挂了,调用onUnbind() ---> onDestory()
绑定本地服务调用方法的步骤:食梦兽博客
1、在服务的内部创建一个内部类 提供一个方法,可以间接调用服务的方法
2、实现服务的onbind方法,返回的就是这个内部类
3、在activity 绑定服务。bindService();
4、在服务成功绑定的回调方法onServiceConnected, 会传递过来一个 IBinder对象
5、强制类型转化为自定义的接口类型,调用接口里面的方法。 - startService()
-
startactivityforresult的时候,比如A startB activity,A activity被回收,B回来的时候的A和B的生命周期各自是什么?拭心面试经验
D/ActivityLifeRecycler: SecondActivity : onCreate() ====
D/ActivityLifeRecycler: SecondActivity : onStart() ====
D/ActivityLifeRecycler: SecondActivity : onResume() ====
D/ActivityLifeRecycler: MainActivity: onStop() ====
D/ActivityLifeRecycler: MainActivity: onDestroy() ====
D/ActivityLifeRecycler: SecondActivity : onPause() ====
D/ActivityLifeRecycler: MainActivity: onCreate() ====
D/ActivityLifeRecycler: MainActivity: onStart() ====
D/ActivityLifeRecycler: 获取到的值为: 这是第二个界面返回的数据
D/ActivityLifeRecycler: MainActivity: onResume() ====
D/ActivityLifeRecycler: SecondActivity : onStop() ====
D/ActivityLifeRecycler: SecondActivity : onDestroy() ==== -
内存泄露问题,常见的导致内存泄露的原因
本质:长生命周期引用短生命周期
TimerTask
Handler
单例
线程
-
android性能调优
布局优化
内存优化
图片、Bitmap优化
-
除了Lru缓存算法,你还知道哪些缓存算法
一些缓存算法
由于缓存有一定得容量而需要淘汰一些缓存的对象,所以就出现了缓存对象的替代策略,这些替代的策略就是淘汰的算法;最优的方案是替代那些最没用的对象,但是我们并不能知道哪一个对象是最没用的,所以就没有这种算法,但是所有的缓存算法都是朝着这个方向去的。
- Least Frequently Used(LFU):删除最不常用的对象
- Least Recently Used(LRU):删除最近最少使用的对象
- Least Recently Used 2(LRU2): 把两次使用过的对象放入到缓存池,当缓存满时就会剔除到缓存中的两次最近最少使用的对象。
- Adaptive Replacement Cache(ARC):由两个LRU构成,第一个LRU包含了最近最常使用的一次对象,而第二个LRU则是最近最常使用两次的对象。
- First in First out(FIFO):先进先出算法,使用队列存储缓存,将最近最常使用的放到队列的后面,最少使用的放到队列的前面,当队列满时将移除队列前面的对象。
- ...
-
Handler相关
- Looper 死循环为什么不会导致应用卡死,会消耗大量资源吗?
- 主线程的消息循环机制是什么(死循环如何处理其它事务)?
- ActivityThread 的动力是什么?(ActivityThread执行Looper的线程是什么)
- Handler 是如何能够线程切换,发送Message的?(线程间通讯)
- 子线程有哪些更新UI的方法。
- 子线程中Toast,showDialog,的方法。(和子线程不能更新UI有关吗)
- 如何处理Handler 使用不当导致的内存泄露?
-
Bitmap加载过程中OOM了怎么办?回答了可以压缩图片,然后问具体怎么压缩?如果有一张很大size的图片需要加载到手机里怎么办?回答可以局部加载。
之前有一个朋友上传了一张4000 * 3000的图片,然后使用Glide加载到小米手机中,无奈Glide报出了OOM,在加载这张图片的时候会向系统申请一定得内存,而申请这个内存超出了系统能够给的大小,所以就出现了OOM, 为此,我给他提供了两种方案:
- 第一个是从加载入手,获取到图片流,然后再压缩一些Bitmap的分辨率大小和图片格式。
- 第二种是从上传开始,因为朋友和我说上传的图片需要给后台进行人脸识别的,所以需要分辨率高的,后面我分析到图片分辨率再高也不需要加载一张图片需要四五十兆的内存(400030004/1024/1024),所以我对他说和后台确认,之后才压缩到720的分辨率,加载图片内存足足少了几倍。
加载 大图可以局部加载,使用BitmapRegionDecoder
-
手写单例模式
懒汉式
饿汉式
线程安全 -
view的事件传递机制
-
EventBus的内部实现原理是什么?
-
Dalvik 与Art的区别
Dalvik 运行时编译,JIT方式(just in time ,JIT)
ART 预编译(AOT,Ahead-Of-Time)直接生成本地应用,安装时耗时
优点:
1、系统性能的显著提升。
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
3、更长的电池续航能力。
4、支持更低的硬件。
缺点:
1.机器码占用的存储空间更大,字节码变为机器码之后,可能会增加10%-20%(不过在应用包中,可执行的代码常常只是一部分。比如最新的 Google+ APK 是 28.3 MB,但是代码只有 6.9 MB。)
2.应用的安装时间会变长。
-
MVP如何管理Presenter的生命周期,何时取消网络请求
-
反射慢的原因在哪?
getMethod() 与 getDeclaredMethod() 方法比invoke() 方法耗时
-
Retrofit原理
Retrofit实现原理
动态代理
适配器转换生成Call对象
函数解析、网络请求、数据转换 -
Leakcanary实现原理
LeakCanary原理解析
在Activity的onDestroy() 方法中获取到内存对象,HeapDump内存,然后根据ReferenceQueue判断是否内存泄漏
网友评论