面试题集Android必备Word文档格式.docx
《面试题集Android必备Word文档格式.docx》由会员分享,可在线阅读,更多相关《面试题集Android必备Word文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
(edittext),
文本显示区(textview),
3.Android
RunTime
Libraries
(Android系统运行库);
4.Liunx
Kernel
(Android
系统最底层核心系统Liunx)
2.Androiddvm的进程和Linux的进程,应用程序的进程是否为同一个概念?
DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念.
3.SIM卡的EF文件有何作用?
SIM卡的文件系统有自己规范,主要是为了和手机通讯,SIM卡本身可以有自己的操作系统,EF就是作存储并和手机通讯用的.
4.一条最长的短信息约占多少byte?
中文70(包括标点),英文160,160个字节.
5.Android中的动画有哪几类,它们的特点和区别是什么?
两种.一种是Tween动画.还有一种是Frame动画.
Tween动画,这种实现方式可以使视图组件移动.放大.缩小以及产生透明度的变化;
另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影.
6.什么是嵌入式实时操作系统,Android操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统.主要用于工业控制,军事设备,航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统.又可分为软实时和硬实时两种,而Android是基于linux内核的,因此属于软实时.
7.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.
8.嵌入式操作系统内存管理有哪几种,各有何特性?
页式,段式,段页,用到了MMU,虚拟空间等技术
9.说说mvc模式的原理,它在android中的运用
MVC(Model_view_contraller)”模型_视图_控制器”.MVC应用程序总是由这三个部
分组成.Event(事件)导致Controller改变Model或View,或者同时改变两者.只要Controller改变了Models的数据或者属性,所有依赖的View都会自动更新.类似的,只要Controller改变了View,View会从潜在的Model中获取数据来刷新自己.
10.Activity的生命周期,两个Activity之间跳转时必然会执行的是那几个方法?
onCreate()//在activity生命周期开始时被调用.
onRestoreInstanceState()//onCreate完成后被调用,用来恢复UI状态.
onRestart()//当activity从停止状态重新启动时调用.
onStart()//当activity对用户即将可见的时候调用.
onResume()//当activity与用户交互的时候,重绘屏幕.
onSaveInstanceState()//activity即将移出栈顶保留UI状态时调用此方法.
onPause()//当系统要启动一个其他的activity时调用(其他的activity显示之前,这个方法被用来提交那些持久数据的改变.停止动画.和其他占用CPU资源的东西.由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快.
onStop()//用户不再可见时调用
onDestroy//在activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况
1.完整生命周期:
即一个activity从出现到消失,对应的周期方法是从onCreate到onDestroy
2.可见生命周期:
从onStart()到onStop()方法,在这个周期中,用户可以看见Activity,但不一定能够与之交互,这两个方法可以随着状态的变化被执行多次.
3.前景生命周期:
从onResume()到onPause()方法,在这个周期中,Activity处在其它Activity之前,即在Activity栈的最顶端,负责与用户进行交互,伴随着状态的变化,这两个方法可以被执行多次
11.两个Activity之间跳转时必然会执行的是哪几个方法.
1.启动一个Activity
启动一个新的Activity需调用StartActivity(Intent
)函数.参数Intent
一个Intent对象,
若要在两个Activity之间进行跳转我们还得借助Intent类中另的外一个函数.
publicIntentsetClass(ContextpackageContext,Class<
?
>
cls)其返回值为一个Intent对象(即你要跳转到得Activity的Intent对象)
2.从一个Activity获取另外一个Activity中的数据结果
例如:
你在某个app
中点击了按键跳转到了另外一个Activity(此处我暂称为子Activity)中,在此Activity中你让用户选择联系人列表中的联系人,而在此Activity结束后需要在上层Activity(此处我暂称为父Activity)中需显示子Activity中返回的联系人名字.
要想做到上述功能,我们需做一下三件事
(a)在父Activity中调用StartActivityForResult(Intent
int
);
(b)在父Activity中实现OnActivityResult(intrequestCode,intresultCode,IntentDate)
参数分析:
requestCode:
此参数传个StartActivityForResult
为了确定是谁请求的.
resultCode:
此参数是SetReuslt(IntentDate)的返回值为Intent对象.
Date
:
Intent对象返回给调用者.
(c)在子Activity快要退出时调用SetReuslt(IntentDate)函数用于回调父Activity中的
OnActivityResult(intrequestCode,intresultCode,IntentDate)函数.
12.横竖屏切换时候Activity的生命周期.
1.不设置Activity的android:
configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2.设置Activity的android:
configChanges="
orientation"
时,切屏还是会重新调用各个生命周期,切横.竖屏时只会执行一次
3.设置Activity的android:
orientation|keyboardHidden"
时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
13.如何将一个Activity设置成窗口的样式.
1.在你的styles.xml文件中可以新建一如下的style:
<
stylename="
Theme.FloatActivity"
parent="
android:
style/Theme.Dialog"
!
--float_box为我们定义的窗口背景,这个不是必须的-->
itemname="
windowBackground"
@drawable/float_box<
/item>
/style>
如果窗口要添加窗口背景,可以在drawable中新建一个叫float_box.xml的文件,内容可以如下(自定义):
<
xmlversion="
1.0"
encoding="
utf-8"
shapexmlns:
android="
solidandroid:
color="
#ffffff"
/>
strokeandroid:
width="
3dp"
color="
#000000"
cornersandroid:
radius="
paddingandroid:
left="
10dp"
android:
top="
right="
bottom="
/shape>
2.在AndroidManifest.xml中在你需要显示为窗口的activity中添加如果属性:
theme="
@style/Theme.FloatActivity"
即可
如果说您觉得新建style.xml及float_box.xml文件的方式麻烦或者只想Test一下,那么可以直接添加您对应需要展示为Dialogstyle的Activity的android:
theme属性值为android:
@android:
.
14.如何退出Activity?
如何安全退出已调用多个Activity的Application?
对于单一Activity的应用来说,退出很简单,直接finish()即可.当然,也可以用killProcess()和System.exit()方法.
15.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
onSaveInstanceState()
当你的程序中某一个ActivityA在运行时,主动或被动地运行另一个新的ActivityB,这个时候A会执行onSaveInstanceState().B完成以后又会来找A,这个时候就有两种情况:
一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;
而没被收回的就直接执行onResume(),跳过onCreate()了.
16.两个Activity之间怎么传递数据?
邮递员Intent
17.怎么让在启动一个Activity是就启动一个service?
IntentService
18.同一个程序,但不同的Activity是否可以放在不同的Task任务栈中?
task就好像是能包含很多activity的栈.默认情况下,一个activity启动另外一个activity时,两个activity是放在同一个task栈中的,第二个activity压入第一个activity所在的task栈.当用户按下返回键时,第二个activity从栈中弹出,第一个activity又在当前屏幕显示.这样,从用户角度来看,这两个activity就好像是属于同一个应用程序的,即使第二个activity是属于另外一个应用程序的.当然,这是指默认情况下.task栈包含的是activity的对象.如果一个activity有多个实例在运行,那么栈中保存的是每个实例的实体.栈中的activity不会重新排列,只有弹出和压入操作.一个task中的所有activity都以整体的形式移动.整个task可以被移到前台或后台.打个比方,当前的task包含4个activity–当前activity下面有3个activity.当用户按下HOME键返回到程序启动器(applicationlauncher)后,选择了一个新的应用程序(事实上是一个新的task),当前的task就被转移到后台,新的task中的根activity将被显示在屏幕上.过了一段时间,用户按返回键回到了程序启动器界面,选择了之前运行的程序(之前的task).那个task,仍然包含着4个activity.当用户再次按下返回键时,屏幕不会显示之前留下的那个activity(之前的task的根activity),而显示当前activity从task栈中移出后栈顶的那个activity.刚刚描述的行为是默认的activity和task的行为.有很多方法能够改变这种行为.activity和task之间的联系,以及task中的activity的行为可以通过intent中的标记以及在manifest中的<
activity>
元素的属性控制.其中,主要的Intent标记有:
FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDEDFLAG_ACTIVITY_SINGLE_TOP
主要的<
属性有:
taskAffinitylaunchModeallowTaskReparenting
clearTaskOnLaunchalwaysRetainTaskStatefinishOnTaskLaunch
默认情况下,一个应用程序中的所有activity都有一个affinity–这让它们属性同一个task.然而,每个activity可以通过<
中的taskAffinity属性设置单独的affinity.不同应用程序中的activity可以共享同一个affinity,同一个应用程序中的不同activity也可以设置成不同的affinity.affinity属性决定了:
启动activity的Intent对象需包含FLAG_ACTIVITY_NEW_TASK标记,activity的allowTaskReparenting被认为是设置成true.
FLAG_ACTIVITY_NEW_TASK标记
当传递给startActivity()的Intent对象包含FLAG_ACTIVITY_NEW_TASK标记时,系统会为需要启动的activity寻找与当前activity不同的task.如果要启动的activity的affinity属性与当前所有的task的affinity属性都不相同,系统会新建一个带那个affinity属性的task,并将要启动的activity压到新建的task栈中;
否则将activity压入那个affinity属性相同的栈中.
allowTaskReparenting属性
如果一个activity的allowTaskReparenting属性为true,那么它可以从一个task(TASK1)移到另外一个有相同affinity的task(TASK2)中(TASK2带到前台时).
如果一个.apk文件从用户角度来看包含了多个“应用程序”,你可能需要对那些activity赋不同的affinity值.
运行模式
activity的launchMode属性可以有四种值:
“standard”(默认)“singleTop““singleTask”“singleInstance“
19.什么是Service以及描述下它的生命周期.
AndroidService是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序进程的上下文里.需要通过某一个Activity或者其他Context对象来调用,Context.startService()和Context.bindService().
如果在Service执行耗时的操作需要启动一个新线程来执行.
AndroidService只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时,先后调用了onCreate(),onStart()这两个方法,当停止Service时,则执行onDestroy()方法,这里需要注意的是,如果Service已经启动了,当我们再次启Service时,不会在执行onCreate()方法,而是直接执行onStart()方法.
启动一个Service的过程如下:
context.startService()|->
onCreate()->
onStart()->
Servicerunning其中onCreate()可以进行一些服务的初始化工作,onStart()则启动服务.
停止一个Service的过程如下:
context.stopService()|->
onDestroy()->
Servicestop
20.什么是IntentService?
有何优点?
优点:
Acitivity的进程,当处理Intent的时候,会产生一个对应的Service
Android的进程处理器现在会尽可能的不kill掉你.非常容易使用
日历中IntentService的应用
21.请描述一下Intent和IntentFilter.
Intent在Android中被翻译为"
意图"
熟语来讲就是目的,他们是三种应用程序基本组件—activity,service和broadcastreceiver之间互相激活的手段.在调用Intent名称时使用ComponentName也就是类的全名时为显示调用.例:
setComponent("
org.rickystudio.intentActivity"
)setClass("
) setClassName("
)这种方式一般用于应用程序的内部调用,因为你不一定会知道别人写的类的全名.那我们怎么调用呢?
有显就有隐嘛.我们来看看隐式Intent怎么用?
首先我们先配置我们的Activity的IntentFilter<
intent-filter>
actionandroid:
name="
com.example.project.SHOW_CURRENT"
/intent-filter>
这样在调用的时候指定Intent的action,系统就是自动的去对比是哪个intent-filter符合我们的Activity,找到后就会启动Activity.
一个intentfilter是IntentFilter类的实例,但是它一般不出现在代码中,而是出现在androidManifest文件中,以<
的形式.(有一个例外是broadcastreceiver的intentfilter是使用Context.registerReceiver()来动态设定的,其intentfilter也是在代码中创建的.)
一个filter有action,data,category等字段.一个隐式intent为了能被某个intentfilter接受,必须通过3个测试.一个intent为了被某个组件接受,则必须通过它所有的intentfilter中的一个.
22.Intent传递数据时,可以传递哪些类型数据?
Intent传递方式和参数类型:
1.Extra:
String[].Parcelable.long.boolean.double.CharSequence[].Parcelable[].char.int[].int.double[].float.short.long[].boolean[].short[].String.Serializable.float[].Bundle.byte[].byte.CharSequence.char[].2.Data:
URI
23.请描述一下BroadcastReceiver.
BroadcastReceiver用来接收并处理广播.可以接收系统的广播例如:
电量不足.来电来信等.程序也可以播放广播.BroadcastReceiver可以通过多种方式通知用户:
启动activity.使用NotificationManager.开启背景灯.振动设备.播放声音等,最典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容.
通常我们的某个应用或系统本身在某些事件(电池电量不足.来电来短信)来临时会广播一个Intent出去,我们可以利用注册一个BroadcastReceiver来监听到这些Intent并获取Intent中的数据.
24.在manifest和代码中如何注册和使用BroadcastReceiver.
receiverandroid:
.xxReceiver"
android.provider.Telephony.SMS_RECEIVED"
/>
/receiver>
25.请介绍下Android的数据存储方式.
在Android中的数据存储方式有以下五种:
1.SharedPreferences:
用