2013-4-19百度Android面试记

今天去百度奎科大厦面试了,和面试官聊的挺好的,总体而言对自己不是很满意,有几个问题答的不是很满意,其实也会,只不过当时那种情况下,有点紧张,然后就给忘了。

面试官倒是很nice,亲和力很强,挺喜欢这样的面试官。

切记:面试前把手机关机或者静音。今天我就忘了,我本来是想给面试官演示我们的程序的,谁想到今天上午来了2个电话,平时一个月也不来一个电话的,今天赶到一块了。大家千万注意啊。在这里想对面试官说一句:对不起,我知道面试来电话很不礼貌,我平时一个电话都没有的, 今天真不知怎么回事。

记录几个没回答好的问题吧。


1.当我们应用退出的时候会发生什么?

答案:我当时没太理解这个问题想问的点是什么,就回答了我们项目在退出这个函数中所作的一些事情,但是面试官似乎对这个答案不满意,但是我当时确实没明白。回来问了下同事,同事说了几点:

1)销毁当前的Activity

2)释放内存

3)进程仍然在后台驻留


2.View的事件分发机制

答案:这块我平时工作用的也比较少,加上当时紧张,给忘了。赶紧总结,其实不难,只不过用的确实有点少。

参看这篇文章:

http://blog.csdn.net/song_shi_chao/article/details/8839472


3.Bitmap在内存中的存储位置,对了,再查一下Bitmap再SDK 7 和12版本下,大小的计算方式,是不同的,工作中倒是遇到过,还特意查过很多资料呢,但是当时给忘了。

答案:补充于4-22号:今天又查了下资料,终于找到了这个答案:

AndroidAPP内存组成:

APP内存由dalvik内存和 native内存2部分组成,dalvik也就是 java堆,创建的对象就是在这里分配的,而native是通过 c/c++ 方式申请的内存,Bitmap就是以这种方式分配的(android3.0 以后,系统都默认是通过dalvik分配的,native作为堆来管理)。这2部分加起来不能超过 android 对单个进程、虚拟机的内存限制。

再具体点,实现上就需要从源码入手查了,这个要查。。。

TIPS: 编程要养成的习惯,不用的对象置null。其实更好是,不用的图片直接recycle。因为通过置null,让gc来回收,有时候还是会来不及。

For Android specific we should use the 'recycle' method rather than 'gc', because 'recycle' will free the memory at the same time, but calling 'gc' doesn't guaranty to run and free the memory for same time(if it is not too critical, we should not call gc in our code) and results can very every time.

One more thing using 'recycle' is faster than the 'gc' and it improves the performance.

xxx --- 这篇文章解释了Bitmap在android3.0之前和之后内存分配的区别:http://blog.csdn.net/chengyingzhilian/article/details/8662849

最后参考下这篇文章,对Bitmap是否需要recycle做了解释:http://blog.csdn.net/song_shi_chao/article/details/8838341



4.AsyncTask :上周的搜狗地图面试也遇到了这个问题,今天答的我感觉也不是很理想,面试官问我方法名都叫什么,我都没说出来,平时确实用自动补全太多了,也是个问题。两次犯同样的错误真是不应该的,今天无论如何,再看看这个。

class MyTask extends AsyncTask<String, Integer, String>{

@Override
protected String doInBackground(String... params) {
// 发送http网络请求或者耗时的IO操作
}

@Override
protected void onPreExecute() {
// 请求前的操作
}

@Override
protected void onPostExecute(String result) {
// UI线程的操作


}
}



5.适配的时候,我们适配mdpi,hdpi,xhdpi,为什么这样适配,这个答的不好。我觉得应该是根据屏幕的密度来计算的,这个稍后查一下。基础的东西,平时不注意。

答案:今天查这个查了好久,总是不明白,模模糊糊的,弄的和我很不爽,别人都走了, 我还在看,真可怜。。。总算总结了一下

简单来说:根据屏幕的密度来适配的,屏幕密度就4种,当时看官方文档,不是4种,只不过常见的是4种,看源码其实才3种,就120,160,240。



关于屏幕适配的Google的官方文档
零、Supporting Different Densities
http://developer.android.com/training/multiscreen/screendensities.html

Supporting Multiple Screens
http://developer.android.com/guide/practices/screens_support.html

一、获取状态栏高度:就是现实时间、电量、手机信号的那栏
decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayFrame方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。 
于是,我们就可以算出状态栏的高度了。
Rect rect= new Rect();  
this.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);  
int statusBarHeight = rect.top; //状态栏高度


二、获取标题栏高度:
getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view就是程序不包括标题栏的部分,然后就可以知道标题栏的高度了。
int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();  
//statusBarHeight是上面所求的状态栏的高度   
int titleBarHeight = contentTop - statusBarHeight;


三、用我的HTC ONE X测试了下,1280*720
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels;     // 屏幕宽度(像素)
int height = metric.heightPixels;   // 屏幕高度(像素)
float density = metric.density;      // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi;  // 屏幕密度DPI(120 / 160 / 240)

Logger.logger("tag", "width = " + width + " height = " + height + " density = " + density + " densityDpi = " + densityDpi);
// width = 720 height = 1280 density = 2.0 densityDpi = 320


四、dp和px之间的转化:万能公式:px = dp * density + 0.5f
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/ 
public static int dip2px(Context context, float dpValue) { 
final float scale = context.getResources().getDisplayMetrics().density; 
return (int) (dpValue * scale + 0.5f); 

 
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/ 
public static int px2dip(Context context, float pxValue) { 
final float scale = context.getResources().getDisplayMetrics().density; 
return (int) (pxValue / scale + 0.5f); 


比如:dip2px(this, 40) = 80;   
 px2dip(this, 40) = 20;


参考链接:
这个有点意思。。。
 http://www.iteye.com/topic/828830

http://mikewang.blog.51cto.com/3826268/865304

http://www.androidlearner.net/android-multi-screen-about.html


4-24号补充:

6.我们知道一个view有单击事件、长按事件,那么双击事件是如何实现的?或者说是如何判断的?

答案:这个我也没答上。现在也没想出来呢。。。稍等。。

刚才问了下同事,找到答案了。通过GestureDetector来实现双击事件。里面有一个方法可以区别出单击事件和双击事件、长按事件等。

http://blog.csdn.net/aben_2005/article/details/6417423


未完待续。。。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值