百度面试题

来源:互联网 发布:手机读电子书软件 编辑:程序博客网 时间:2024/06/05 09:08
百度 Android 开发面试题
本文来自安卓航班网整理搜集
   www.apkway.com
  原文地址:http://www.apkway.com/forum.php?mod=viewthread&tid=2057
1、 Android dvm 的进程和 Linux 的进程, 应用程序的进程是否为同一个概念

DVM 指 dalivk 的虚拟机。

每一个 Android 应用程序都在它自己的进程中运行,
都拥有一个独立的 Dalvik 虚拟机实例。而每一个 DVM 都是在 Linux 中的一个进
程,所以说可以认为是同一个概念。


2、sim 卡的 EF 文件有何作用

sim 卡的文件系统有自己规范,主要是为了和手机通讯,sim 本
身可以有自己的操作系统,EF 就是作存储并和手机通讯用的


3、嵌入式操作系统内存管理有哪几种,各有何特性 ?

页式,段式,段页,用到了 MMU,虚拟空间等技术


4、什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?

嵌入式实时操作系统是指当外界事件或数据产生时,
能够接受并以足够快的速度
予以处理,
其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作
出快速响应,
并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工
业控制、军事设备、
航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可
分为软实时和硬实时两种,而 android 是基于 linux 内核的,因此属于软实时。


5、一条最长的短信息约占多少 byte?

中文 70(包括标点),英文 160 个字节


6、 android 中的动画有哪几类,它们的特点和区别是什么?

两种,一种是 Tween 动画、还有一种是 Frame 动画。Tween 动画,这种实现方
式可以使视图组件移动、
放大、
缩小以及产生透明度的变化;
另一种 Frame 动画,
传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。


7、handler 机制的原理

andriod 提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先
出原则。
Looper 类用来管理特定线程内对象之间的消息交换(Message Exchange)。
1)Looper: 一个线程可以产生一个 Looper 对象,由它来管理此线程里的
Message Queue(消息队列)。
2)
Handler: 你可以构造 Handler 对象来与 Looper 沟通,以便 push 新消息到
Message Queue 里;或者接收 Looper 从 Message Queue 取出)所送来的消息。
3) Message Queue(消息队列):用来存放线程放入的消息。
4)线程:UI thread 通常就是 main thread,而 Android 启动程序时会替它
建立一个 Message Queue。


8、说说 mvc 模式的原理,它在 android 中的运用

MVC(Model_view_contraller)” 模型_视图_控制器”。 MVC 应用程序总是由这
三个部分组成。Event(事件)导致 Controller 改变 Model 或 View,或者同时改
变两者。只要 Controller 改变了 Models 的数据或者属性,所有依赖的 View 都
会自动更新。类似的,只要 Controller 改变了 View,View 会
从潜在的 Model 中获取数据来刷新自己。
View 重绘和内存泄露的好像是面试经常问的问题
1. View 的刷新:
在需要刷新的地方,使用 handle.sendmessage 发送信息,然后在 handle 的
getmessage 里面执行 invaliate 或者 postinvaliate.
2. GC 内存泄露
出现情况:
1.数据库的 cursor 没有关闭
2.构造 adapter 时,没有使用缓存 contentview
衍生 listview 的优化问题-----减少创建 view 的对象,充分使用
contentview,可以使用一静态类来优化处理 getview 的过程/
3.Bitmap 对象不使用时采用 recycle()释放内存
4.activity 中的对象的生命周期大于 activity
调试方法: DDMS==> HEAPSZIE==>dataobject==>[Total Size]
还有其他问题,大家欢迎提出阿,可以是整体架构的,还有这个 Hal 层.
这篇文章会涉及到以下几个内容

Activity 的生命周期
二 让 Activity 变成一个窗口:Activity 属性设定
三 你后台的 Activity 被系统
回收怎么办:onSaveInstanceState

