首页 > 代码库 > Android ----------------- 面试题 整理 一

Android ----------------- 面试题 整理 一


 

1. XML的解析方式都有哪些? 每一种解析方式的执行流程?

设XML为:<a>a<b>bc<c>c1</c></b></a>

 

Dom  SAX Pull

 

2.<a>a<b>bc<c>c1</c></b></a> 以树的方式展现应该是什么样子的

 根节点 在上面

 子节点和文本在下面

 

 

3. 设现有3个Activity,A1, A2, A3,如何实现 A1 启动 A2, A2启动A3后,由A3进行返回操作,直接可以返回到 A1? 举出两种方式?

Inflate

1   A1 – 》  A2-》 A3     A2 finish()

         2   A2 不进回退站?(如何) A2 启动 A3 

 

3.2. 设现有3个Activity, A1, A2, A3,现由A1启动A2,并且由A2返回复杂数据给A1, A1接收到数据后,启动A3,并且传递相应的数据进行操作,应该如何实现?

startACTIVITYForRessult()

OnActivity Result()  ->>  A3    Intent Bundle 传值

 

 

4. 设现有应用程序 App1, App2, 其中App2是图书资源应用,App1是读者应用,App1要获取App2的图书数据,应该采用什么方式?能否通过App1删除App2种的图书数据?

A2  实现ContentProvider  提供增删改查,delete()

 

5. Android GCM的推送原理是什么?

 

       客户端后台有消息接受的Service .  Google提供推送的服务器。

客户单与服务器保持长连接的关系。来接受推送的msg! 同时google的服务器

提供后台管理接口。给特定的设备发送信息。

 

------------------------------------------------------------------------------------------------------------------------------------------------

 

使用GCM服务(Google Cloud Messaging)


    简介:Google推出的云消息服务,即第二代的C2DM。

 

优点:Google提供的服务、原生、简单,无需实现和部署服务端。

 

缺点:Android版本限制(必须大于2.2版本),该服务在国内不够稳定、需要用户绑定Google帐号,受限于Google。

 

 

6. 现有应用程序App2,使用数据库进行数据存储,新发布版本App1.1那么数据库应该如何处理?如何保存已有数据?

 

SqlLite onCreateonUpdate() update用于升级,可以进行数据和表的操作。

onUpgrade()采用调整表结构不修改数据的方式来完成数据的升级?

 

7. 现需要实现一闹铃软件,其闹铃定时功能需要如何实现?

 

         1自定义:  后台启动 service 验证当前的时间,从数据库中获取闹钟的设定时间, 进行时间匹配,

OK 播放一段声音。

 

         2Android: 系统提供的AlermManager  可以通过相关API的进行操作。

  

 

8. FrameLayout与RelativeLayout的区别是什么?都适应于哪些场景?

 

FrameLayout 层的概念:  起重工所有的子控件都是层叠的。

默认的情况下都是在左上角。

 

RelativeLayout  相对布局:

其中的所有子空间默认情况下都是在一层。

相对:控件之间有相对的关系进项控制。

默认的情况下都是在左上角。

                                                                适应场景:

                                                                           FrameLayout多个控件层叠在一起。例如图片上面加一个赞踩。

                                                                     RelativeLayout:  主要用于快速的对其控件的情况:例如: 一般的登陆界面。

 

 

RelativeLayout相对布局,就是里面的控件位置都可以用相对于谁在什么地方来指定;

Framelayout帧布局

就是先定义的控件会再后定义的控件下面;FrameLayout主要是在多层之间的布局,RelativeLayout则是在同层之间不同位置之间的布局。

 

 

 

9. Fragment的作用是什么?如何使用?

 

作用:

         界面内容的复用

 

如何:

         当软件中,多个界面或者一个界面中有多个部分相同是可以采用这个Fragment 封装。

当前,使用Fragment 提高了代码的重用性。

 

http://blog.csdn.net/yangdeli888/article/details/7842029

Fragment用来描述一些行为或一部分用户界面在一个Activity中,你可以合并多个fragment在一个单独的activity中建立多个UI面板,同时重用 fragment在多个activity.你可以认为fragment作为一个activity中的一节模块fragment有自己的生命周期,接收自己的输入事件,你可以添加或移除从运行中的activity.

一个fragment必须总是嵌入在一个activity中,同时fragment的生命周期受activity而影响。

Fragment存在于ActivityViewGroup

