《Android面试题(葵花宝典).docx》由会员分享,可在线阅读,更多相关《Android面试题(葵花宝典).docx(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Android面试题葵花宝典Android开发组 android的四大组件本质上就是为了实现移动或者说嵌入式设备上的 MVC架构,它们之间有时候是一种相互依存的关系,有时候又是一种 补充关系,引入广播机制可以便利几大组件的信息和数据交互。b:程序间互通消息(例如在自己的应用程序内监听系统来电)c:效率上(参考UDP的广播协议在局域网的便利性)d:设计模式上(反转限制的一种应用,类似监听者模式)21、 请谈一下Android系统的架构Android系统采纳了分层架构,从高层到低层分别是应用程序层、 应用程序框架层、系统运行库层和linux核心层22、 View, surfaceView, GLS
2、urfaceView 有什么 区分。view是最基础的,必需在UI主线程内更新画面,速度较慢。SurfaceView是view的子类,类似运用双缓机制,在新的线程中更新画面所以刷新界面速度比view快GLSurfaceView 是 SurfaceView 的子类,opengl 专用的23、 Adapter有什么作用常见的Adapter有哪些Adapter是连接后端数据和前端显示的适配器接口。常见的Adapter 有 ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCurs
3、orAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter,WrapperLi stAdapter 等24、Manifest. xml文件中主要包括哪些信息manifest:根节点,描述了 package中全部的内容。uses-permission:恳求你的package正常运作所需给予的平安 许可。permission:声明白平安许可来限制哪些程序能你package中 的组件和功能。instrumentation:声明白用来测试此package或其他package 指令组件的代码。application:包含package中ap
4、plication级别组件声明的根 节点。activity: Activity是用来与用户交互的主要工具。receiver: IntentReceiver 能使的 application 获得数据的变 更或者发生的操作,即使它当前不在运行。service: Service是能在后台运行随意时间的组件。provider: ContentProvider是用来管理长久化数据并发布给其 他应用程序运用的组件。25、 一条最长的短信息约占多少byte中文70(包括标点),英文160, 160个字节。26、如何启用Service,如何停用Service?1 .第一种是通过调用Context. start
5、Service()启动,调用 Context. stopService ()结束,startService ()可 以传递参数给 Service2 .其次种方式是通过调用Context. bindService ()启动,调用 Context, unbindservice ()结束, 还可以通过 ServiceConnection 访 问Service。在Service每一次的开启关闭过程中,只有onStart可 被多次调用(通过多次startService调用),其他onCreate, onBind, onUnbind, onDestory在一个生命周期中只能被调用一次。27、 注册广播有几
6、种方式,这些方式有何优缺点android中,不同进程之间传递信息要用到广播,可以有两种方 式来实现。第一种方式:在Manifest. xml中注册广播,是一种比较举荐的 方法,因为它不须要手动注销广播其次种方式,干脆在代码中实现,但须要手动注册注销注册的方法有两种,一种是静态注册,一种是动态注册。动态注册优点:在Android的广播机制中,动态注册的优先级 是要高于静态注册优先级的,因此在必要的状况下,我们是须要动态 注册广播接收器的。静态注册优点:动态注册广播接收器还有一个特点,就是当用来 注册的Activity关掉后,广播也就失效了。同时反映了静态注册的 一个优势,就是无需担忧广播接收器是
7、否被关闭,只要设备是开启状 态,广播接收器就是打开着的。28、 如何优化ListView29、 4种activity的启动模式standard:标准模式,一调用startActivity ()方法就会产生 一个新的实例。singleTop :假如已经有一个实例位于Activity栈的顶部时, 就不产生新的实例,而只是调用Activity中的newlnstance()方 法。假如不位于栈顶,会产生一个新的实例。singleTask :会在一个新的task中产生这个实例,以后每次 调用都会运用这个,不会去产生新的实例了。singlelnstance :这个跟singleTask基本上是一样,只有一
8、 个区分:在这个模式下的Activity实例所处的task中,只能有这 个activity实例,不能有其他的实例30、 android中线程与线程,进程与进程之间如何通信1、一个Android程序起先运行时,会单独启动一个Process。默认状况下,全部这个程序中的Activity或者Service都会 跑在这个Process 。默认状况下,一个Android程序也只有一个Process,但一个 Process下却可以有很多个Thread。2、一个Android程序起先运行时,就有一个主线程Main Thread被创建。该线程主要负责UI界面的显示、更新和控件交互, 所以又叫UI Thread
9、 。一个Android程序创建之初,一个Process呈现的是单线程模 型一即Main Thread ,全部的任务都在一个线程中运行。所以, Main Thread所调用的每一个函数,其耗时应当越短越好。而对于比 较费时的工作,应当设法交给子线程去做,以避开堵塞主线程(主线 程被堵塞,会导致程序假死 现象)。3、Android单线程模型:Android UI操作并不是线程平安 的并且这些操作必需在UI线程中执行。假如在子线程中干脆修改 UI ,会导致异样。31、 Android四大组件是什么?Android 四大基本组件分别是 Activity Service Content Provider
10、、 BroadcastReceivero1、Activity :应用程序中,一个Activity通常就是一个单独 的屏幕,它上面可以显示一些控件也可以监听并处理用户的事务做出 响应。Activity之间通过Intent进行通信。在Intent的描述结构 中,有两个最重要的部分:动作和动作对应的数据。2、Service, Service是android系统中的一种组件,它跟 Activity的级别差不多,但是他不能自己运行,只能后台运行,并 且可以和其他组件进行交互。Service是没有界面的长生命周期的代 码。Service是一种程序,它可以运行很长时间,但是它却没有用户 界面3、Conten
11、t Provider是Android供应的第三方应用数据的访问 方案。4、BroadcastReceive 广播接收器,在 Android 中,Broadcast 是 一种广泛运用的在应用程序之间传输信息的机制。而 BroadenstReceiver是对发送出来的Broadcast进行过滤接受并响 应的一类组件。可以运用BroadcastReceiver来让应用对一个外部 的事务做出响应。32、 Android中对View的更新有几种方式 多线程和双缓冲的运用 状况?Android中对View的更新有很多种方式,运用时要区分不同的 应用场合。最要紧的是分清:多线程和双缓冲的运用状况。1 .不运
12、用多线程和双缓冲:这种状况最简洁了,一般只是希望在 View发生变更时对UI进行重绘。你只需在Activity中显式地调用 View对象中的invalidate。方法即可。系统会自动调用View的 onDraw ()方法。2 .运用多线程和不运用双缓冲:这种状况须要开启新的线程,新开的线程就不好访问View对象了。3 .运用多线程和双缓冲:Android中SurfaceView是View的子 类,她同时也实现了双缓冲搜寻33、 Android多线程处理的机制Handler可以发送Messsage和Runnable对象到与其相关联的线 程的消息队列。每个Handler对象与创建它的线程相关联,并
13、且每个 Handler对象只能与一个线程相关联。Handler 一般有两种用途:1、执行安排任务,你可以再预定的 实现执行某些任务,可以模拟定时器。2、线程间通信。在Android 的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处 理各种消息。当你创建子线程时,你可以再你的子线程中拿到父线程 中创建的Handler对象,就可以通过该对象向父线程的消息队列发送 消息34、 Android dvm的进程和Linux的进程,应用程序的进程是否为同一个概念?DVM指dalivk的虚拟机。每一个Android应用程序都在它自己 的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个D
14、VM 都是在Linux中的一个进程,所以说可以认为是同一个概念。35如何退出Activity?对于单一 Activity的应用来说,退出很简洁,干脆finish。即 可。当然,也可以用killProcess()和System. exit ()这样的方法。 现供应几个方法,供参考:1、抛异样强制退出:该方法通过抛异样,使程序Force Close。 验证可以,但是,须要解决的问题是,如何使程序结束掉,而不弹出 Force Close 的窗口。2、记录打开的Activity:每打开一个Activity,就记录下来。 在须要退出时,关闭每一个Activity即可。3、发送特定广播:在须要结束应用时,
15、发送一个特定的广播, 每个Activity收到广播后,关闭即可。4、递归退出在打开新的 Activity 时运用 startActivityForResult,然后自己加标记,在 onActivityResult 中处理,递归关闭。除了第一个,都是想方法把每一个Activity都 结束掉,间接达到目的。但是这样做同样不完备。你会发觉,假如自 己的应用程序对每一个Activity都设置了 nosensor,在两个 Activity结束的间隙,sensor可能有效了。但至少,我们的目的达 到了,而且没有影响用户运用。为了编程便利,最好定义一个Activity 基类,处理这些共通问题36、 简要说说
16、AsyncTask在开发Android移动客户端的时候往往要运用多线程来进行操 作,我们通常会将耗时的操作放在单独的线程执行,避开其占用主线 程而给用户带来不好的用户体验。但是在子线程中无法去操作主线程 (UI线程),在子线程中操作UI线程会出现错误。因此android供 应了一个类Handler来在子线程中来更新UI线程,用发消息的机制 更新UI界面,呈现给用户。这样就解决了子线程更新UI的问题。但 是费时的任务操作总会启动一些匿名的子线程,太多的子线程给系统 带来巨大的负担,随之带来一些性能问题。因此android供应了一个 工具类AsyncTask,顾名思义异步执行任务。这个AsyncT
17、ask生来就 是处理一些后台的比较耗时的任务,给用户带来良好用户体验的,从 编程的语法上显得优雅了很多,不再须要子线程和Handler就可以完 成异步操作并且刷新用户界面1、请描述下Activity的生命周期Activity的生命周期与activity的活动状态亲密相关,也和 activity的周期函数亲密相关共有七个周期函数与生命周期执行依次如下:onCreate ()onStart ()onRestart ()onResume ()onPause ()onStop ()onDestroy ()2、假如后台的Activity由于某缘由被系统回收了,如何在被系统回 收之前保存当前状态当你的程序
18、中某一个Activity A在运行时,主动或被动地运行 另一个新的 Activity B,这个时候 A 会执行 onSaveInstanceState ()。 B完成以后又会来找A,这个时候就有两种状况:一是A被回收,二 是A没有被回收,被回收的A就要重新调用onCreate()方法,不同 于干脆启动的是这回onCreate ()里是带上了参数 savedlnstanceState;而没被收回的就干脆执行onResume (),跳过 onCreate () 了3、如何将一个Activity设置成窗口的样式在 AndroidManifest. xml 中定义 Activity 的地方一句话and
19、roid: theme=,android: style/Theme. Dialog”或android: theme=,android: style/Theme. Translucent”就变成半透亮的4、如何退出Activity如何平安退出已调用多个Activity的 Application对于单一 Activity的应用来说,退出很简洁,干脆finish。即 可。当然,也可以用killProcess ()和System, exit ()这样的方法。5、请介绍下Android中常用的五种布局在Android中,共有五种布局方式,分别是:FrameLayout (框架 布局),LinearLay
20、out (线性布局),AbsoluteLayout (肯定布局), RelativeLayout (相对布局),TableLayout (表格布局)。1、FrameLayout框架布局,放入其中的全部元素都被放置在最左 上的区域,而且无法为这些元素指定一个准确的位置,下一个子元素 会重叠覆盖上一个子元素,适合阅读单张图片。2、LinearLayout线性布局,是应用程序中最常用的布局方式, 主要供应控件水平或者垂直排列的模型,每个子组件都是以垂直或水 平的方式来定位.(默认是垂直)3、AbsoluteLayout肯定定位布局,采纳坐标轴的方式定位组件, 左上角是(0, 0)点,往右x轴递增,往
21、下Y轴递增,组件定位属性 为 android: layout_x 和 android: layout_y 来确定坐标。4、RelativeLayout相对布局,依据另外一个组件或是顶层父组 件来确定下一个组件的位置。和css里面的类似。5 TableLayout 表格布局,类似 Html 里的 Table.运用 TableRow 来布局,其中TableRow代表一行,TableRow的每一个视图组件代表 一个单元格。6、请介绍下Android的数据存储方式?1、SharedPreferences方式2、文件存储方式3、SQLite数据 库方式4、内容供应器(Content provider)方
22、式5、网络存储方 式7、请介绍下ContentProvider是如何实现数据共享的创建一个属于你自己的Content provider或者将你的数据添加 到一个已经存在的Content provider中,前提是有相同数据类型并 且有写入Content provider的权限8、android中的动画有哪几类,它们的特点和区分是什么两种,一种是Tween动画、还有一种是Frame动画。Tween动画, 这种实现方式可以使视图组件移动、放大、缩小以与产生透亮度的变 更;另一种Frame动画,传统的动画方法,通过依次的播放排列好的 图片来实现,类似电影。9、Handler机制的原理andriod供
23、应了 Handler和Looper来满意线程间的通信。 Handler先进先出原则。Looper类用来管理特定线程内对象之间的 消息交换(Message Exchange) o1 Looper: 一个线程可以产生一个Looper对象,由它来管理此 线程里的Message Queue (消息队列)。2、Handler:你可以构造Handler对象来与Looper沟通,以便 push 新消息到 Message Queue 里;或者接收 Looper 从 Message Queue 取出)所送来的消息。3、Message Queue(消息队列):用来存放线程放入的消息。4、线程:UI thread
24、通常就是 main thread,而 Android 启动 程序时会替它建立一个Message Queueo10、 如何让Activity变成一个窗口?只须要设置一下Activity的主题就可以了在 AndroidManifest. xml 中定义 Activity 的地方一句话,设置如下:android :theme=android:style/Theme. Dialognandroid: theme=, android: style/Theme. Dialog”11、 请说明下在单线程模型中MessageHandlerMessage QueueLooper之间的关系。简洁的说,Handle
25、r获得当前线程中的looper对象,looper用 来从存放 Message 的 MessageQueue 中取出 Message,再有 Handler 进行Message的分发和处理12、 AIDL的全称是什么如何工作能处理哪些类型的数据AIDL 全称 Android Interface Definition Language (AndRoid 接口描述语言)是一种借口描述语言。编译器可以通过aidl文件生 成一段代码,通过预先定义的接口达到两个进程内部通信进程跨界对 象访问的目的.AIDL的IPC的机制和COM或C0RBA类似,是基于接口 的,但它是轻量级的。它运用代理类在客户端和实现层间
26、传递值.假 如要运用AIDL,须要完成2件事情:L引入AIDL的相关类.;2.调 用aidl产生的class.理论上,参数可以传递基本数据类型和 String,还有就是Bundle的派生类,13、 请说明下Android程序运行时权限与文件系统权限的区分apk程序是运行在虚拟机上的,对应的是Android独特的权限机 制,只有体现到文件系统上时才运用linux的权限设置。android系 统有的权限是基于签名的14、 什么是ANR如何避开它ANR: Application Not Responding,五秒在 Android 中,活动 管理器和窗口管理器这两个系统服务负责监视应用程序的响应。当
27、出 现下列状况时,Android就会显示ANR对话框了:对输入事务(如按键、触摸屏事务)的响应超过5秒意向接受器 (intentReceiver)超过10秒钟仍未执行完毕Android应用程序完全 运行在一个独立的线程中(例如main) o这就意味着,任何在主线程 中运行的,须要消耗大量时间的操作都会引发ANR。因为此时,你的 应用程序已经没有机会去响应输入事务和意向广播(Intent broadcast) o因此,任何运行在主线程中的方法,都要尽可能的只做 少量的工作。特殊是活动生命周期中的重要方法如onCreateO和 onResume()等更应如此。潜在的比较耗时的操作,如访问网络和数据
28、 库;或者是开销很大的计算,比如变更位图的大小,须要在一个单独 的子线程中完成(或者是运用异步恳求,如数据库操作)。但这并不 意味着你的主线程须要进入堵塞状态已等待子线程结束一也不须 要调用Therad. wait ()或者Thread, sleep。方法。取而代之的是,主 线程为子线程供应一个句柄(Handler),让子线程在即将结束的时候 调用它。运用这种方法涉与你的应用程序,能够保证你的程序对输入 保持良好的响应,从而避开因为输入事务超过5秒钟不被处理而产生 的ANR。这种实践须要应用到全部显示用户界面的线程,因为他们都 面临着同样的超时问题。15 Android 中 Activity,
29、 Intent, Content Provider, Service 各有什么区分。Activity:活动,是最基本的android应用程序组件。一个活 动就是一个单独的屏幕,每一个活动都被实现为一个独立的类,并且 从活动基类继承而来。Intent:意图,描述应用想干什么。最重要的部分是动作和动 作对应的数据。Content Provider:内容供应器,android应用程序能够将它们 的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。 当你想将你的应用数据和其他应用共享时,内容供应器就可以发挥作 用了。Service:服务,具有一段较长生命周期且没有用户界面的程序。16、 I
30、ntentService 的好处?1、Acitivity的进程,当处理Intent的时候,会产生一个对应 的 Service2、Android的进程处理器现在会尽可能的不kill掉你17、 横竖屏切换时候activity的生命周期1、不设置 Activity 的 android:configChanges 时,切屏会重新 调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次2 、 设置 Activity 的 android:configChanges=orientationv 时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次3 、 设置 Activity 的 android:c
31、onfigChanges= orientation| keyboardHidden”时,切屏不会重新调用各个生命周期, 只会执行 onConf igurationChanged 方法18、 如何将SQLite数据库(dictionary, db文件)与apk文件一起 发布可以将dictionary, db文件复制到Eclipse Android工程中的 res aw书目中。全部在res aw书目中的文件不会被压缩,这样可以 干脆提取该书目中的文件。可以将dictionary, db文件复制到res aw 书目中19、 如何将打开res aw书目中的数据库文件在Android中不能干脆打开res
32、 aw书目中的数据库文件,而须 要在程序第一次启动时将该文件复制到手机内存或SD卡的某个书目 中,然后再打开该数据库文件。复制的基本方法是运用 getResources(). openRawResource 方法获得 res aw 书目中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的 书目中相应文件中。在 Android SDK中可以运用 SQLiteDatabase. openOrCreateDatabase 方法来打开随意书目中的 SQLite数据库文件20、Android引入广播机制的用意?a:从MVC的角度考虑(应用程序内)其实回答这个问题的时候还 可以这样问,android为什么要有那4大组件,现在的移动开发模型 基本上也是照搬的web那一套MVC架构,只不过 是改了点嫁妆而已。