百度Android开发面试题
一、 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
DVM指dalivk的虚拟机。每个Android应用程序都在它本身的进程中运行,
都拥有一个独立的Dalvik虚拟机实例。而每个DVM都是在Linux 中的一个进
程,因此说能够认为是同一个概念。
二、sim卡的EF 文件有何做用
sim卡的文件系统有本身规范,主要是为了和手机通信,sim本
身能够有本身的操做系统,EF就是做存储并和手机通信用的
三、嵌入式操做系统内存管理有哪几种,各有何特性 ?
页式,段式,段页,用到了MMU,虚拟空间等技术
四、什么是嵌入式实时操做系统, Android 操做系统属于实时操做系统吗?
嵌入式实时操做系统是指当外界事件或数据产生时,可以接受并以足够快的速度
予以处理,其处理的结果又能在规定的时间以内来控制生产过程或对处理系统做
出快速响应,并控制全部实时任务协调一致运行的嵌入式操做系统。主要用于工
业控制、军事设备、
航空航天等领域对系统的响应时间有苛刻的要求,这就须要使用实时系统。又可
分为软实时和硬实时两种,而android是基于linux内核的,所以属于软实时。
五、一条最长的短信息约占多少byte?
中文70(包括标点),英文160个字节
六、 android中的动画有哪几类,它们的特色和区别是什么?
两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方
式可使视图组件移动、放大、缩小以及产生透明度的变化;另外一种Frame动画,
传统的动画方法,经过顺序的播放排列好的图片来实现,相似电影。
七、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。
八、说说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网站下吧。