Android面试题集


www.cmd100.com 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,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 中获取数据来刷新自己。 www.cmd100.com 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(); www.cmd100.com protected void onResume(); protected void onPause(); protected void onStop(); protected void onDestroy(); } 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 里读出来,注意:这个 www.cmd100.com 方法里做的事情时间要短,因为下一 个 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 ,('_'换成'.' <--注意: 这个是文章内容不是笑脸)就可以用在描述文件 中了,找找类定义和描述文件中的对应关 系就都明白了。 www.cmd100.com 三 你后台的 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) { super.onSaveInstanceState(outState); outState.putLong("id", 1234567890);} 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){ long id = savedInstanceState.getLong("id");} 就像官方的 Notepad 教程 里的情况,你正在编辑某一个 note,突然被中断,那么就 把这个 note 的 id 记住,再起来的时候就可以根据这个 id 去把那个 note 取出来,程序就完 整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不 需要特殊记住什么,哦, 没准你需要记住滚动条的位置... 四 调用与被调用:我们的通信使者 Intent 要说 Intent 了,Intent 就是这个这个意图 ,应用程序间 Intent 进行交流,打个电话啦, www.cmd100.com 来个 电话啦都会发 Intent, 这个是 Android 架构的松耦合的精髓部分,大大提高了组件的复 用性,比如你要在你的应用程序中点击按钮,给某人打电话,很简单啊,看下代码先: Java 代码 Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + number)); startActivity(intent); 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 代码 www.cmd100.com 这里面配置用到了 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 www.cmd100.com 的话,大家要学的还很多。 总之,一句话,什么样的面试官都有,去面试的时候要做好一切心理准备,不管是技 术还是基础都得扎实。一个人的交谈能力也很重要,总之不是非常标准的普通话,最起码 你说的得让别人听得懂,而且得把面试官讲得非常彻底,这样你获得 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 Interface Programmer's Guide and Specification》,英文版的,从 sun 网站下吧。
还剩7页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 20 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

姜天宇

贡献于2011-04-10

下载需要 20 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf