第四篇 扩展篇—哈哈,终于等到这一天! 第26回 主公,我来考考你

大蜀科技公司终于在刘备的领导下,有了很大的起色,多个项目运转了起来。刘关张、孔明等人天天忙得不亦乐乎,吃饭、睡觉都在会议室里匆匆解决。一天里除了五六个小时的睡眠,其他时间都在忙碌地工作。

张飞:“这个倒好,咱也不用弹性工作制了,直接使用全天工作制这一招!”

关羽:“飞飞你也不要埋怨了,这叫先苦后甜。”

张飞:“主要咱们年级也不小了,媳妇还没一个,这日子不好过啊!”

关羽:“等咱公司上市了,到时候随便你找啊~”

张飞:“好!到时候我要找十个!!”

刘备:“其实这么天天做事也蛮充实的,人生能有几次这样的拼搏啊!你还说你年级不小了,我年纪可更不小了,但最近我总是感觉我变年轻了,哈哈!”

孔明:“话说主公,咱们老是这几个人瞎忙也不是办法,是时候招兵买马了!”

刘备:“天啊,可以招小弟了,心情好激动!”

孔明:“这招聘可是个技术活,假如招进来不靠谱的技术员,不仅开除的时候麻烦,而且也非常影响士气,破坏整个团队的氛围,所以需得谨慎才是!”

刘备:“军师莫慌,我们几个都是Android大神了,面试那些菜鸟还不跟玩似的?”

孔明:“主公可千万不要小看这个面试,不是会编程就会面试的,有很多内容是基础功底但很容易被人忽略的。哪怕你编程很牛,做项目经验很多也不一定会哟!”

刘备:“军师言过其实了吧~”

孔明:“主公不信?不如我来考考你~”

1.1. Android开发面试题简介

企业招聘Android人才,会通过一些题目来考察Android程序员的基本功。本回将重点详细的讲解一些Android求职者在面试中常见的问题。通过这些面试题,一方面帮助读者为应聘Android开发岗位做针对性的准备,一方面通过大量的题,帮助读者深入理解Android的知识要点。

1.2. 概念题

本节主要介绍的是常见的概念题,即名词解释。作为一名Android开发者首先需要对Android的相关概念、术语有深入的理解。

 

面试例题:Android手机操作系统的四层架构

解答:架构框架以此从上到下:应用层、框架层、Android系统运行库、最底层核心系统Linux。

 

面试例题:Android的动画有哪几种?它们的特点和区别是什么?

解答:三种,一种是Tween动画,一种是Frame动画,还有一种是Property属性动画。Tween动画可以使视图组件移动、放大缩小和产生透明度变化。Frame动画通过顺序的播放排列好的图片来实现动画。Property属性动画是在指定的时间长度上改变一个属性(对象中的一个成员字段)的值,形成动画,如对象在屏幕上的位置、动画的停留时间和动画之间的值等。

 

面试例题:Handler机制的原理?

解答:Andriod提供了 Handler 和 Looper 来满足线程间的通信。消息队列Message Queue是用来存放线程放入的消息。一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue。我们可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里,或者接收从MessageQueue所送来的消息。

 

面试例题:onSaveInstanceState()和onRestoreInstanceState()方法什么用途?

解答:可以使用它们在程序中保存和读取数据。当应用程序遇到意外情况时,如:内存不足、用户直接按Home键、由系统销毁一个Activity时,将调用onSaveInstanceState()方法,而用户主动去销毁一个Activity时,onSaveInstanceState()将不会被调用。因此通常onSaveInstanceState()适合用于保存一些临时性的状态。如果Activity在后台没有因为运行内存吃紧被清理,则切换回时会触发onRestoreInstanceState()方法。实际使用示例代码如下:

@Override

protected void onSaveInstanceState(Bundle outState){

outState.putString("name","zhangfei");

}

@Override

public void onRestoreInstanceState(Bundle savedInstanceState) {

super.onRestoreInstanceState(savedInstanceState);

String zhangfei =savedInstanceState.getString("name");

}

上述代码,在应用程序遇到意外情况时,调用onSaveInstanceState()方法,存储“name”为“zhangfei”;当应用恢复时,调用onRestoreInstanceState()方法,读取“name”。

面试例题:简单描述下Android 数字签名和它的好处。

