Android面试—基础知识

159 阅读4分钟

SharedPreferences

实现原理

是一个xml的文件存储,初始化的时候会去加载文件。
apply和commit,一个是异步写文件,一个同步写文件。

是不是线程安全

不安全,可以通过实现接口,自己处理线程安全相关的逻辑。

是不是进程安全的

虽然有MODE_MULTI_PROCESS,但是不支持实时数据更新,对于多进程的支持几乎为0。

Context

image.png

数字1:启动Activity在这些类中是可以的,但是需要创建一个新的task。一般情况不推荐。

数字2:在这些类中去layout inflate是合法的,但是会使用系统默认的主题样式,如果你自定义了某些样式可能不会被使用。

数字3:在receiver为null时允许,在4.2或以上的版本中,用于获取黏性广播的当前值。(可以无视)

Android的虚拟机

Dalvik

Android4.4及以前使用的都是Dalvik虚拟机,我们知道Apk在打包的过程中会先将java等源码通过javac编译成.class文件。
但是我们的Dalvik虚拟机只会执行.dex文件,这个时候dx会将.class文件转换成Dalvik虚拟机执行的.dex文件。
Dalvik虚拟机在启动的时候会先将.dex文件转换成快速运行的机器码,又因为65535这个问题,导致我们在应用冷启动的时候有一个合包的过程,最后导致的一个结果就是我们的app启动慢。
这就是Dalvik虚拟机的JIT特性(Just In Time)。

ART

ART虚拟机是在Android5.0才开始使用的Android虚拟机,ART虚拟机必须要兼容Dalvik虚拟机的特性。
但是ART有一个很好的特性AOT(ahead of time),这个特性就是我们在安装APK的时候就将dex直接处理成可直接供ART虚拟机使用的机器码,ART虚拟机将.dex文件转换成可直接运行的.oat文件。
ART虚拟机天生支持多dex,所以也不会有一个合包的过程,所以ART虚拟机会很大的提升APP冷启动速度。


ART优点:
加快APP冷启动速度
提升GC速度
提供功能全面的Debug特性

ART缺点:
APP安装速度慢,因为在APK安装的时候要生成可运行.oat文件
APK占用空间大,因为在APK安装的时候要生成可运行.oat文件

进程

进程的类型

前台进程
可见进程
服务进程
后台进程
空进程

怎么去创建一个多进程

android:process

多进程的好处是什么

1 不被轻易kill掉,如推送服务在自己的进程中运行,按返回键退出程序,推送服务还后台的自己进程中运行。

2 系统分配给一个进程的内存大小是固定的,如果你的程序特别消耗内存,那么就开启多进程模式来增加内存。

3 把程序中的某些组件放在单独进程中运行。

一般来说,使用多进程会造成如下方面问题:

1 静态成员和单利模式完全失效。

2 线程同步机制完全失效。

3 SharedPreferences的可靠性下降。//SharedPreferences不支持多个进程同时读/写操作

4 Application会多次创建。

进程间通信

20180729210742229.jpeg

其他

方法数限制的原理、及怎么解决

dex文件最多引用的方法数是65536个
google为了规避上述问题,推出了MultiDex解决方案解决方法数超限问题
配置Application——MultiDexApplication
需要注意主Dex和从Dex的问题,怎么把启动需要的类打到主Dex里面

Android序列化方式

Android中序列化与反序列化主要有两种方式:Serializable接口和Parcelable接口

Parcelable主要用在内存序列化上,效率更高。
Serializable是Java序列化接口,由于需要大量的I/O操作,将对象序列化到存储设备中或者序列化后通过网络传输,推荐用Serializable

安卓里有哪些ClassLoader,有用过pathClassLoader吗

BaseDexClassLoader,PathClassLoader 和 DexClassLoader
双亲委派机制
热修复的原理

一个bitmap加载到内存中的大小

屏幕密度,图片分辨率,图片色彩格式所占字节

RecyclerView的缓存机制

屏幕内缓存(n)
屏幕外缓存(2)
自定义缓存
缓存池(5)

image.png

RecyclerView优化

1.降低item的布局层次
2.去除冗余的setOnItemClick事件
3.复用pool缓存(RecyclerView嵌套)

AsyncTask原理

现在用的很少了,可以简单了解一下。

线程池+Handler

内部默认实现ASyncTask是串行的。