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 代码
<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" />
www.cmd100.com
<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
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 网站下吧。

你可能感兴趣的:(android,ListView,面试,dialog,电话,嵌入式操作系统)