解答:数字签名是用来让程序包自我认证的。在Android系统中,所有安装到系统的应用程序都有一个数字证书。Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证。如果要正式发布一个Android,必须使用一个合适的私钥生成的数字证书来给程序签名。同一个开发者的多个程序尽可能使用同一个数字证书,这样不仅有利于程序的升级,而且有利于程序的模块化设计和开发。

 

面试例题:什么是ANR ,如何避免它?

解答:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应ANR(Application NotResponding)。用户不希望每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。

 

面试例题:谈谈对Android NDK的理解。

解答:NDK是一个交叉编译工具,它让开发者更加直接地接触Android系统资源,并使用传统的C或C++语言编写程序,可以直接调用C/C++的库,提高了应用程序的响应速度。但NDK编程使得程序更加复杂,兼容性难以保障。

 

面试例题:谈谈Android的优点和不足之处。

解答:优点有1、开放性、开源;2、挣脱运营商束缚;3、丰富的硬件选择;4、无缝结合的Google应用。缺点:1、安全和隐私问题;2、山寨化严重;3、过分依赖开发商,缺乏标准配置版本过多。

 

面试例题:Android程序与Java程序的区别?

解答:Android程序用Android SDK开发,Java程序用Java SDK开发。Android SDK引用了大部分的Java SDK,少数部分被Android SDK抛弃。

 

面试例题:AIDL的全称是什么?有什么用?

解答:AIDL是Android interfacedefinition language,Android接口定义语言。可以实现跨进程的访问方法。

 

面试例题:Android程序运行时权限与文件系统权限的区别?

解答:Android程序运行时权限主要指的是在Android配置文件中声明的相关权限请求,如打电话、访问网络、获取坐标、写SD卡、读写联系人等。文件系统的权限一般指的是linux权限,比如文件的私有、可读可写等。

 

面试例题:Android开发配置文件的作用。

解答:配置文件主要用于声明Android应用启动时,所需的组件、组件所需的资源、应用程序所需链接到的库的名称和声明应用程序所需的权限。该文件会被打包到应用的apk包中,随应用程序一起发布。

 

面试例题: Android应用的入口点在哪里?

解答: Android应用的入口点是在Application中定义的main节点中,可以通过设置Androidmanifest.xml配置文件更改Android应用的入口。

 

面试例题:返回键与Home键区别?

解答:在Android中,当按下Home键时,默认情况下stop前台的Activity,即Activity调用onStop()方法,而不是调用onDestory()方法。如果再次启动该Activity将是调用onSavedInstanceState()方法,保持上次Activity的状态则是从onRestart()方法开始。而当按下back键则不同,back键默认finish前台的Activity,即Activity调用onDestory()方法,再次启动该Activity时,系统从onCreate()方法开始重新初始化。

 

面试例题:Android 中的长度单位详解。

解答:px:表示屏幕实际的象素。in:表示英寸,是屏幕的物理尺寸。dp和sp:dp也就是dip,如果设置表示长度、高度等属性时可以使用dp 或sp。但如果设置字体,需要使用sp。使用dp和sp,系统会根据屏幕密度的变化自动进行转换。

 

面试例题:Android程序如何支持国际化?

解答:我们建好一个Android 的项目后,默认的res下面有layout、values、drawable等目录。这些都是程序默认的资源文件目录,如果要实现多语言版本的话,可以添加要实现语言的对应的资源文件。比如应用程序兼容简体中文、日文、英文、法文和德文,需在values文件夹中建立默认strings.xml,再建立values-zh-rCN(zh表示中文rCN表示简体,类似还有美式英语,奥式英语)、values-ja、values、values-fr和values-de文件夹。在每个文件夹里放置一个strings.xml,strings.xml里是各种语言的字符串。如果涉及到参数配置类xml文件夹也要改成xml-zh、xml-ja、xml、xml-fr和xml-de。这样应用程序会根据Android系统当前的语言,切换对应的语言。

1.3. 界面

任何应用都离不开界面,一个好的界面决定了一个应用的质量。Android系统中包含了大量的组件和布局方式。对于Android开发者,掌握好的界面开发技术是必不可少的。

 

面试例题:Android中常用的五种布局?

解答:LinearLayout线性布局、AbsoluteLayout绝对布局、TableLayout表格布局、RelativeLayout相对布局、FrameLayout帧布局。

 

面试例题:Android UI中的View如何刷新?

解答:在主线程中,去调用View的Invalide()方法,刷新View界面。在子线程里面可以通过postInvalide()方法去刷新View界面。

 

