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