Android面试题 摘录

来源:互联网 发布:js pop方法 编辑:程序博客网 时间:2024/05/19 22:23

1、Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念? 

DVM指dalvik虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念。

2、sim卡的EF 文件有何作用 

SIM卡里的所有文件按树组织:
主文件MF(Master File)---每一块SIM卡只有唯一的一个主文件,其它所有文件都是这的子孙,主文件有文件头,里面存放着整个SIM卡的控制和管理信息。
专用文件DF(Dedicated File)---也是只有一个文件头,里面放着整个目录的管理控制信息,专用文件相当于一个目录的根。
基本文件EF(Elementary File)---既有文件头,也有文件体,文件头存放该文件的位置和控制信息,文件体存放着真正的数据,整个SIM卡中只有基本文件有文件体,也只有基本文件才用来存放数据。

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

(1)嵌入式操作系统内存管理机制: 
1、虚拟内存管理机制:
    有一些嵌入式处理器提供了MMU,在MMU具备内存地址映射和寻址功能,它使操作系统的内存管理更加方便。如果存在MMU ,操作系统会使用它完成从虚拟地址到物理地址的转换,所有的应用程序只需要使用虚拟地址寻址数据。这种使用虚拟地址寻址整个系统的主存和辅存的方式在现代操作系统中被称为虚拟内存。MMU 便是实现虚拟内存的必要条件。
    虚拟内存的管理方法使系统既可以运行体积比物理内存还要大的应用程序,也可以实现“按需调页”策略,既满足了程序的运行速度,又节约了物理内存空间。
    在L inux系统中,虚拟内存机制的实现实现为我们提供了一个典型的例子:在不同的体系结构下,使用了三级或者两级页式管理,利用MMU 完成从虚拟地址到物理地址之间的转换。基于虚拟内存管理的内存最大好处是:由于不同进程有自己单独的进程空间,十分有效的提高了系统可靠性和安全性。
2、非虚拟内存管理机制:
    在实时性要求比较高的情况下,很多嵌入式系统并不需要虚拟内存机制:因为虚拟内存机制会导致不确定性的 I/O阻塞时间,使得程序运行时间不可预期,这是实时嵌入式系统的致命缺陷;另外,从嵌入式处理器的成本考虑,大多采用不装配MMU 的嵌入式微处理器。所以大多嵌入式系统采用的是实存储器管理策略。因而对于内存的访问是直接的,它对地址的访问不需要经过MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际的物理地址;而且,大多数嵌入式操作系统对内存空间没有保护,各个进程实际上共享一个运行空间。一个进程在执行前,系统必须为它分配足够的连续地址空间,然后全部载入主存储器的连续空间。
    由此可见,嵌入式系统的开发人员不得不参与系统的内存管理。从编译内核开始,开发人员必须告诉系统这块开发板到底拥有多少内存;在开发应用程序时,必须考虑内存的分配情况并关注应用程序需要运行空间的大小。另外,由于采用实存储器管理策略,用户程序同内核以及其它用户程序在一个地址空间,程序开发时要保证不侵犯其它程序的地址空间,以使得程序不至于破坏系统的正常工作,或导致其它程序的运行异常;因而,嵌入式系统的开发人员对软件中的一些内存操作要格外小心。
 UCOS就是使用非虚拟内存管理的一个例子,在UCOS中,所有的任务共享所有的物理内存,任务之间没有内存保护机制,这样能够提高系统的相应时间,但是任务内存操作不当,会引起系统崩溃。
(2)嵌入式操作系统内存管理有页式,段式,段页,用到了MMU,虚拟空间等技术。 
(3)段式存储管理和页式存储管理的本质区别: 
  1.页式存储管理中的逻辑地址有页号和业内地址两部分组成,但作业仍然使用连续的逻辑地址,可把它看作是一维的(线性的)地址结构。用户没有分页的概念,操作系统把作业信息装入主存时才按照块长进行分页。
  2.段式存储管理中的逻辑地址有段号和段内地址两部分组成。他支持用户的分段,每段内的逻辑地址是连续的,而段与段之间的逻辑地址是不连续的。因此段式存储管理中的逻辑地址实际上是采用了二维的地址结构。

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

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

