Android面试题总结强劲版三Word格式文档下载.docx
《Android面试题总结强劲版三Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Android面试题总结强劲版三Word格式文档下载.docx(10页珍藏版)》请在冰豆网上搜索。
没准你需要记住滚动条的位置...
27.如何退出Activity
对于单一Activity的应用来说,退出很简单,直接finish()即可。
当然,也可以用killProcess()和System.exit()这样的方法。
现提供几个方法,供参考:
1、抛异常强制退出:
该方法通过抛异常,使程序Force
Close。
验证可以,但是,需要解决的问题是,如何使程序结束掉,而不弹出Force
Close的窗口。
2、记录打开的Activity:
每打开一个Activity,就记录下来。
在需要退出时,关闭每一个Activity即可。
3、发送特定广播:
在需要结束应用时,发送一个特定的广播,每个Activity收到广播后,关闭即可。
4、递归退出在打开新的Activity时使用startActivityForResult,然后自己加标志,在onActivityResult中处理,递归关闭。
除了第一个,都是想办法把每一个Activity都结束掉,间接达到目的。
但是这样做同样不完美。
你会发现,如果自己的应用程序对每一个Activity都设置了nosensor,在两个Activity结束的间隙,sensor可能有效了。
但至少,我们的目的达到了,而且没有影响用户使用。
为了编程方便,最好定义一个Activity基类,处理这些共通问题。
28.请解释下在单线程模型中Message、Handler、Message
Queue、Looper之间的关系。
Message
Queue(消息队列):
用来存放通过Handler发布的消息,通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列
Handler:
可以发布或者处理一个消息或者操作一个Runnable,通过Handler发布消息,消息将只会发送到与它关联的消息队列,然也只能处理该消息队列中的消息
Looper:
是Handler和消息队列之间通讯桥梁,程序组件首先通过Handler把消息传递给Looper,Looper把消息放入队列。
Looper也把消息队列里的消息广播给所有的
Handler,Handler接受到消息后调用handleMessage进行处理
Message:
消息的类型,在Handler类中的handleMessage方法中得到单个的消息进行处理.
29.你如何评价Android系统?
优缺点。
答:
优点:
1、学习的开源性
2、软件兼容性比较好
3、软件发展迅速
4、界面布局好
缺点:
1、版本过多
2、先有软件少
3、商务性能差
30.谈谈android数据存储方式。
Android提供了5种方式存储数据:
(1)使用SharedPreferences存储数据;
它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。
只能在同一个包内使用,不能在不同的包之间使用。
(2)文件存储数据;
文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。
(3)SQLite数据库存储数据;
SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
(4)使用ContentProvider存储数据;
主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content
Provider的各种数据类型。
(5)网络存储数据;
通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。
31.
Android中Activity,
Intent,
Content
Provider,
Service各有什么区别。
Activity:
活动,是最基本的android应用程序组件。
一个活动就是一个单独的屏幕,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。
Intent:
意图,描述应用想干什么。
最重要的部分是动作和动作对应的数据。
Provider:
内容提供器,android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。
当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。
Service:
服务,具有一段较长生命周期且没有用户界面的程序。
32.View,
surfaceView,
GLSurfaceView有什么区别。
view是最基础的,必须在UI主线程内更新画面,速度较慢。
SurfaceView
是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快
GLSurfaceView
是SurfaceView的子类,opengl
专用的
33.Manifest.xml文件中主要包括哪些信息?
manifest:
根节点,描述了package中所有的内容。
uses-permission:
请求你的package正常运作所需赋予的安全许可。
permission:
声明了安全许可来限制哪些程序能你package中的组件和功能。
instrumentation:
声明了用来测试此package或其他package指令组件的代码。
application:
包含package中application级别组件声明的根节点。
activity:
Activity是用来与用户交互的主要工具。
receiver:
IntentReceiver能使的application获得数据的改变或者发生的操作,即使它当前不在运行。
service:
Service是能在后台运行任意时间的组件。
provider:
ContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件。
34.根据自己的理解描述下Android数字签名。
(1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
(2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
(3)如果要正式发布一个Android
,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
(4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。
如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。
35.
AIDL的全称是什么?
如何工作?
能处理哪些类型的数据?
AIDL全称Android
Interface
Definition
Language(AndRoid接口描述语言)是一种借口描述语言;
编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对象访问的目的.AIDL的IPC的机制和COM或CORBA类似,
是基于接口的,但它是轻量级的。
它使用代理类在客户端和实现层间传递值.
如果要使用AIDL,
需要完成2件事情:
1.
引入AIDL的相关类.;
2.
调用aidl产生的class.理论上,
参数可以传递基本数据类型和String,
还有就是Bundle的派生类,
不过在Eclipse中,目前的ADT不支持Bundle做为参数,
具体实现步骤如下:
1、创建AIDL文件,
在这个文件里面定义接口,
该接口定义了可供客户端访问的方法和属性。
2、编译AIDL文件,
用Ant的话,
可能需要手动,
使用Eclipse
plugin的话,可以根据adil文件自动生产java文件并编译,
不需要人为介入.
3、在Java文件中,
实现AIDL中定义的接口.
编译器会根据AIDL接口,
产生一个JAVA接口。
这个接口有一个名为Stub的内部抽象类,它继承扩展了接口并实现了远程调用需要的几个方法。
接下来就需要自己去实现自定义的几个接口了.
4、向客户端提供接口ITaskBinder,
如果写的是service,扩展该Service并重载onBind
()方法来返回一个实现上述接口的类的实例。
5、在服务器端回调客户端的函数.
前提是当客户端获取的IBinder接口的时候,要去注册回调函数,
只有这样,
服务器端才知道该调用那些函数
AIDL语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。
由于远程调用的需要,
这些参数和返回值并不是任何类型.下面是些AIDL支持的数据类型:
不需要import声明的简单Java编程语言类型(int,boolean等)
String,
CharSequence不需要特殊声明
3.
List,
Map和Parcelables类型,
这些类型内所包含的数据成员也只能是简单数据类型,
String等其他比支持的类型.
(另外:
我没尝试Parcelables,
在Eclipse+ADT下编译不过,
或许以后会有所支持).
实现接口时有几个原则:
.抛出的异常不要返回给调用者.
跨进程抛异常处理是不可取的.
.IPC调用是同步的。
如果你知道一个IPC服务需要超过几毫秒的时间才能完成地话,你应该避免在Activity的主线程中调用。
也就是IPC调用会挂起应用程序导致界面失去响应.
这种情况应该考虑单起一个线程来处理.
.不能在AIDL接口中声明静态属性。
IPC的调用步骤:
声明一个接口类型的变量,该接口类型在.aidl文件中定义。
实现ServiceConnection。
调用ApplicationContext.bindService(),并在ServiceConnection实现中进行传递.
4.
在ServiceConnection.onServiceConnected()实现中,你会接收一个IBinder实例(被调用的Service).
调用
YourInterfaceName.Stub.asInterface((IBinder)service)将参数转换为YourInterface类型。
5.
调用接口中定义的方法。
你总要检测到DeadObjectException异常,该异常在连接断开时被抛出。
它只会被远程方法抛出。
6.
断开连接,调用接口实例中的ApplicationContext.unbindService()
参考:
36.android:
gravity与android:
layout_gravity的区别
LinearLayout有两个非常相似的属性:
android:
layout_gravity。
他们的区别在
于:
gravity用于设置View组件的对齐方式,而android:
layout_gravity用于设置Container组件的
对齐方式。
举个例子,我们可以通过设置android:
gravity="
center"
来让EditText中的文字在EditText组件中居中显示;
同
时我们设置EditText的android:
layout_gravity="
right"
来让EditText组件在LinearLayout中居中
显示。
来实践以下:
正如我们所看到的,在EditText中,其中的文字已经居中显示了,而EditText组件自己也对齐到了LinearLayout的右侧。
[html]
viewplaincopyprint?
1.<
LinearLayout
2.
xmlns:
android="
3.
orientation="
vertical"
4.
layout_width="
fill_parent"
5.
layout_height="
>
6.
<
EditText
7.
wrap_content"
8.
9.
10.
text="
one"
11.
/>
12.<
/LinearLayout>
这两个属性也可以用于
Framlayout
Textview
等等,表示的意思大同小异
37.padding与margin的区别
padding填充的意思,指的是view中的content与view边缘的距离,类似文本中的indent
而margin表示的是view的左边缘与parent
view的左边缘的距离
margin一般用来描述控件间位置关系,而padding一般描述控件内容和控件的位置关系。
简单,padding是站在父
view的角度描述问题,它规定它里面的内容必须与这个父view边界的距离。
margin则是站在自己的角度描述问题,规定自己和其他(上下左右)的
view之间的距离,如果同一级只有一个view,那么它的效果基本上就和padding一样了。
例如我的XML
layout代码如下:
view
plaincopy
to
clipboardprint?
?
xml
version="
1.0"
encoding="
utf-8"
2.<
paddingLeft="
10dip"
paddingRight="
paddingTop="
paddingBottom="
11.<
TextView
12.
13.
14.
background="
#FF0000"
15.
@string/hello"
16.
50dip"
17.
18.
19.
20.
layout_marginBottom="
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.<
那么我会得到如下的效果,图上已经很明确的标出来区别咯。
38.
注册广播接收者两种方式的区别
现在我们就来实现一个简单的广播程序。
Android提供了两种注册广播接受者的形式,分别是在程序中动态注册和在xml中指定。
他们之间的区别就是作用
的范围不同,程序动态注册的接收者只在程序运行过程中有效,而在xml注册的接收者不管你的程序有没有启动有会起作用。
39.Dalvik基于JVM的改进
1.几个class变为一个dex,constant
pool,省内存
2.Zygote,copy-on-write
shared,省内存,省cpu,省电
3.基于寄存器的bytecode,省指令,省cpu,省电
4.Trace-based
JIT,省cpu,省电,省内存
40.android中有哪几种解析xml的类,官方推荐哪种?
以及它们的原理和区别.
Ø
DOM解析
优点:
1.XML树在内存中完整存储,因此可以直接修改其数据和结构.
2.可以通过该解析器随时访问XML树中的任何一个节点.
3.DOM解析器的API在使用上也相对比较简单.
缺点:
如果XML文档体积比较大时,将文档读入内存是非常消耗系统资源的.
使用场景:
DOM
是用与平台和语言无关的方式表示
XML
文档的官方
W3C
标准.DOM
是以层次结构组织的节点的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能进行任何工作.DOM是基于对象层次结构的.
SAX解析
SAX
对内存的要求比较低,因为它让开发人员自己来决定所要处理的标签.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX
这种扩展能力得到了更好的体现.
用SAX方式进行XML解析时,需要顺序执行,所以很难访问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂.
对于含有数据量十分巨大,而又不用对文档的所有数据进行遍历或者分析的时候,使用该方法十分有效.该方法不用将整个文档读入内存,而只需读取到程序所需的文档标签处即可.
Xmlpull解析
android
SDK提供了xmlpull
api,xmlpull和sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序.因为是基于流的处理,因此xmlpull和sax都比较节约内存资源,不会象dom那样要把所有节点以