面试注意点:
1.屏幕适配——图片放错目录会产生的问题吗?
简单说就是高密度(density)的系统去使用低密度目录下的图片资源时,会将图片长宽自动放大以去适应高密度的精度,当然图片占用的内存会更大。
所以如果能提各种dpi的对应资源那是最好,可以达到较好内存使用效果。如果提供的图片资源有限,那么图片资源应该尽量放在高密度文件夹下,这样可以节省图片的内存开支。
密度 建议尺寸 2:3:4:6:8
mipmap-mdpi 48 * 48
mipmap-hdpi 72 * 72
mipmap-xhdpi 96 * 96
mipmap-xxhdpi 144 * 144
mipmap-xxxhdpi 192 * 192
2.AIDL支持什么数据类型?AIDL的接口使用一个我们自己定义的类为参数(或者返回值),怎么定义?
AIDL支持基本数据类型,除此之外,AIDL还支持:CharSequence, List & Map(List和Map中的所有元素都必须是AIDL支持的数据类型、其他AIDL生成的接口或您声明的可打包类型。)
in、out & inout
问题:AIDL中的接口函数有时会使用in、out或者inout的参数修饰符,它们各表示什么意思?在什么情况下要使用呢?
in、out和inout表示数据的流向。大家可以把AIDL的客户端和服务端理解成两个进程(其实大多数情况也是这样才会使用AIDL),从客户端流向服务端用in表示,表示这个对象是从客户端中传递到服务端,在服务端修改这个对象不会对客户端输入的对象产生影响。
而out则表示,数据只能从服务端影响客户端,即客户端输入这个参数时,服务端并不能获取到客户端的具体实例中的数据,而是生成一个默认数据,但是服务端对这个默认数据的修改会影响到客户端的这个类对象实例发生相应的改变。
3.在子线程中能创建handler吗?
可以,但是要先调用 Looper.prepare(); 然后调用 Looper.loop(); 开启消息循环
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
//TODO 发送消息
Looper.loop();
}
}
注意:写在Looper.loop()之后的代码不会被执行,这个函数内部应该是一个死循环,当调用mHandler.getLooper().quit()后,loop才会中止,其后的代码才能得以运行。