5、一条最长的短信息约占多少byte? 

中文70(包括标点),英文160,160个字节。


6、android中的动画有哪几类,它们的特点和区别是什么? 

两种,一种是Tween动画、还有一种是Frame动画。Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。

7、handler机制的原理

查看这篇文章:多线程编程 Handler、MessageQueue、Looper

8、说说mvc模式的原理,它在android中的运用 

查看这篇文章:ListView及MVC模式

9、Activity的生命周期 

查看这篇文章:Activity生命周期

10、让Activity变成一个窗口:Activity属性设定 

很简单你只需要设置 一下Activity的主题就可以了在AndroidManifest.xml 中定义 Activity的 地方一句话: 
 android :theme="@android:style/Theme.Dialog" 

11、你后台的Activity被系统回收怎么办:onSaveInstanceState 

查看这篇文章:Android开发之InstanceState详解

12、调用与被调用:我们的通信使者Intent 

那Intent通过什么来告诉系统需要谁来接受他呢? 

通常使用Intent有两种方法,第一种是直接说明需要哪一个类来接收代码如下: 

Intent intent = new Intent(this, MyActivity.class); 
intent.getExtras().putString("id", "1"); 
startActivity(intent); 

第一种方式很明显,直接指定了MyActivity为接受者,并且传了一些数据给MyActivity,在MyActivity里可以用getIntent()来的到这个intent和数据。

第二种就是在AndroidMenifest文件中注册intentfilter,进行配置:

<span style="font-family:Microsoft YaHei;"><span style="font-size:14px;">< 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> </span></span>

这里面配置用到了action, data, category这些东西,那么聪明的你一定想到intent里也会有这些东西,然后一匹配不就找到接收者了吗? 

action其实就是一个意图的字符串名称。上面这段intent-filter的配置文件说明了这个Activity可以接受不同的Action,当然相应的程序逻辑也不一样咯,提一下那个 mimeType,他是在ContentProvider里定义的,你要是自己实现一个ContentProvider就知道了,必须指定mimeType才能让数据被别人使用。 

总结一句,就是你调用别的界面不是直接new那个界面,而是通过扔出一个intent,让系统帮你去调用那个界面,这样就多么松藕合啊,而且符合了生命周期被系统管理的原则。 

更多用法,查看这篇文章:Intent应用详解

13、什么是ANR ,如何避免它? 

ANR(Application Not Responding),在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒.
如何避免ANR?
1. 运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。
2. IntentReceiver执行时间的特殊限制意味着它应该做:在后台里做小的、琐碎的工作如保存设定或者注册一个Notification。应用程序应该避免在BroadcastReceiver里做耗时的操作或计算.如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个Service。你也应该避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广播时需要向用户展示什么,你应该使用Notification Manager来实现。
一般来说,在应用程序里,100到200ms是用户能感知阻滞的时间阈值。如果你的应用程序为响应用户输入正在后台工作的话,可以显示工作的进度.以免用户认为应用程序被冻结了。

14、什么情况会导致Force Close ?如何避免?能否捕获导致其的异常? 

抛出运行时异常时就会导致Force Close,比如空指针、数组越界、类型转换异常等等。 
捕获:可以通过logcat查看抛出异常的代码出现的位置,然后到程序对应代码中进行修改。 
避免:编写程序时,要思维缜密,在可能出现异常的地方都作相应的处理,增强程序的健壮性。

15、Android本身的api并未声明会抛出异常,则其在运行时有无可能抛出runtime异常,你遇到过吗?若有的话会导致什么问题?如何解决? 

会。比如nullpointerException。我遇到过。比如空指针异常是最常见的异常,textView没有初始化时,却调用了其方法。
只要对null调用方法就会出现nullpointerException。会导致程序无法正常运行出现force close。可以打开控制台查看logcat信息,然后找到抛出异常信息的代码段并进行修改。

16、简要解释一下activity、 intent 、intent filter、service、Broadcase、BroadcaseReceiver 