onCreate()
fragment创建时被调用,你应该初始化一些实用的组件,比如在fragment暂停或停止时需要恢复的

onCreateView()
当系统调用fragment在首次绘制用户界面时,如果画一个UI在你的fragment你必须返回一个View当然了你可以返回null代表这个fragment没有UI.

 

 

 

 

9. HTTP协议中Cookie标准是什么?有什么作用?

 

作用:

Cookie: 是客户端与服务器之间的会话维持以及 数据的传递(保存数据)。

 

Cookie: 客户端就收服务器传递过来的Http 头字段 Set-Cookie  来获取 服务器传递的信息。

客户端发送Http 请求的时候,传递自身存储的 服务器传递的Cookie  info。

 

内容的格式:

Name = value Path=/xxx  domain=.Baidu.com 

 

 

 

Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的硬盘读取数据的一种技术。Cookies是当你浏览某网站时,由Web服务器置于你硬盘上的一个非常小的文本文件,它可以记录你的用户ID、密码、浏览过的网页、停留的时间等信息。当你再次来到该网站时,网站通过读取Cookies,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。 

从本质上讲,它可以看作是你的身份证。但Cookies不能作为代码执行,也不会传送病毒,且为你所专有,并只能由提供它的服务器来读取。保存的信息片断以“名/值”对(name-value pairs)的形式储存,一个“名/值”对仅仅是一条命名的数据。一个网站只能取得它放在你的电脑中的信息,它无法从其它的Cookies文件中取得信息,也无法得到你的电脑上的其它任何东西。 

Cookies中的内容大多数经过了加密处理,因此一般用户看来只是一些毫无意义的字母数字组合,只有服务器的CGI处理程序才知道它们真正的含义。 

由于Cookies是我们浏览的网站传输到用户计算机硬盘中的文本文件或内存中的数据,因此它在硬盘中存放的位置与使用的操作系统和浏览器密切相关。在Windows 9X系统计算机中,Cookies文件的存放位置为C:WindowsCookies,在Windows NT/2000/XP的计算机中,Cookies文件的存放位置为C:Documents and Settings用户名Cookies。 

硬盘中的Cookies文件可以被Web浏览器读取,它的命令格式为:用户名@网站地址[数字].txt。如笔者计算机中的一个Cookies文件名为:ch@163[1].txt。要注意的是:硬盘中的Cookies属于文本文件,不是程序。 

特别想说明的是,还有一个和cookie相似的文件,那就是session,它和cookie的作用几乎是相同的,最大的区别是session是放在服务器端的,而cookie是在客户端的。所有知道cookie就应该知道session。你可以再网上在搜索一下session的相关内容。

 

 

 

10. 如何处理服务器返回的302, 307, 304 状态码?

 

302 307: 重定向:

 

302: 临时性(重定向) 网络请求的地址发生跳转。需要获取Http 头的Location 字段来进行重新连接。

307: 同上需要进行 Loaction字段的重新连接。

 

304:Not Modified

主要是针对 网络数据 缓存,服务器会为每一个资源定义一个ID标志。

以及上一次修改的时间标志。 客户端保存缓存是回保存这些字段。 当客户端发送请求时,

客户端发送信息。服务端 检查信息是否改变。服务器返回 304 错误。

100 Continue

初始的请求已经接受,客户应当继续发送请求的其余部分

101 Switching Protocols

服务器将遵从客户的请求转换到另外一种协议

200 OK

一切正常,对GET和POST请求的应答文档跟在后面

201 Created

服务器已经创建了文档,Location头给出了它的URL。

202 Accepted

已经接受请求,但处理尚未完成。

203 Non-Authoritative Information

文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝

204 No Content

没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的

205 Reset Content

没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容

206 Partial Content

客户发送了一个带有Range头的GET请求,服务器完成了它

300 Multiple Choices

客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。

301 Moved Permanently

客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。

302 Found

类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。

303 See Other

类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取

304 Not Modified

客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

305 Use Proxy

客户请求的文档应该通过Location头所指明的代理服务器提取

307 Temporary Redirect

和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是 POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码: 当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。

400 Bad Request

请求出现语法错误。

401 Unauthorized

客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。

403 Forbidden

资源不可用。

404 Not Found

无法找到指定位置的资源

405 Method Not Allowed

请求方法(GET、POST、HEAD、Delete、PUT、TRACE等)对指定的资源不适用。

