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的推送原理是什么?

 

       client后台有消息接受的Service .  Google 提供推送的server。

客户单与server保持长连接的关系。

来接受推送的msg!  同一时候google的server

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

 

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

 

使用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: 是client与server之间的会话维持以及 数据的传递(保存数据)。

 

Cookie: client就收server传递过来的Http 头字段 Set-Cookie  来获取 server传递的信息。

client发送Http 请求的时候,传递自身存储的 server传递的Cookie  info。

 

内容的格式:

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

 

 

 

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

从本质上讲,它能够看作是你的身份证。

但Cookies不能作为代码运行。也不会传送病毒,且为你所专有,并仅仅能由提供它的server来读取。保存的信息片断以“名/值”对(name-value pairs)的形式储存,一个“名/值”对仅仅是一条命名的数据。一个站点仅仅能取得它放在你的电脑中的信息,它无法从其他的Cookies文件里取得信息。也无法得到你的电脑上的其他不论什么东西。 Cookies中的内容大多数经过了加密处理,因此一般用户看来仅仅是一些毫无意义的字母数字组合,仅仅有server的CGI处理程序才知道它们真正的含义。 因为Cookies是我们浏览的站点传输到用户计算机硬盘中的文本文件或内存中的数据,因此它在硬盘中存放的位置与使用的操作系统和浏览器密切相关。在Windows 9X系统计算机中,Cookies文件的存放位置为C:WindowsCookies,在Windows NT/2000/XP的计算机中,Cookies文件的存放位置为C:Documents and SettingsusernameCookies。 硬盘中的Cookies文件能够被Web浏览器读取。它的命令格式为:username@站点地址[数字].txt。如笔者计算机中的一个Cookies文件名称为:ch@163[1].txt。要注意的是:硬盘中的Cookies属于文本文件,不是程序。 特别想说明的是,另一个和cookie相似的文件,那就是session。它和cookie的作用差点儿是同样的。最大的差别是session是放在server端的,而cookie是在client的。全部知道cookie就应该知道session。

你能够再网上在搜索一下session的相关内容。

 

 

 

10. 怎样处理server返回的302, 307, 304 状态码?

 

302 307: 重定向:

 

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

307: 同上须要进行 Loaction字段的又一次连接。

 

304:Not Modified

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

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

client发送信息。服务端 检查信息是否改变。server返回 304 错误。

100 Continue

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

101 Switching Protocols

server将遵从客户的请求转换到第二种协议

200 OK

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

201 Created

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

202 Accepted

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

203 Non-Authoritative Information

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

204 No Content

没有新文档,浏览器应该继续显示原来的文档。

假设用户定期地刷新页面,而Servlet能够确定用户文档足够新,这个状态代码是非常实用的

205 Reset Content

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

206 Partial Content

客户发送了一个带有Range头的GET请求,server完毕了它

300 Multiple Choices

客户请求的文档能够在多个位置找到。这些位置已经在返回的文档内列出。

假设server要提出优先选择,则应该在Location应答头指明。

301 Moved Permanently

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

302 Found

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

303 See Other

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

304 Not Modified

client有缓冲的文档并发出了一个条件性的请求(通常是提供If-Modified-Since头表示客户仅仅想比指定日期更新的文档)。server告诉客户,原来缓冲的文档还能够继续使用。

305 Use Proxy

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

307 Temporary Redirect

和302(Found)同样。

很多浏览器会错误地响应302应答进行重定向,即使原来的请求是 POST,即使它实际上仅仅能在POST请求的应答是303时才干重定向。因为这个原因。HTTP 1.1新增了307,以便更加清除地区分几个状态代码: 当出现303应答时,浏览器能够尾随重定向的GET和POST请求。假设是307应答,则浏览器仅仅能尾随对GET请求的重定向。

400 Bad Request

请求出现语法错误。

401 Unauthorized

客户试图未经授权訪问受password保护的页面。应答中会包括一个WWW-Authenticate头,浏览器据此显示username字/password对话框,然后在填写合适的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,表示客户必须先经过代理server的授权。

408 Request Timeout

在server许可的等待时间内,客户一直没有发出不论什么请求。客户能够在以后反复同一请求。

409 Conflict

通常和PUT请求有关。

因为请求和资源的当前状态相冲突。因此请求不能成功。

410 Gone

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

411 Length Required

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

412 Precondition Failed

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

413 Request Entity Too Large

目标文档的大小超过server当前愿意处理的大小。

假设server觉得自己可以稍后再处理该请求。则应该提供一个Retry-After头

414 Request URI Too Long

URI太长

416 Requested Range Not Satisfiable

server不能满足客户在请求中指定的Range头

500 Internal Server Error

server遇到了意料不到的情况。不能完毕客户的请求

501 Not Implemented

server不支持实现请求所须要的功能。比如,客户发出了一个server不支持的PUT请求

502 Bad Gateway

server作为网关或者代理时,为了完毕请求訪问下一个server,但该server返回了非法的应答

503 Service Unavailable

server因为维护或者负载过重未能应答。比如,Servlet可能在数据库连接池已满的情况下返回503。

server返回503时能够提供一个Retry-After头

504 Gateway Timeout

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

505 HTTP Version Not Supported

server不支持请求中所指明的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— 修饰符(keyword)假设一个类被声明为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

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

哈希表之所以可以实现依据keyword (典型的样例是一个字符串键值) 来获取记录, 是由于她在内部建立了记录存储位置 - 即内部数组中的索引號和keyword的一套相应关系 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 keyword声明)。另外。静态字段也是不会被序列化的。

 

 

 

 

原文地址:https://www.cnblogs.com/liguangsunls/p/6734495.html