偏简单部分:
1. Android dvm(Dalvik VM)的进程和Linux的进程,应用程序的进程是否为同一个概念?
DVM是Dalvik虚拟机。每一个Android应用程序都在自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个Dalvik虚拟机都是在Linux中的一个进程,所以说可以认为是同一个概念。
2、SIM卡的 EF 文件有何作用?
首先介绍下EF,SIM卡里德所有文件按树来组织:主文件MF(即Master File)、专用文件DF(Dedicated File)、基本文件EF(Elementary File)。
SIM卡的文件系统有自己的规范,主要是为了和手机通讯,SIM本身可以有自己的操作系统,EF就是作存储并和手机通讯用的。
3、嵌入式操作系统内存管理有哪几种,各有何特性?
页式,段式,段页,用到了MMU(CPU核和外部存储器之间对话实现是CPU内核通过MMU实现的),虚拟空间等技术。
4、什么是嵌入式实时操作系统,Android操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、军事设备、航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而Android是基于linux内核的,因此属于软实时。
5、一条最长的短信息约占多少byte?
中文70(包括标点),因为160个字节
6、Android中的动画有哪几类,他们的特点和区别是什么?
两种,一是Tween动画;二是Frame动画。Tween动画可以使试图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
7、handler机制的原理
Android提供了Handler和Looper来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的信息交换(Message Exchange)。
Looper:一个线程可以产生一个Looper对象,由他来管理此线程里的Message Queue(消息队列)。
Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出所送来的消息。
Message Queue(消息队列):用来存放线程放入的消息。
线程:UI thread通常就是main thread,而Android启动程序时会替他建立一个Message Queue。
8、说说MVC模式的原理,他在Android中的运用
MVC(Model、view、controller)模型、视图、控制器。MVC应用程序总是由这三个部分组成。Event(事件)导致Controller改变Model或View,或者同时改变两者。只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新。类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己。
View重绘和内存泄露
View重绘和内存泄露好像是面试经常问的问题。
1、View的刷新:在需要刷新的地方,使用handle.sendmessage发送消息,然后在handle的getmessage里面执行invaliate或者postinvaliate。
2、GC内存泄露
出现情况:数据库的cursor没有关闭。
构造adapter时,没有使用缓存contentview。衍生listview的优化问题:减少创建view的对象,充分使用contentview,可以使用一静态类来优化处理getview的过程。
Bitmap对象不使用时采用recycle()释放内存。
activity中的对象的生命周期大于activity。
Activity
1、activity的生命周期
你自己写的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】来处理多线程和界面交互的问题。
2、让Activity变成一个窗口:Activity属性设定
可用来实现一个漂浮在手机主界面的东西,只需要设置一下Activity的主题就可以了,在AndroidManifest.xml中定义Activity的地方加一句:android:theme="@android:style/Theme.Dialog"这就使你的程序变成对话框的形式弹出来。若想变成半透明的,则添加:android:theme="@android:style/Theme.Translucent"。
3、你后台的Activity被系统回收怎么办:onSaveInstanceState
当你的程序中某一个Activity A在运行时中,主动或被动地运行另一个新的Activity B 这个时候A会执行Java代码:
1 |
public void onSaveInstanceState(Bundle outState) { |
2 |
super .onSaveInstanceState(outState); |
3 |
outState.putLong( "id" , 1234567890 ); |
4 |
} |
savedInstanceState是一个Bundle对象,你基本上可以把它理解为系统帮你维护一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。
1 |
if (savedInstanceState != null ){ |
2 |
long id =savedInstanceState.getLong( "id" ); |
3 |
} |
Intent就是这个意图,应用程序间Intent进行交流。系统看到意图就会唤醒响应的程序。
Intent通过什么来告诉系统需要谁来接受自己,第一种方法是直接说明需要哪一个类来接收
1 |
Intent intent = new Intent( this ,MyActivity. class ); |
2 |
intent.getExtras().putString( "id" , "1" ); |
3 |
startActivity(intent); |
第二种就需要先看一下AndroidManifest中的intentfilter的配置。