406 Not Acceptable

指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容

407 Proxy Authentication Required

类似于401,表示客户必须先经过代理服务器的授权。

408 Request Timeout

在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。

409 Conflict

通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。

410 Gone

所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回410表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。

411 Length Required

服务器不能处理请求,除非客户发送一个Content-Length头。

412 Precondition Failed

请求头中指定的一些前提条件失败

413 Request Entity Too Large

目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头

414 Request URI Too Long

URI太长

416 Requested Range Not Satisfiable

服务器不能满足客户在请求中指定的Range头

500 Internal Server Error

服务器遇到了意料不到的情况,不能完成客户的请求

501 Not Implemented

服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求

502 Bad Gateway

服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答

503 Service Unavailable

服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头

504 Gateway Timeout

由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答

505 HTTP Version Not Supported

服务器不支持请求中所指明的HTTP版本

 

 

 

11. 对于ListView中每一个Item包含图片的情况,如何从网络进行加载?

 

1 Adaptert GetView()

2 先判断缓存中是否存在,没有的话开启线程,异步任务,Volley进行图片数据的下载。

3 更新UI  HandLerMessage   AsyncTask()   ViewHolder()

 

 

        对list的图片单独开一个队列进行下载,在activity中回调刷新adapter。adapter从本地取图片。

 

 

12. AsyncTask支持的范型参数代表什么意思?

 

AsyncTask<传进的参数类型,进度类型,返回数据的类型>

 

1.   AsyncTask的三个泛型参数说明(三个参数可以是任何类型) 

2.      第一个参数:传入doInBackground()方法的参数类型   

3.      第二个参数:传入onProgressUpdate()方法的参数类型 

4.      第三个参数:传入onPostExecute()方法的参数类型,也是doInBackground()方法返回的类型

 

13. AsyncTask 哪些部分运行于主线程?如何通过AsyncTask更新UI信息?能否通过代码控制AsyncTask的停止

 

主线程:

onPostExecute()

onPreExecute(),

onProgressUpdate(Progress...),

 

子线程:

         doInBackground()

___________________________________________________________________________________s

能否通过代码控制AsyncTask的停止:

 

final boolean

cancel(boolean mayInterruptIfRunning)

 

 

-------------------------------------------------------------------------------------------------------------------------------------------------

AsyncTask的执行分为四个步骤,每一步都对应一个回调方法,开发者需要实现这些方法。

  * 1) 继承AsyncTask
   * 2) 实现AsyncTask中定义的下面一个或几个方法
       * onPreExecute(),
该方法将在执行实际的后台操作前被UI线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
       * doInBackground(Params...),
将在onPreExecute方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
      * onProgressUpdate(Progress...),
publishProgress方法被调用后,UI线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
      * onPostExecute(Result),
doInBackground执行完成后,onPostExecute方法将被UI线程调用,后台的计算结果将通过该方法传递到UI线程,并且在界面上展示给用户.

      * onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。

 

 

14.Handler, Message的作用是什么?举例使用场景?

 

主要用于先线程之间通信。子线程使用Handler发送message 给主线程,进行数据的更新。

        

         子线程完成数据的更新,使用Handler + Message来更新UI。

 

               Handler的使用主要是android中无法在主线程(即UI线程)中访问网络、无法在子线程中访问UI线程元素。
一般是在子线程中访问网络,然后使用Handler发送message通知主线程处理UI更新操作

 

15. 说明Android支持i18n的原理。

I18n 叫做国际化。软件在res/vales  以及 其他带有语言修饰符的文件夹。如: values-zh  这些文件夹中 提供

语言,样式,尺寸 xml资源。

Android 手机在启动软件的时候或者在显示layout界面的时候会根据当前手机设置的语言进行资源的匹配。

进行最佳的匹配。

例如:Android设置的中文,那么 android    启动软件的时候加载资源就是以 –zh结尾的、

文件夹,优先加载。 如果没有,就会加载默认的Values 文件。手机的适配性。

 

国际化。android i18nL10n提供了非常好的支持。android没有专门的API来提供国际化,而是通过对不同resource的命名来达到国际化,

同时这种命名方法还可用于对硬件的区分,如不同的新视屏用不同的图片。

 

17. Java语言中 final, finally 的区别?

