Android面试宝典
Posted 冰糖葫芦三剑客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android面试宝典相关的知识,希望对你有一定的参考价值。
Java知识点包括:接口与抽象的使用及区别,多线程,socket基础,集合类,也有个别公司考察定义,很无语.
C/C++知识点包括:指针的移动,排序算法,链表,有时还会有二叉树的遍历或图的遍历.
Applications Application Framework Android RunTime Libraries Liunx Kernel
架构框架以此从上到下:
1.Applications (应用程序(应用层))
android 会同一系列核心应用程序包一起发布,该应用程序包包括 email 客户端,SMS 短消息程序,日历,地图,浏览器,联系人管理程序等.所有的应用程序都是使用 JAVA 语言编写的.
2.Application FrameWork (应用程序扩展层(框架))
由于 Android 的手机操作系统是,基于Liunx 2.6系统之上封装而成.所以开发人员可也
以直接访问核心程序所使用的API框架,该核心应用程序的API框架设计简化了组件的重用, 任何一个核心应用程序(模块)都暴露出它的功能作用,并且其他应用程序也都可以使用该核心应用程序(模块)的功能(不过的遵守该核心应用程序框架的安全性限制).同样,该应用程序的重用机制也使用户方便使用应程序的相关组件.
API框架隐藏的核心应用程序是一系列的应用程序的服务和系统应用,其中包括如下:
(Android手机中的View 是最基本的一个 UI类)
丰富而又可扩展的视图(手机界面所显示的组件(Activity上所显示的))组件,可以用
来构建应用程序 如:(视图)Views, 网格(grids), 文本框(text boxes), 按钮(button), 放
置图片区(imageview),文本编辑区 (edittext), 文本显示区(textview ),
3.Android RunTime Libraries (Android系统运行库);
4.Liunx Kernel (Android 系统最底层核心系统 Liunx)
2. Android dvm的进程和Linux的进程,应用程序的进程是否为同一个概念?
DVM指dalivk的虚拟机.每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的 Dalvik虚拟机实例.而每一个DVM都是在Linux中的一个进程,所以说可以认为是同一个概念.
3. SIM卡的EF文件有何作用?
SIM卡的文件系统有自己规范,主要是为了和手机通讯,SIM卡本身可以有自己的操作系统,EF就是作存储并和手机通讯用的.
4. 一条最长的短信息约占多少byte?
中文70(包括标点),英文160个字节.
5. Android中的动画有哪几类,它们的特点和区别是什么?
两种.一种是Tween动画.还有一种是Frame动画.
Tween动画,这种实现方式可以使视图组件移动.放大.缩小以及产生透明度的变化; 另一种Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影.
6. 什么是嵌入式实时操作系统,Android操作系统属于实时操作系统吗?
嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统.主要用于工业控制,军事设备,航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统.又可分为软实时和硬实时两种,而Android是基于linux内核的,因此属于软实时.
7. Handler机制的原理?
Andriod提供了Handler和Looper来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(Message Exchange).
1)Looper:一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列).
2)Handler:你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息.
3) Message Queue(消息队列):用来存放线程放入的消息.
4)线程:UI thread通常就是main thread,而Android启动程序时会替它建立一个Message Queue.
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类中另的外一个函数.
public Intent setClass(Context packageContext,Class<?>cls)其返回值为一个Intent对象(即你要跳转到得Activity的Intent对象)
2.从一个Activity获取另外一个Activity中的数据结果
例如:你在某个app 中点击了按键跳转到了另外一个Activity(此处我暂称为子Activity)中,在此Activity中你让用户选择联系人列表中的联系人,而在此Activity结束后需要在上层Activity(此处我暂称为父Activity)中需显示子Activity中返回的联系人名字.
要想做到上述功能,我们需做一下三件事
(a)在父Activity中调用StartActivityForResult(Intent ,int );
(b)在父Activity中实现OnActivityResult(int requestCode, int resultCode, Intent Date)
参数分析:requestCode:此参数传个StartActivityForResult 为了确定是谁请求的.
resultCode:此参数是SetReuslt(Intent Date)的返回值为Intent对象.
Date :Intent对象返回给调用者.
(c)在子Activity快要退出时调用SetReuslt(Intent Date)函数用于回调父Activity中的
OnActivityResult(int requestCode, int resultCode, Intent Date)函数.
12. 横竖屏切换时候Activity的生命周期.
1. 不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2. 设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横.竖屏时只会执行一次
3.设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
13. 如何将一个Activity设置成窗口的样式.
1.在你的styles.xml文件中可以新建一如下的style:
<style name="Theme.FloatActivity" parent="android:style/Theme.Dialog">
<!-- float_box为我们定义的窗口背景,这个不是必须的-->
<item name="android:windowBackground">@drawable/float_box</item>
</style>如果窗口要添加窗口背景,可以在drawable中新建一个叫float_box.xml的文件,内容可以如下(自定义):
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<stroke android:width="3dp" color="#000000" />
<corners android:radius="3dp" />
<padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" />
</shape>
2.在AndroidManifest.xml中在你需要显示为窗口的activity中添加如果属性:android:theme="@style/Theme.FloatActivity"即可
如果说您觉得新建style.xml及float_box.xml文件的方式麻烦或者只想Test一下,那么可以直接添加您对应需要展示为Dialog style的Activity的android:theme属性值为android:theme="@android:style/Theme.Dialog".
14.如何退出Activity?如何安全退出已调用多个Activity的Application?
对于单一Activity的应用来说,退出很简单,直接finish()即可.当然,也可以用killProcess()和System.exit()方法.
15.如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?
onSaveInstanceState()
当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState().B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了.
14. 两个Activity之间怎么传递数据?
邮递员Intent
15. 怎么让在启动一个Activity是就启动一个service? IntentService
同一个程序,但不同的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键返回到程序启动器(application launcher)后,选择了一个新的应用程序(事实上是一个新的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_TASK FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED FLAG_ACTIVITY_SINGLE_TOP
主要的<activity>属性有: taskAffinity launchMode allowTaskReparenting
clearTaskOnLaunch alwaysRetainTaskState finishOnTaskLaunch
默认情况下,一个应用程序中的所有activity都有一个affinity–这让它们属性同一个task.然而,每个activity可以通过<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“
什么是Service以及描述下它的生命周期.
Android Service是运行在后台的代码,不能与用户交互,可以运行在自己的进程,也可以运行在其他应用程序进程的上下文里.需要通过某一个Activity或者其他Context对象来调用, Context.startService() 和Context.bindService(). 如果在Service执行耗时的操作需要启动一个新线程来执行.
Android Service只继承了onCreate(),onStart(),onDestroy()三个方法,当我们第一次启动Service时Android面试宝典