Android常见面试题2

87654321 贡献于2016-06-30

作者 admin  创建于2015-06-10 02:11:00   修改者admin  修改于2015-06-10 08:25:00字数5984

文档摘要:1、说说mvc模式的原理,它在android中的运用 android的官方建议应用程序的开发采用mvc模式。何谓mvc? mvc是model,view,controller的缩写,mvc包含三个部分: 1)模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。 2)视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一 可以看到的一层,接收用户的输入,显示处理结果。
关键词:

1、说说mvc模式的原理,它在android中的运用 android的官方建议应用程序的开发采用mvc模式。何谓mvc? mvc是model,view,controller的缩写,mvc包含三个部分: 1)模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。 2)视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一 可以看到的一层,接收用户的输入,显示处理结果。 3)控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的 部分,控制器更重要的一种导航功能,想用用户出发的相关事件,交给m哦得了处理。 android鼓励弱耦合和组件的重用,在android中mvc的具体体现如下: 1)视图层(view):一般采用xml文件进行界面的描述,使用的时候可以非常方便的引入,也可以 使用javascript+html等的方式作为view层,当然这里需要进行java和javascript之间的通 信, 幸运的是,android提供了它们之间非常方便的通信实现。 2)控制层(controller):android的控制层的重 任通常落在了众多的acitvity的肩上,这句话也就 暗含了不要在acitivity中写代码,要通过activity交割model业务逻辑层处理, 这样做的另外 一个原因是android中的acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易 被回收掉。 3)模型层(model):对数据库的操作、对网络等的操作都应该在model里面处理,当然对业务计算 等操作也是必须放在的该层的。 2.详细介绍一下这几个方法中系统在做什么以及我们应该做什么: onCreate: 在这里创建界面 ,做一些数据 的初始化工作 onStart: 到这一步变成用户可见不可交互 的 onResume: 变成和用户可交互 的,(在activity 栈系统通过栈的方式管理这些个 Activity的最上面,运行完弹出栈,则回到上一个Activity) onPause: 到这一步是可见但不可交互 的,系统会停止动画 等消耗CPU 的事情 从上文的描述已经知道,应该在这里保存你的一些数据,因为这个时候 你的程序的优先级降低,有可能被系统收回。在这里保存的数据,应该在 onResume里读出来,注意:这个方法里做的事情时间要短,因为下一 个activity不会等到这个方法完成才启动 onstop: 变得不可见 ,被下一个activity覆盖了 onDestroy: 这是activity被干掉前最后一个被调用方法了,可能是外面类调用finish方 法或者是系统为了节省空间将它暂时性的干掉,可以用isFinishing()来判 断它 3. 请介绍下Android中常用的五种布局。 1、 LinearLayout – 线性布局。 orientation – 容器内元素的排列方式。vertical: 子元素们垂直排列;horizontal: 子元素们水 平排列 gravity – 内容的排列形式。常用的有 top, bottom, left, right, center 等 2、 AbsoluteLayout – 绝对布局。 layout_x – x 坐标。以左上角为顶点 layout_y – y 坐标。以左上角为顶点 3、 TableLayout – 表格式布局 表格布局主要以行列的形式来管理子控件,其中每一行即一个TableRow对象,每个TableRow对象可以添加子控件,并且每加入一个空间即相当于添加了一列 4、 RelativeLayout – 相对布局。 layout_centerInParent – 将当前元素放置到其容器内的水平方向和垂直方向的中央位置(类似的 属性有 :layout_centerHorizontal, layout_alignParentLeft 等) layout_marginLeft – 设置当前元素相对于其容器的左侧边缘的距离 layout_below – 放置当前元素到指定的元素的下面 layout_alignRight – 当前元素与指定的元素右对齐 5、 FrameLayout – 层叠布局。以左上角为起点,将 FrameLayout 内的元素一层覆盖一层地显示, 在帧布局中,先添加的图片会被后添加的图片覆盖。 4.android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别. 1) DOM解析  优点: 1.XML树在内存中完整存储,因此可以直接修改其数据和结构. 2.可以通过该解析器随时访问XML树中的任何一个节点.  3.DOM解析器的API在使用上也相对比较简单. 缺点: 如果XML文档体积比较大时,将文档读入内存是非常消耗系统资源的. 使用场景:DOM 是用与平台和语言无关的方式表示 XML 文档的官方 W3C 标准.DOM 是以层次结构组织的节点的集合.这个层次结构允许开发人 员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能进行任何工作.DOM是基于对象层次结构的. 2) SAX解析 优点:SAX 对内存的要求比较低,因为它让开发人员自己来决定所要处理的标签.特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现. 缺点: 用SAX方式进行XML解析时,需要顺序执行,所以很难访问到同一文档中的不同数据.此外,在基于该方式的解析编码过程也相对复杂.使用场景: 对于含有数据量十分巨大,而又不用对文档的所有数据进行遍历或者分析的时候,使用该方法十分有效.该方法不用将整个文档读入内存,而只需读取到程序所需的文档标签处即可. 3)Xmlpull解析 android SDK提供了xmlpull api,xmlpull和sax类似,是基于流(stream)操作文件,然后根据节点事件回调开发者编写的处理程序.因为是基于流的处理,因此xmlpull和sax都比较节约内存资源,不会象dom那样要把所有节点以对橡树的形式展现在内存中.xmlpull比sax更简明,而且不需要扫描完整个流. 5 描述一下android的系统架构   Android的系统架构采用了分层架构的思想,如图1所示。从上层到底层共包括四层,分别是应用程序程序层、应用框架层、系统库和Android运行时和Linux内核。   每层功能简要介绍如下:   一 应用程序层   该层提供一些核心应用程序包,例如电子邮件、短信、日历、地图、浏览器和联系人管理等。同时,开发者可以利用Java语言设计和编写属于自己的应用程序,而这些程序与那些核心应用程序彼此平等、友好共处。   二 应用程序框架层 该层是Android应用开发的基础,开发人员大部分情况是在和她打交道。应用程序框架层包括活动管理器、窗口管理器、内容提供者、视图系统、包管理器、 电话管理器、资源管理器、位置管理器、通知管理器和XMPP服务十个部分。在Android平台上,开发人员可以完全访问核心应用程序所使用的API框 架。并且,任何一个应用程序都可以发布自身的功能模块,而其他应用程序则可以使用这些已发布的功能模块。基于这样的重用机制,用户就可以方便地替换平台本 身的各种应用程序组件。   三 系统库和Android运行时   系统库包括九个子系统,分别是图层管理、媒体库、SQLite、OpenGLEState、FreeType、WebKit、SGL、SSL和libc。 Android运行时包括核心库和Dalvik虚拟机,前者既兼容了大多数Java语言所需要调用的功能函数,又包括了Android的核心库,比如 android.os、android.net、android.media等等。后者是一种基于寄存器的java虚拟机,Dalvik虚拟机主要是完成对生命周期的管理、堆栈的管理、线程的管理、安全和异常的管理以及垃圾回收等重要功能。   四 Linux内核   Android核心系统服务依赖于Linux2.6内核,如安全性、内存管理、进程管理、网络协议栈和驱动模型。Linux内核也是作为硬件与软件栈的抽象层。驱动:显示驱动、摄像头驱动、键盘驱动、WiFi驱动、Audio驱动、flash内存驱动、Binder(IPC)驱动、电源管理等。 6. 如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态? 当你的程序中某一个Activity A 在运行时中,主动或被动地运行另一个新的Activity B  这个时候A会执行 public void onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);     outState.putLong("id", 1234567890); }    B 完成以后又会来找A, 这个时候就有两种情况,一种是A被回收,一种是没有被回收,被回 收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上参数savedInstanceState,没被收回的就还是onResume就好了。 savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会 用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下是否为空。 if(savedInstanceState != null){        long id = savedInstanceState.getLong("id");   }   就像官方的Notepad教程 里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整 一些。 7.详细谈谈android数据存储方式。 Android提供了5种方式存储数据: (1)使用SharedPreferences存储数据;它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。 (2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。 (3)SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。 (4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。 (5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。 8. Android中Activity, Intent, Content Provider, Service各有什么区别。 Activity: 活动,是最基本的android应用程序组件。一个活动就是一个用户可以操作的可视化用户界面,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。 Intent: 意图,描述应用想干什么。最重要的部分是动作和动作对应的数据。 Content Provider:内容提供器,android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。 Service:服务,具有一段较长生命周期且没有用户界面的程序组件。 9.View, surfaceView, GLSurfaceView有什么区别。 view是最基础的,必须在UI主线程内更新画面,速度较慢。 SurfaceView 是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快 GLSurfaceView 是SurfaceView的子类,opengl 专用的 10.根据自己的理解描述下Android数字签名。 (1)所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序 (2)Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证 (3)如果要正式发布一个Android程序,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。 (4)数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。 11. android:gravity与android:layout_gravity的区别 LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity。他们的区别在 于:android:gravity用于设置View组件的对齐方式,而android:layout_gravity用于设置Container组件的 对齐方式。 12. 注册广播接收者两种方式的区别,及优缺点 答:首先写一个类要继承BroadcastReceiver 第一种:在清单文件中声明,添加    第二种使用代码进行注册如: IntentFilterfilter =  newIntentFilter("android.provider.Telephony.SMS_RECEIVED"); IncomingSMSReceiverreceiver = new IncomgSMSReceiver(); registerReceiver(receiver.filter); 两种注册类型的区别是: 1)第一种是常驻型(静态注册),也就是说当应用程序关闭后,如果有信息广播来,程序也会被系统调用自动运行。 2)第二种不是常驻型广播(动态注册),也就是说广播跟随程序的生命周期。 注册的方法有两种,一种是静态注册,一种是动态注册。 动态注册优点:在 Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的,因此在必要的情况下,我们是需要动态注册广播接收器的。 静态注册优点:动态注册广播接收器还有一个特点,就是当用来注册的 Activity 关掉后,广播也就失效了。同时反映了静态注册的一个优势,就是无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档