final— 修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。将变量或方法声明为final,可以保证它们在使用中不被改变。被声明为final的变量必须在声明时给定初值,而在以后的引用中只能读取,不可修改。被声明为final的方法也同样只能使用,不能重载。 

finally—再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话)。 

 

17.2. Hashtable的存储原理是什么?假设有 Book类与Person类,并且一一对应,那么如果需要存储Key(Book)-Value(Person)的形式,Book类需要做什么处理?Person需要做什么处理。

 

         JavaAPI 的理解:

 

         HashTable HashMap都是采用Hash算法。

       针对 key的对象进行 HashCode()方法的计算。算出一个HashCode。利用 hashCOde来定位对象的存储位置。

可以根据位置进行存储和查找。当需要调用 put get remove 方法的时候,还需要进行 Key是否相同判断。 Key的对象,

必须要重写 Boolean equals(Object o);

       步骤:根据HashCode进行定位,再判定位的对象和传递的参数是否相等?相等的话,才进行操作。

 

       Book 必须重写 hashCode()  equals()两个方法。

    Person  对象添加是不能为空。 HashTable

-------------------------------------------------------------------------------------------------------------------------

哈希表之所以能够实现根据关键字 (典型的例子是一个字符串键值)来获取记录,是因为她在内部建立了记录存储位置 -即内部数组中的索引号和关键字的一套对应关系 f,因而在查找时,只需根据这个映射关系 f找到给定键值 K对应的数 f(K),就可直接从数组中取得目的数据 Hashtable[K] = Hashtable.InternalArray[f(K)],而不必对数组进行遍历和比较.这个对应关系 f我们称为哈希函数

 

18. 工厂模式与单例模式的描述与区别?

 

         单例模式:整个程序运行期间,只能创建一个对象实例。

                   主要用于内容的共享,共享数据。

 

         工厂模式:根据传递的参数 配置。 创建实例。

 

        

        

 

在工厂模式中,最重要的是满足面向对象设计中的多态原则,在应用程序中只需要创建一个工厂类的接口,然后调用该接口的生产产品的方法,但具体的实现却不用应用程序去考虑,他只要知道的是他使用的那个接口的方法一定可用就可以了!

再说说单例模式,也叫单件模式。其实这个模式我觉得是最简单的,只要满足两个基本条件就可以了:一是提供而且只提供一个全局的访问节点,二是保证不能产生多于一个的实例,即要进行实例控制,也就是对构造函数要进行控制。

单例模式是建立在简单工厂模式的基础之上的,而且他们都需要工厂方法有特殊的逻辑,以便实现循环使用产品的实例。

 

 

19. 适配器模式与监听者模式的区别?

 

         适配器: 数据 UI界面的桥梁。

                           可以利用适配器进行数据到Ui的转换。

 

       监听者模式:UI控件的事件处理过程中为外部代码提供一种可以监听事件发生的一种设计模式。一直在监听。例如数据抓包。

 

1)类适配器:

当客户在接口中定义了他期望的行为时,我们就可以应用适配器模式,提供一个实现该接口的类,并且扩展已有的类,通过创建子类来实现适配。

下面是类适配器的UML图:

2)对象适配器:

对象适配器通过组合除了满足用户期待接口还降低了代码间的不良耦合。在工作中推荐使用对象适配。下面是对象适配器的UML图:

3缺省适配器模式:

缺省适配器模式是一种特殊的适配器模式,但这个适配器是由一个抽象类实现的,并且在抽象类中要实现目标接口中所规定的所有方法,但很多方法的实现都是平庸的实现,也就是说,这些方法都是空方法。而具体的子类都要继承此抽象类。

监听者模式,即观察者模式。有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

 

20. Java中的序列化方式是什么?实现类 Book [title, author, price] 的多记录序列化?(说明两种方式,要求全部采用二进制格式存储为文件)。

 

Book 类实现:必须实现java.io.Serializable  然后采用ObjectOutputStream进行数据序列化操作,保存存数据。

DataOutputStream存数据。 自定义数据结构即可。

 

在序列化一个对象的时候,这个对象必须实现java.io.Serializable 接口, Serializable 接口中不含任何方法,这个可以理解为声明该对象是可以序列化的方法吧。当我们在序列化一个对象时,有些属性我们不想序列化(可以减少数据量),那么我们可以声明该属性为瞬间态(用transient 关键字声明)。另外,静态字段也是不会被序列化的。

 

 

 

 

Android ----------------- 面试题 整理 一