首页 > 代码库 > Android面试精华

Android面试精华

SIM卡的EF文件有什么作用?

SIM卡里的全部文件按树来组织:
主文件MF(Master File)——主文件仅仅有文件头,里面存放着整个SIM卡的控制和管理信息
专用文件DF(Dedicated File)——也是仅仅有一个文件头, 里面存放着整个文件夹的管理控制信息, 专用文件相当于一个文件夹的根.
基本文件EF(Elementary File)——既有文件头,也有文件体, 文件头存放该文件的位置和控制信息, 文件体存放真正的数据, 整个SIM卡中仅仅有基本文件有文件体, 也仅仅有基本文件才用来存放数据.

一条短信最长约占多少byte?
中文70(包含标点),英文160个字节

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,controller的缩写,mvc包括三个部分:
  模型(model)对象:是应用程序的主体部分。全部的业务逻辑都应该写在该层。


  视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一能够看到的一层。接收用户的输入,显示处理结果。
  控制器(control)对象:是依据用户的输入,控制用户界面数据显示及更新model对象状态的部分。控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。

在android中mvc的详细体现例如以下:
   1)视图层(view):一般採用xml文件进行界面的描写叙述,使用的时候能够很方便的引入。当然,怎样你对android了解的比較的多了话,就一定 能够想到在android中也能够使用javascript+html等的方式作为view层,当然这里须要进行java和javascript之间的通 信,幸运的是。android提供了它们之间很方便的通信实现。
  2)控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上。这句话也就暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外一个原因是android中的acitivity的响应时间是5s,假设耗时的操作放在这里。程序就非常easy被回收掉。
  3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算等操作也是必须放在的该层的。

怎样让Activity变成一个窗体?

在AndroidManifest.xml 中定义 Activity的属性:android :theme="@android:style/Theme.Dialog"

后台的Activity被系统回收怎么办?
当你的程序中某一个Activity A 在执行时中。主动或被动地执行还有一个新的Activity B 这个时候A会执行
public void onSaveInstanceState(Bundle outState) { 
   super.onSaveInstanceState(outState);
    outState.putLong("id", 123456);
}
B 完毕以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收。被回收的A就要又一次调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上參数savedInstanceState,没被收回的就还是onResume就好了.
if(savedInstanceState != null){ 
    long id = savedInstanceState.getLong("id");}

Intent的作用

怎样退出Activity?怎样安全退出已调用多个Activity的Application?
对于单一Activity的应用来说,退出非常easy,直接finish()就可以。


当然,也能够用killProcess()和System.exit()这个方案。



Android的数据存储方式
1、使用SharedPreferences存储数据。
2、文件存储数据。
3、SQLite数据库存储数据;
4、使用ContentProvider存储数据;
5、网络存储数据;

Android经常使用的布局
线性/相对/绝对/网格/表格/帧布局

Android的多屏幕适配
a.在manifest里定义你的程序支持的屏幕类型,对应代码例如以下:
<supports-screens android:resizeable=["true"| "false"]
android:smallScreens=["true" | "false"] //是否支持小屏
android:normalScreens=["true" | "false"] //是否支持中屏
android:largeScreens=["true" | "false"] //是否支持大屏
android:xlargeScreens=["true" | "false"] //是否支持超大屏
android:anyDensity=["true" | "false"] //是否支持多种不同密度的屏幕
android:requiresSmallestWidthDp=”integer”
android:compatibleWidthLimitDp=”integer”
android:largestWidthLimitDp=”integer”/>


b.对不同大小的屏幕提供不同的layout。
比方。假设须要对大小为large的屏幕提供支持。须要在res文件夹下新建一个文件夹layout-large/并提供layout。当然。也
能够在res文件夹下建立layout-port和layout-land两个文件夹,里面分别放置竖屏和横屏两种布局文件。以适应对横屏竖屏自己主动切换。



c.对不同密度的屏幕提供不同的图片。
应尽量使用点9格式的图片,如需对密度为low的屏幕提供合适的图片,需新建目录drawable-ldpi/。并放入合适大小的图片。相应的,medium相应drawable-mdpi /,high相应drawable-hdpi/,extra high相应drawable-xhdpi/。
图片大小的确定:low:medium:high:extra high比例为3:4:6:8。

举例来说。对于中等密度(medium)的屏幕你的图片像素大小为48×48,那么低密度(low)屏幕的图片大小应为36×36。高(high)的为72×72,extra high为96×96。


ContentProvider是怎样实现数据共享的?
一个程序能够通过实现一个Content provider的抽象接口将自己的数据全然暴露出去,并且Content providers是以类似数据库中表的方式将数据暴露。Content providers存储和检索数据,通过它能够让全部的应用程序訪问到。这也是应用程序之间唯一共享数据的方法。


要想使应用程序的数据公开化,可通过2种方法:创建一个属于你自己的Content provider或者将你的数据加入到一个已经存在的Content provider中,前提是有同样数据类型而且有写入Content provider的权限。