面试例题:谈谈UI中,Padding和Margin有什么区别?

解答:Padding指的是文字与边框的距离,Margin是控件与控件之间的距离。

 

面试例题:ListView如何提高其效率?

解答:ListView提高效率主要通过复用ConvertView,使用历史的View对象,避免创建过多的View。另外可以采用异步加载数据,分页加载数据等方法提高ListView响应速度。

 

面试例题:UI如何优化?

解答:Android在UI方面的优化可以从以下五个方面入手:1、 Adapter优化,常见的View,如ListView,GridView等都需要用到Adapter。通过对Adapter中的getView()方法进行优化实现UI优化。2、图片优化,加载分辨率较高的图片,势必会延迟UI界面的加载时间,在不影响显示效果的情况下对图片做适当的优化可以使得UI更加的流畅。3、绘图优化,大量的UI是通过系统的绘制形成的,减少不变区域的重复绘制,会大大的提高UI的效率。4、布局的优化,复杂的布局就需要系统更长时间的调度、加载资源,适当的优化布局就可以减少系统的操作。5、内存分配的优化,合理的分配内存,可以有效的提高内存的利用率,实现UI的优化。

 

面试例题:更新UI,能否用子线程?

解答:Android中更新UI只能用主线程,子线程是无法更新Android的UI界面的。想要当子线程数据发生改变时,更新主线程的UI,可以通过消息机制,利用Message和Handler实现UI界面的更新。

 

面试例题:AsyncTask是什么?

解答:AsyncTask是Android 是一个工具类,用于异步执行任务。这个AsyncTask 用于处理一些后台的比较耗时的任务。AsyncTask不再需要子线程和Handler 就可以完成异步操作并且刷新用户界面。

 

面试例题:谈谈对Canvas这个类的了解?

解答:Canvas类就是表示一块画布,可以在上面绘画东西。通过设置画笔的属性和画布的属性,如颜色/尺寸等,实现将所要绘制的东西绘制到画布上。

 

面试例题:View,SurfaceView,GLSurfaceView有什么区别。

解答:View是最基础的,是组件的基类。SurfaceView是View的子类,使用双缓机制,刷新界面速

度比View快。GLSurfaceView是SurfaceView的子类,是OpenGL专用的。

 

面试例题:android:gravity与android:layout_gravity的区别。

解答:LinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity。它们的区别在于:android:gravity用于设置View 组件的对齐方式,而android:layout_gravity用于设置Container组件的对齐方式。举个例子,可以通过设置android:gravity="center"来让EditText中的文字在EditText组件中居中显示;设置EditText的android:layout_gravity="right"来让EditText组件在LinearLayout中居右显示。

 

1.4. 四大组件

Android的Activity、Service服务、Content Provider内容提供者和BroadcastReceiver广播接收器四大组件在开发应用中是必不可少的。每种组件提供不同的用途,并各自拥有不同的特点。面试中,面试官常通过对四大组件的考察,了解面试者的Android功底。

 

面试例题:什么是Activity,Activity的生命周期?

解答: Activity对应的是一个用户交互界面。它是Context的子类,Activity实现了window.callback和keyevent.callback接口,可以处理与窗体用户交互的事件。开发常见的Activity子类有ListActivity、PreferenceActivity、TabAcitivty等。生命周期描述的是一个类从创建到死亡的过程中会执行的方法。Activity的生命周期主要和以下方法有关,onCreate()方法:在该方法里创建界面,做一些数据的初始化工作;onStart()方法:调用该方法时界面变成用户可见不可交互的;onResume()方法:调用该方法时界面变成和用户可交互的;onPause():调用该方法时界面可见但不可交互,系统会停止绘制界面等;onstop():调用该方法时界面变得不可见,被下一个Activity覆盖;onDestroy()方法:Activity被销毁前调用该方法。

 

面试例题:两个Activity之间跳转时必然会执行的是哪几个方法?

解答:例如有两个Activity:A,B。当在A里面激活B组件时,A会调用 onPause()方法,然后B依次调用onCreate()、onStart()和onResume()方法。当B覆盖了窗口,A会调用onStop()方法。如果B是个透明的或者是对话框样式的Activity,A就不会调用onStop()方法。

 

面试例题:横竖屏切换时Activity的生命周期。

解答:横竖屏切换时生命周期跟配置文件里的配置有关系:1、不设置Activity的android:configChanges属性时,切屏会重新调用各个方法,默认首先销毁当前Activity,然后重新加载Activity;2、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个方法,只会执行onConfigurationChanged()方法。

 

