Android面试宝典
- 格式:docx
- 大小:214.43 KB
- 文档页数:75
2011 Android面试宝典
1. Intent的几种有关Activity启动的方式有哪些,你了解每个含义吗?
FLAG_ACTIVITY_SINGLE_TOP如果目标Activity已经运行在栈顶,将不会再启动
= singleTop
FLAG_ACTIVITY_BROUGHT_TO_FRONT 、=singleTask
FLAG_ACTIVITY_MULTIPLE_TASK=singleInstance
FLAG_ACTIVITY_CLEAR_TOP、如果被启动的activity已经运行在当前 task,将不会再创建新的活动实例,位于其上的其它activity将会被关闭。
2. Activity和Task的启动模式有哪些? 每种含义是什么?
3. 通过Intent传递一些二进制数据的方法有哪些?
1). 使用Serializable接口实现序列化,这是Java常用的方法。
2). 实现Parcelable接口,这里Android的部分类比如Bitmap类就已经实现了,同时Parcelable在Android AIDL中交换数据也很常见的。
4. 能说下Android应用的入口点吗?
真正的Android入口点是application的main,你可以看下androidmanifest.xml的包含关系就清楚了。
5. Android都有哪些XML解析器,都熟练掌握吗?
这里SAX和DOM、XmlPull相信做过Web开发的都已经滚瓜烂熟了。 6. SQLite支持事务吗? 添加删除如何提高性能?
SQLite作为轻量级的数据库,比MySQL还小,但支持SQL语句查询,提高性能可以考虑通过优化的SQL查询语句方式处理。SQLITE默认就是打开事务的。
7. Android Service和Binder、AIDL你都熟练吗?
Binder是Android系统进程间通信(IPC)方式之一。Binder使用Client-Server通信方式:一个进程作为Server提供诸如视频/音频解码,视频捕获,地址本查询,网络连接等服务;多个进程作为Client向Server发起服务请求,获得所需要的服务。要想实现Client-Server通信据必须实现以下两点:一是server 必须有确定的访问接入点或者说地址来接受Client的请求,并且Client可以通过某种途径获知Server的地址;二是制定Command- Reply协议来传输数据。例如在网络通信中Server的访问接入点就是Server主机的IP地址+端口号,传输协议为TCP协议。对Binder而言,Binder可以看成Server提供的实现某个特定服务的访问接入点, Client通过这个‘地址’向Server发送请求来使用该服务;对Client而言,Binder可以看成是通向Server的管道入口,要想和某个 Server通信首先必须建立这个管道并获得管道入口。Binder框架定义了四个角色:Server,Client,ServiceManager(以后简称SMgr)以及驱动。其中 Server,Client,SMgr运行于用户空间,驱动运行于内核空间。由于Android的Java层级只是一个外壳框架而已,大部分的系统组件(Android本身)都是在Nataive层(又称C/C++层)执行。这是Android的整体架构,所以我们的应用程序也必须考虑分为两层的必要性,才能完全的融入Android的整体架构里。我们看到的Android应用架构(Application
Framework)其实只是Android整体架构里的外壳结构而已。Android应用框架就如同椅子的椅面,那么椅子的椅腿在哪里呢?Binder系统是在Native层的C/C++组件。Java应用程序(如Activity体系等)是透过JNI界面去呼叫Binder系统(或称为组件)。
AIDL:在Android中, 每个应用程序都可以有自己的进程. 在写UI应用的时候, 经常要用到Service. 在不同的进程中, 怎样传递对象呢? 显然, Java中不允许跨进程内存共享. 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的.
在J2EE中,采用RMI的方式, 可以通过序列化传递对象. 在Android中, 则采用AIDL的方式. 理论上AIDL可以传递Bundle,实际上做起来却比较麻烦.
AIDL(AndRoid接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要在一个Activity中, 访问另一个Service中的某个对象, 需要先将对象转化成AIDL可识别的参数(可能是多个参数),
然后使用AIDL来传递这些参数, 在消息的接收端, 使用这些参数组装成自己需要的对象.
AIDL的IPC的机制和COM或CORBA类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用AIDL, 需要完成2件事情: 1. 引入AIDL的相关类.; 2. 调用aidl产生的class.
8. 你用过哪款Android手机,有哪些优点和不足,相对于iPhone或Symbian又有哪些优缺点?
9. 请描述下Activity的生命周期。
创建 oncreate - 启动onstart – 恢复 onResume – 暂停 onPause – 结束 onStop –
重启 onRestart 销毁onDestroy
10. 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
onSaveInstanceState
当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B 这个时候A会执行
Java代码
1. public
2. void onSaveInstanceState(Bundle outState) {
3. super.onSaveInstanceState(outState);
4. outState.putLong("id", 1234567890);
5. }
11. 如何将一个Activity设置成窗口的样式。
设置Theme。
Theme.NoTitleBar
Theme.NoTitleBar.Fullscreen
android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar"> this.requestWindowFeature(Window.FEATURE_NO_TITLE); 讲点轻松的吧,可能有人希望做出来的应用程序是一个漂浮在手机主界面的东西,那么很 简单你只需要设置一下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 ,('_'换成'.' <--注意:这个是文章内容不是笑脸)就可以用在描述文件 中了,找找类定义和描述文件中的对应关系就都明白了。 12. 如何退出Activity?如何安全退出已调用多个Activity的Application? 使用单例模式创建一个Activity管理对象,该对象中有一个Activity容器(具体实现自己处理,使用LinkedList等)专门负责存储新开启的每一个Activity,并且容易理解、易于操作,非常不错!在每一个Activity中的onCreate方法里添加该Activity到MyApplication对象实例容器中。 13. 请介绍下Android中常用的五种布局。 线性布局LinearLayout, 相对布局 RelativeLayout 表单布局 TableLayout, 绝对布局AbsLayout(已淘汰) 帧布局FrameLayout 14. 请介绍下Android的数据存储方式。 数据库SQlite、Preference,文件,网络存储 15. 请介绍下ContentProvider是如何实现数据共享的。 1.继承至ContentProvider,实现其下的onCreate,getType,insert,update,delete,query几个方法 2.发布URI,之后就可以在其他应用程序组件里通过ContentResolver来存取Content Provider 3.android系统负责初始化所有的Content provider,不需要用户自己去创建。 * 实际上,content provider的用户都不可能直接访问到content provider实例,只能通过ContentResolver在中间代理。 * 如调用ContentResolver.insert(),传入uri,用调用指定的content provider的insert()。 * 数据模型Content provider展示数据类似一个单个数据库表。 *