注冊广播有几种方式?有何优缺点?
静态注冊:常驻型,占资源比較大
动态注冊:优先级比較高,广播尾随程序的生命周期

有哪些方法能够实现前后台的数据交换,包含文字和图片?


有哪些方法实现消息的推送?

轮询 : 应用程序应当阶段性的与server进行连接并查询是否有新的消息到达。你必须自己实现与server之间的通信
SMS :(通过发送短信并解析短信内容来获取server端的指令),这个出现的问题是非常难找到免费的网关来发送短信
持久连接 : 主要是Socket通讯,这个攻克了性能问题。可是耗电问题依然没能解决

网络通信的方式
TCP/URL(URLConnection)/HTTP(HttpClient)/WebView/WebService

Activity启动模式
1. standard
模式启动模式。每次激活Activity时都会创建Activity,并放入任务栈中。

2. singleTop
假设在任务的栈顶正好存在该Activity的实例, 就重用该实例,否者就会创建新的实例并放入栈顶(即使栈中已经存在该Activity实例。仅仅要不在栈顶。都会创建实例)。

3. singleTask
假设在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。重用时,会让该实例回到栈顶,因此在它上面的实例将会被移除栈。

假设栈中不存在该实例,将会创建新的实例放入栈中。

4. singleInstance
在一个新栈中创建该Activity实例,并让多个应用共享改栈中的该Activity实例。

一旦改模式的Activity的实例存在于某个栈中。任何应用再激活改Activity时都会重用该栈中的实例,其效果相当于多个应用程序共享一个应用,无论谁激活该Activity都会进入同一个应用中。


NDK是什么
NDK是一些列工具的集合,
NDK提供了一系列的工具,帮助开发人员迅速的开发C/C++的动态库。并能自己主动将so和java 应用打成apk包。


NDK集成了交叉编译器,并提供了对应的mk文件和隔离cpu、平台等的差异。开发者仅仅需简单的改动mk文件就能够创建出so


描写叙述一下android的系统架构
android系统架构分从下往上为linux 内核层、执行库、应用程序框架层、和应用程序层

linuxkernel:负责硬件的驱动程序、网络、电源、系统安全以及内存管理等功能。


  libraries和 androidruntime:libraries:即c/c++函数库部分,大多数都是开放源码的函数库。比如webkit,该函数库负责 android网页浏览器的执行,比如标准的c函数库libc、openssl、sqlite等,当然也包含支持游戏开发2dsgl和 3dopengles,在多媒体方面有mediaframework框架来支持各种影音和图形文件的播放与显示,比如mpeg4、h.264、mp3、 aac、amr、jpg和png等众多的多媒体文件格式。android的runtime负责解释和执行生成的dalvik格式的字节码。

  applicationframework(应用软件架构)。java应用程序开发者主要是使用该层封装好的api进行高速开发。



   applications:该层是java的应用程序层,android内置的googlemaps、e-mail、即时通信工具、浏览器、mp3播放 器等处于该层。java开发者开发的程序也处于该层。并且和内置的应用程序具有平等的位置,能够调用内置的应用程序,也能够替换内置的应用程序。


谈谈Android的IPC机制
IPC是内部进程通信的简称, 是共享"命名管道"的资源。Android中的IPC机制是为了让Activity和Service之间能够随时的进行交互,故在Android中该机制。仅仅适用于Activity和Service之间的通信。类似于远程方法调用。类似于C/S模式的訪问。通过定义AIDL接口文件来定义IPC接口。Servier端实现IPC接口,Client端调用IPC接口本地代理。

java中怎样引用本地语言?
能够用JNI接口

DDMS和TraceView的差别?
DDMS是一个程序运行查看器。在里面能够看见线程和堆栈等信息,TraceView是程序性能分析器

android中的动画有哪几类。它们的特点和差别是什么?
  两种,一种是Tween动画、另一种是Frame动画。Tween动画,这样的实现方式能够使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。


 Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念
  DVM指dalivk的虚拟机。每个Android应用程序都在它自己的进程中执行,都拥有一个独立的Dalvik虚拟机实例。而每个DVM都是在Linux 中的一个进程,所以说能够觉得是同一个概念。

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

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

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


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



Activity的生命周期
  和其它手机 平台 的应用 程序 一样,Android的应用程序 的生命周期是被统一掌控 的。也就是说我们写的应用程序命运掌握在别人(系统)的手里,我们不能改变它,仅仅能学习 并适应它。简单地说一下为什么是这样:我们手机在执行 一个应用程序的时候,有可能打进来电话发进来短信 。或者没有电了,这时候程序都会被中断,优先去服务电话的基本功能 。另外系统也不同意你占用太多资源 。至少要保证电话功能吧,所以资源不足的时候也就有可能被干掉。


     在一个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]来处理多线程和界面交互的问题。



Android面试精华