面试例题:两个Activity之间怎么传递数据?

解答:基本数据类型可以通过Intent 传递数据,如下代码所示:

// 通过Intent.putExtra()方法传递基本类型的数据

             Bundle bundle = new Bundle();

bundle.putShort(key, value);

intent.putExtras(bundle);

也可以利用Application存放全局对象,实现自己的Application类,使每个Activity都可以取到全局对象。还可以让对象实现Serializable接口,通过文件的形式共享对象。

 

面试例题:startActivityForResult()这个方法有什么用?

解答:startActivityForResult()方法是从一个Activity中启动一个新的Activity时调用的方法,新的Activity执行完后会返回到启动它的Activity。

 

面试例题:如何安全的退出Activity?

解答:对于单一Activity的应用程序来说,退出很简单,直接finish()即可,也可以调用killProcess()和System.exit()结束应用程序。对于多Activity的应用来说,在最后打开的Activity直接退出,只是结束一个Activity而已。在2.1版本之前,可以使用ActivityManager.restartPackage()方法,直接结束整个应用程序。在2.2之后,可以采用新的方法killBackgroundProcesses(),结束整个应用。另外还可以利用系统的forceStopPackage()方法强制结束应用程序。

 

面试例题:什么是Service,它的生命周期如何?Service有哪些启动方法,有什么区别?怎样停用Service?

解答:Service是后台服务,可以让服务一直在后台运行,可以在Service里创建线程去完成耗时的操作或创建常驻系统的服务。Service的生命周期中,主要调用有onCreate()、onStart()、onDestroy()、onBind()和onUnbind()方法。通常有两种方式启动一个Service,它们对Service生命周期的影响是不一样的。

(1)通过startService()方法启动Service,Service会经历onCreate()→onStart(),然后处于运行状态;停止Service时,调用stopService()方法,Service会调用onDestroy()方法销毁Service。

(2)通过bindService()方法启动Service,Service会经历onCreate()→onBind(),这时调用者和Service绑定在一起。当调用者通过调用unbindService()方法来停止Service时,Service就会调用onUnbind()→onDestroy()方法销毁Service。

 

面试例题:请描述一下Intent和intent-filter。

解答:Android中通过Intent可以实现各种系统组件的调用与激活。一般Intent对象包含消息的目的地和消息的内容。消息的目的地是必须的,而内容则是可选项。intent-filter是消息的分发器,通过Action、Data和Category,识别Intent,找到对应的Android应用程序组件。

 

面试例题:Intent与PendingIntent的区别?

解答:Intent是一个意图,用于立即启动Activity、Broadcast或是Service。PendingIntent可以看作是对Intent的包装,当外部应用执行PendingIntent时,将间接地调用里面的Intent,用于处理即将发生的事情,比如当点击通知Notification时,跳转页面。

 

面试例题:通过Intent传递二进制数据的方法?

解答:采用Java中的Serializable接口实现序列化;采用Android的Parcelable接口实现序列号, Android的部分类如Bitmap类,都实现了Parcelable接口。

 

面试例题:显示意图与隐式意图有什么区别?

解答:显式Intent明确指出了目标组件名称,多用于某应用程序内部传递消息。隐式Intent没有明确指出目标组件名称的Intent,更广泛地用于在不同应用程序之间传递消息。在显式Intent消息中,决定目标组件的唯一要素就是组件名称。而对于隐式Intent则不同,由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。

 

面试例题:系统内置的常用Intent。

解答:一般常用的Intent有,google搜索内容:Intent.ACTION_WEB_SEARCH;浏览网页:Intent.ACTION_VIEW;拨打电话:Intent.ACTION_DIAL;发短信或Email:Intent.ACTION_SENDTO等。

 

面试例题:请描述一下Broadcast Receiver。

解答:广播是Android系统在特定情况下发生的一个事件,例如地域变换、电量不足、来电来信等。Broadcast Receiver用于接收并处理这些广播通知。BroadcastReceiver只有一个简单的回调函数:onReceive(ContextcurContext, Intent broadcastMsg),当一个广播消息被Receiver监听到时,Android会调用它的onReceive()方法,并将包含消息的Intent对象传给它。可以通过在AndroidManifest.xml或代码中注册Broadcast Receiver。

 

面试例题:注册广播接收者两种方式的区别。