答:一个activity呈现了一个用户可以操作的可视化用户界面  

  一个service不包含可见的用户界面,而是在后台无限地运行, 可以连接到一个正在运行的服务中,连接后,可以通过服务中暴露出来的接口与其进行通信 

  一个broadcast receiver是一个接收广播消息并作出回应的component,broadcast receiver没有界面  

  intent:content provider在接收到ContentResolver的请求时被激活。  

  activity, service和broadcast receiver是被称为intents的异步消息激活的。  

一个intent是一个Intent对象,它保存了消息的内容。对于activity和service来说,它指定了请求的操作名称和待操作数据的URI  

  Intent对象可以显式的指定一个目标component。如果这样的话,android会找到这个component(基于manifest文件中的声明)并激活它。但如果一个目标不是显式指定的,android必须找到响应intent的最佳component。  

 它是通过将Intent对象和目标的intent filter相比较来完成这一工作的。一个component的intent filter告诉android该component能处理的intent。intent filter也是在manifest文件中声明的。 

17、IntentService有何优点? 

答:IntentService 的好处 

  * Acitivity的进程,当处理Intent的时候,会产生一个对应的Service  

  * Android的进程处理器现在会尽可能的不kill掉你  

  * 非常容易使用 

18、横竖屏切换时候activity的生命周期? 

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次  

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次  

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法 

19. 如何将SQLite数据库(dictionary.db文件)与apk文件一起发布? 

解答:可以将dictionary.db文件复制到Eclipse Android工程中的/res/raw目录中。所有在/res/raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。

使用openDatabase方法来打开数据库文件,如果该文件不存在,系统会自动创建/sdcard/dictionary目录,并将res\raw目录中的 dictionary.db文件复制到/sdcard/dictionary目录中。

20. 如何将打开/res/raw目录中的数据库文件? 

解答:在Android中不能直接打开/res/raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得/res/raw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

代码参考:打开SQLite数据库

21. Android引入广播机制的用意? 

答:a:从MVC的角度考虑(应用程序内) 

其实回答这个问题的时候还可以这样问,android为什么要有那4大组件,现在的移动开发模型基本上也是照搬的web那一套MVC架构,只不过是改了点嫁妆而已。android的四大组件本质上就是为了实现移动或者说嵌入式设备上的MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种补充关系,引入广播机制可以方便几大组件的信息和数据交互。 

b:程序间互通消息(例如在自己的应用程序内监_听系统来电)
c:效率上(参考UDP的广播协议在局域网的方便性)
d:设计模式上(反转控制的一种应用,类似监_听者模式)

22.  如何退出Activity?如何安全退出已调用多个Activity的Application?

1.Activity.finish();

也可以用killProcess()和System.exit()这样的方法

2.用ActivityManager的restartPackage方法

23请介绍下android大众常用的五种布局。

FrameLayout(框架布局)---》只可以有一个控件,并且不能设计这个控件的位置,控件会放在左上角

LinearLayout(线性布局)---》当有很多控件需要在一个界面中列出时,可以用LinearLayout布局

AbsoluteLayout(绝对布局)---》可以放置多个控件,并且可以自己定义控件的x,y的位置

RelativeLayout(相对布局)---》相对其它控件的位置来设置布局

TableLayout(表格布局)---》将子元素的位置分配到行或列中,一个TableLayout由许多的TableRow组成

24. 请介绍下android的数据存储方式。
在实际开发中,Android提供了5种方式存储数据
  1. 文件存储数据----》
它通过FileInputStreamFileOutputStream对文件进行操作。但是在Android中,文件是一个应用程序私有的,一个应用程序无法读写其他应用程序的文件,如果要共享数据就用Content Providers
  2. 使用SharedPreferences存储数据----》用来存储”key-value paires”格式的数据,它是一个轻量级的键值存储机制,只可以存储基本数据类型,可以通过它保存一些上次用户所做的修改操作
  3. SQLite数据库存储数据----》
Android提供的一个标准的数据库,支持SQL语句
  4. 使用ContentProvider存储数据----》
是所有应用程序之间数据存储和检索的桥梁,它的作用是使得各个应用程序之间实现数据共享
  5. 网络存储数据---》
通过网络来存储和获取数据
25. 
请介绍下ContentProvider是如何实现数据共享的。