调用与被调用:我们的通信使者 - Intent
一 Activity 的生命周期
和其他手机 平台 的应用程序一样,Android 的应用程序的生命周期是被统
一掌控的,也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不
能改变它,只能学习并适应它。
简单地说一下为什么是这样:我们手机在运行
一个应用程序的时候,有可能打进来电话发进来短信,或者没有电了,这时候程
序都会被中断,
优先去服务电话的基本功能,
另外系统也不允许你占用太多资源,
至少要保证电话功能吧,所以资源不足的时候也就有可能被干掉。言归正传,
Activity 的基本生命周期如下代码所示:
Java 代码
public class MyActivity extends Activity
{
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
你自己写的 Activity 会按需要
重 载这些方法,onCreate 是免不了的,在一个 Activity 正常启动的过程中,
他们被调用的顺序是 onCreate -> onStart ->onResume, 在 Activity 被干掉的
时候顺序是 onPause -> onStop -> onDestroy ,这样就是一个完整的生命周期,
但是有人问了
,程序正运行着呢来电话了,这个程序咋办?中止了呗,如果中止的时候新出的
一个 Activity 是全屏的那么:onPause->onStop ,恢复的时候
onStart->onResume ,如果打断
这个应用程序的是一个 Theme 为 Translucent 或者 Dialog 的 Activity 那么只
是 onPause ,恢复
的时候 onResume 。
详细介绍一下这几个方法中系统在做什么以及我们应该做什么:
onCreate:
在这里创建界面,做一些数据的初始化工作
onStart:
到这一步变成用户可见不可交互的
onResume:
变成和用户可交互的,
(在 activity 栈系统通过栈的方式管理这些个 Activity
的最上面,运行完弹出栈,则回到上一个 Activity)
onPause:
到 这一步是可见但不可交互的,系统会停止动画等消耗 CPU 的事情从上文的描
述已经知道,应该在这里保存你的一些数据,因为这个时候你的程序的优先级降
低,
有可能被系统收回。
在这里保存的数据,
应该在 onResume 里读出来,
注意:
这个方法里做的事情时间要短,因为下一个 activity 不会等到这个方法完成才
启动
onstop:
变得不可见,被下一个 activity 覆盖了
onDestroy: 这是 activity 被干掉前最后一个被调用方法了,
可能是外面类调
用 finish 方法或者是系统为了节省空间将它暂时性的干掉,可以用
isFinishing()来判断它,如果你有一个 Progress Dialog 在线程中转动,请在
onDestroy 里把他 cancel 掉,不然等线程结束的时候,调用 Dialog 的 cancel
方法会抛异常的。
onPause,onstop, onDestroy,三种状态下 activity 都有可能被系统干掉为
了保证程序的正确性,你要在 onPause()里写上持久层操作的代码,将用户编辑
的内容都保存到存储介质上(一般 都是数据库)。实际工作中因为生命周期的
变化而带来的问题也很多,
比如你的应用程序起了新的线程在跑,
这时候中断了,
你还要去维护那个线程,是暂停还是杀 掉还是数据回滚,是吧?因为 Activity
可能被杀掉,
所以线程中使用的变量和一些界面元素就千万要注意了,一般我都
是采用 Android 的消息机制 [Handler,Message]来处理多线程和界面交互的问
题。这个我后面会讲一些,最近因为这些东西头已经很大了,等我理清思绪再跟
大家分享。

让 Activity 变成一个窗口:Activity 属性设定
讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东
西,那么很 简单你只需要设置一下 Activity 的主题就可以了在
AndroidManifest.xml 中定义 Activity 的地方一句话:
Xml 代码
android
:theme="@android:style/Theme.Dialog"
android:theme="@android:style/Theme.Dialog"
这就使你的应用程序变成对话框的形式弹出来了,或者
Xml 代码
android:theme="@android:style/Theme.Translucent"
android:theme="@android:style/Theme.Translucent"
就 变成半透明的,[友情提示-.-]类似的这种 activity 的属性可以在
android.R.styleable 类的 AndroidManifestActivity 方法中看到,
AndroidManifest.xml 中所有元素的属性的介绍都可以参考这个类
android.R.styleable
上面说的是属性名称,具体有什么值是在 android.R.style 中
可以看到,比如这个"@android:style/Theme.Dialog"就对应于
android.R.style.Theme_Dialog ,('_'换成'.' <--注意:这个是文章内容不是
笑脸)就可以用在描述文件
中了,找找类定义和描述文件中的对应关系就都明白了。

你后台的 Activity 被系统回收怎么办:onSaveInstanceState
当你的程序中某一个 Activity A 在运行时中,主动或被动地运行另一个新的
Activity B
这个时候 A 会执行
Java 代码
public
void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putLong("id", 1234567890);
}
public void
onSaveInstanceState(Bundle outState) {
B 完成以后又会来找 A, 这个时候就有两种情况,一种是 A 被回收,一种是没有
被回收,被回 收的 A 就要重新调用 onCreate()方法,不同于直接启动的是这
回 onCreate()里是带上参数 savedInstanceState,没被收回的就还是
onResume 就好了。
savedInstanceState 是一个 Bundle 对象,你基本上可以把他理解为系统帮你
维护的一个 Map 对象。 onCreate()里你可能会用到它,

如果正常启动 onCreate
就不会有它,所以用的时候要判断一下是否为空。
Java 代码
if(savedInstanceState !=null){
long id =savedInstanceState.getLong("id");
}
if(savedInstanceState !=null){
就像官方的 Notepad 教程
里的情况,你正在编辑某一个 note,突然被中断,那么就把这个 note 的 id 记
住,再起来的时候就可以根据这个 id 去把那个 note 取出来,程序就完整一些。
这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不
需要特殊记住什么,哦,
没准你需要记住滚动条的位置...

调用与被调用:我们的通信使者 Intent
要 说 Intent 了,Intent 就是这个这个意图,应用程序间 Intent 进行交流,打
个电话啦,来个电话啦都会发 Intent, 这个是 Android 架构的松耦合的精髓部
分,大大提高了组件的复用性,比如你要在你的应用程序中点击按钮,给某人打
电话,很简单啊,看下代码先:
Java 代码 :
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:"+ number));
startActivity(intent);
复制代码
扔出这样一个意图,系统看到了你的意图就唤醒了电话拨号程序,打出来电话。
什么读联系人,发短信啊,邮件啊,统统只需要扔出 intent 就好了,这个部分
设计地确实很好啊。
那 Intent 通过什么来告诉系统需要谁来接受他呢?
通常使用 Intent 有两种方法,第一种是直接说明需要哪一个类来接收代码如
下:
Java 代码
Intent intent = new Intent(this,MyActivity.class);
intent.getExtras().putString("id","1");
startActivity(intent);
Intent intent = new
Intent(this,MyActivity.class);intent.getExtras().putString("id","1");
tartActivity(intent);复制代码
第一种方式很明显,直接指定了 MyActivity 为接受者,并且传了一些数据给
MyActivity,在 MyActivity 里可以用 getIntent()来的到这个 intent 和数据。
第二种就需要先看一下 AndroidMenifest 中的 intentfilter 的配置了
Xml 代码
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:value="android.intent.action.EDIT" />
<action android:value="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<action android:value="android.intent.action.EDIT" />
<action android:value="android.intent.action.PICK" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
</intent-filter>
这里面配置用到了 action, data, category 这些东西,那么聪明的你一定想到
intent 里也会有这些东西,然后一匹配不就找到接收者了吗?
action 其实就是一个意图的字符串名称。
上 面这段 intent-filter 的配置文件说明了这个 Activity 可以接受不同的
Action,当然相应的程序逻辑也不一样咯,提一下那个 mimeType,他是在
ContentProvider 里定义的,你要是自己实现一个 ContentProvider 就知道了,
必须指定 mimeType 才能让数据被别人使用。
不知道原理说明白没,总结一句,就是你调用别的界面不是直接 new 那个界面,
而是通过扔出一个 intent,
让系统帮你去调用那个界面,
这样就多么松藕合啊,
而且符合了生命周期被系统管理的原则。
想知道 category 都有啥,Android 为你预先定制好的 action 都有啥等等,请
亲自访问官方链接 Intent
ps:想知道怎么调用系统应用程序的同学,可以仔细看一下你的 logcat,每次
运行一个程序的时候是不是有一些信息比如:
Starting activity: Intent
{action=android.intent.action.MAINcategories={android.intent.category
.LAUNCHER}flags=0x10200000comp={com.android.camera/com.android.camera
.GalleryPicker} }
再对照一下 Intent 的一些 set 方法,就知道怎么调用咯,希望你喜欢:)
一,listview 你是怎么优化的。
二,view 的刷新,之前说过
三,IPC 及原理
四,Android 多线程
五,Android 为什么要设计 4 大组件,他们之间的联系,不设计行不行(主要是
为了实现 MVC 模式,然而 java 中最难的模式也是这个,很少有产品能将这个模
式做得很好【Technicolor 的面试官问的这个】)
六,service 的周期,activity 的周期,谈下你对 Android 内部应用的了解,比
如他做电话,
以及联系人等等应用。
框架层有很多东西还是多看看,
熟悉 Android
怎么做的,不管你做应用程开发还是应用框架层开发很有好处的。
在就是你项目经验,突出你遇到什么难点,然后是怎么解决的!尽量将每个技术
点凸显出来,当然面试官有时候会为了体现你是否真正做过,他会问你,你在这
个应用中做那个模块,用了多少个类之类的问题。
偶尔有的面试官会问你,你用过 Android 自带的单元测试了没,怎么用的?
当然我面试过很多家单位,有的是做平板,手机,数字电视,有的是做出个 erp
之类的客户端等等,出于前面的三个,基本上都是将 Android 的全部改掉,如果
真正要做 Android 的话,大家要学的还很多。
总 之,一句话,什么样的面试官都有,去面试的时候要做好一切心理准备,不
管是技术还是基础都得扎实。
一个人的交谈能力也很重要,总之不是非常标准的
普通话, 最起码你说的得让别人听得懂,而且得把面试官讲得非常彻底,这样
你获得 offer 的机会更大,
谈工资也有优势~~当然曾经一家公司的面试官跟我说
过,技术 是不惜钱的,只要你有能力,多少钱他都请。
1.View 如何刷新?
2.DDMS 与 TraceView 的区别?
3.activity 被回收了怎么办?
4.在 Java 中如何引入 C 语言?
参考答案 :
1.View 可以调用 invalidate()和 postInvalidate()这两个方法刷新
2.DDMS 是一个程序执行查看器,在里面你可以看见线程和堆栈等信息,
TraceView 是程序性能分析器
3.activity 回收了,那就只有另起了
4.java 调用 C 语言程序,可以用 JNI 接口来实现
上面答案仅作参考,毕竟我个人能力也有限嘛,难免会回答错误,呵呵.....
解答:
1.View 受系统刷新(系统内部有个循环,监控事件、做业务处理、绘 UI),
可以用 postInvalidate()促使系统刷新。
2.(还真不知道)
3.请参照 Activity 生命周期,如果被系统 destroy 了,也就是说的回收,只
有从新 start 了
4.通过 JNI 调用。建议阅读《The Java Native InterfaceProgrammer's Guide
and Specification》,英文版的,从 sun 网站下吧。