解答:注册的方法有两种,一种是静态注册,一种是动态注册。在Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的。动态注册广播接收器的一个特点,就是当用来注册的Activity 关掉后,广播也就失效了。静态注册就无需担忧广播接收器是否被关闭,只要设备是开启的,广播接收器就是打开着的。

 

面试例题:为什么要用Content Provider?它和SQL有什么差别?

解答:Content Provider实现了不同的App之间共享数据。Content Provider可以去增删改查数据,Sql也有增删改查数据。但使用Content Provider可以屏蔽数据存储的细节,对用户透明,用户只需要关心操作数据的Uri就可以了,而SQL则需要知道数据表的具体结构。

 

面试例题:通过ContentProvider实现数据共享的方法。

解答:一个程序可以通过实现一个Content Provider将自己的数据暴露出去。可通过2种方法实现数据的共享:创建一个属于自己的Content Provider;将数据添加到一个已经存在的ContentProvider中,前提是有相同数据类型并且有写入ContentProvider的权限。

1.5. 存储

一个应用程序,大部分时间都在进行数据的存储和读取。数据的存储是Android应用的重要组成部分。Android系统提供了多种的数据存储方式。作为Android开发人员需要对数据的存储有着清晰的认识,才能开发出优秀的应用。

 

面试例题:Android的五种数据存储方式?

解答:sharedPreferences、文件、SQLite、Content Provider、网络。

 

面试例题:Android中的xml解析方式。

解答:在Android平台中提供了多种xmlParser解析器,常见包含DOM、SAX、PULL。DOM对xml文件进行操作时,首先解析文件,将文件分为独立的元素、属性和注释等,然后以节点树的形式在内存中对xml文件进行表示,最后就可以通过节点树访问文档,修改文档。SAX的工作原理是对文档进行顺序扫描,当扫描到文档开始与结束、元素开始与结束等地方时,将通知事件处理方法,由事件处理方法做相应动作,然后继续扫描,直至文档结束。PULL解析器的运行方式和SAX类似,都是基于事件的模式。不同的是,在PULL解析过程中返回的是数字,需要我们自己获取产生的事件然后做相应的操作。

 

面试例题:如何将SQLite数据库文件与apk文件一起发布?

解答:可以将数据库文件复制到Eclipse Android工程中的res/raw目录中。res/raw目录中的文件不会被压缩,这样就可以直接提取该目录中的文件。可以使用openDatabase()方法打开指定目录的数据库文件,所以在程序第一次运行时,可以将数据库文件拷贝到SD卡中,然后用openDatabase()方法打开数据库,最终实现将SQLite数据库文件和apk文件一起发布。

 

面试例题:SQLite支持事务吗?如何提高性能?

解答:SQLite是一个轻量级的数据库,支持SQL语句查询和简单事务管理。提高性能可以采用优化表的结构和优化SQL查询语句来实现。

 

面试例题:getWritableDatabase()和getReadableDatabase()方法两者的区别?

解答:Android中getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写。getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),当数据库的磁盘空间满了,就会打开失败,此时将会继续尝试以只读方式打开数据库。

1.6. Android系统

所谓知其然知其所以然,Android应用开发人员不仅要对Android系统的开发有深刻的认识,也要对Android的系统、架构有整体的认识。

 

面试例题:Android 的DVM进程?

解答:DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例,而每一个DVM都是Linux 中的一个进程。

 

面试例题:GC内存泄露出现的情况?

解答:1、数据库的Cursor没有关闭;2、构造Adapter时,没有使用缓存ContentView;3、Bitmap对象使用时,没采用recycle()方法释放内存。

 

面试例题:Android的IPC机制?

解答:IPC指的是是内部进程通信。Android中的IPC机制只适用于Activity和Service之间的通信,类似于远程方法调用。通过定义AIDL接口文件来定义IPC接口,Servier端实现IPC接口,Client端调用IPC接口。

 

面试例题:Android中的内存管理?

解答:Android用自己的虚拟机(Dalvik))去管理程序内存。Android采取了一种有别于Linux的进程管理策略,Linux系统在进程活动停止后就结束该进程,Android把这些进程都保留在内存中,直到系统需要更多内存为止。这些保留在内存中的进程通常情况下不会影响整体系统的运行速度,并且当用户再次激活这些进程时,提升了进程的启动速度。Android开发中可以使用DDMS-Heap去监测系统的内存情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值