Android提供了ContentProvider,一个程序可以通过实现一个ContentProvider的抽象接口将自己的数据完全暴露出去,而且ContentProviders是以类似数据库中表的方式将数据暴露,也就是说ContentProvider就像一个“数据库”。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用URI来表示外界需要访问的“数据库”。外部访问通过ContentResolver去访问并操作这些被暴露的数据。

查看这篇文章:创建自己的ContentProvider
26.如何启用Service,如何停用Service

Intent intent = new Intent();

intent.setClass(this,cba.class);

startService(intent);

stopService(intent);

27. 注册广播有几种方式,这些方式有何优缺点?Android引入广播机制的用意。

 两种方式:

一种是在androidmainfest.xml中注册   
<receiver>
    <intent-filter>
   <action android:name = "android.intent.action.PICK"/>
    </intent-filter>
</receiver>
缺点:常驻型,占资源比较大
一种是在代码中动态注册:
registerReceiver(receiver,filter);  BroadcastReceiver更新UI一般用这种方法
查看这篇文章:BroadcastReceiver应用详解
28.  AIDL的全称是什么?如何工作?能处理哪些类型的数据?

AIDL的英文全称是Android Interface Define Language

当A进程要去调用B进程中的service时,并实现通信,我们通常都是通过AIDL来操作的。

 如何实现,查看这篇文章:Android进程间通信--Binder,AIDL,Parcelable

29. 请解释下Android程序运行时权限与文件系统权限的区别。

Android程序运行  是虚拟机Dalvik( android授权) 

  文件系统   是 linux 内核 授权  ,详细内容参考:Android权限机制总结与常见权限不足问题分析

30. 系统上安装了多种浏览器,能否指定某浏览器访问指定页面?

通过直接发送Uri把参数带过去,或者通过manifest里的intentfilter里的data属性
<span style="font-size:14px;"><span style="font-family:Microsoft YaHei;">Intent intent =newIntent();        intent.setAction("android.intent.action.VIEW");    Uri content_url =Uri.parse("http://www.163.com");   intent.setData(content_url);           intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");   startActivity(intent);</span></span>
31.有一个一维整型数组int[] data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%。

答:像素数组int[]data里就是一个个像素的颜色值,你循环和0xffffffff比较,如果相等,那么就把这个值换成0x88ffffff就行了,这样像素数组里所有的白色不透明(0xffffffff)都变成的半透明.



1. 谈谈Android的IPC机制

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

2.NDK是什么

NDK是一些列工具的集合,

NDK提供了一系列的工具,帮助开发者迅速的开发C/C++的动态库,并能自动将so和java 应用打成apk包。

NDK集成了交叉编译器,并提供了相应的mk文件和隔离cpu、平台等的差异,开发人员只需简单的修改mk文件就可以创建出so

3. 描述一下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应用程序使用框架的api并在框架下运行,这就带来了程序开发的高度一致性,另一方面也告诉我们,要想写出优质高效的程序就必须对整个 applicationframework进行非常深入的理解。精通applicationframework,你就可以真正的理解android的设计和运行机制,也就更能够驾驭整个应用层的开发。

4. Intent的几种有关Activity启动的方式有哪些
Intent的一些标记有FLAG_ACTIVITY_BROUGHT_TO_FRONT FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_CLEAR_WHEN_TASK_RESETFLAG_ACTIVITY_EXCLUDE_FROM_RECENTSFLAG_ACTIVITY_MULTIPLE_TASKFLAG_ACTIVITY_NEW_TASK 等。

5. ActivityTask的启动模式有哪些每种含义是什么?

4种,查看这篇文章:Activity的四种launchMode

 6. 通过Intent传递一些二进制数据的方法有哪些?

 1). 使用Serializable接口实现序列化,这是Java常用的方法。 

 2). 实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。


7.能说下Android应用的入口点吗?

  真正的Android入口点是application的main,你可以看下androidmanifest.xml的包含关系就清楚了。 可以没有Activity但是必须有Application。

8. android:paddingLeft与android:layout_marginLeft的区别

 当按钮分别设置以上两个属性时,得到的效果是不一样的。

android:paddingLeft="30px"   --》按钮上设置的内容(例如图片)离按钮左边边界30个像素

android:layout_marginLeft="30px"  ---》整个按钮离左边设置的内容30个像素




0 0