2017面试题整理

基础

Activity的生命周期的理解

周期 功能
onCreate() 【创建基本的UI元素】:当 activity 第一次创建时会被调用。
onRestart() 在 activity 被停止后重新启动时会调用该方法。其后续会调用 onStart 方法。
onStart() 交互之前 不可见,位图从新加载;
onResume() 【从新初始化资源 例如Camera、sensor】:交互之前 可见不可操作
onPause() 【清除资源 避免浪费 例如Camera、sensor】:交互之后 可见 不可操作
onStop() 交互之后 不可见,位图回收 不可再pause回收那样会造成 正在使用已经回收的位图错误;
onDestroy() 【因为引用会在Activity销毁的时候销毁,而线程不会,所以清楚开启的线程】:在 activity 被销毁前会调用该方法
onWindowFocusChanged(boolean hasFocus) hasFocus true就是可见,false就是不可见;官方意思:这个Activity得到或者失去焦点的时候 就会call。
* 扩展

今天又听说有同学遭遇了更变态的问题:什么情况下Activity走了onCreat(),而不走onStart(),这简直就是脑筋急转弯嘛。
是在onCeate里面,调用finish直接就挂掉不会调用onStart了

service生命周期?

这里要注意service有两种启动方式,startService()和bindService()

如何理解Activity,View,Window三者之间的关系?

  • Activity构造的时候会初始化一个Window,准确的说是PhoneWindow。
  • 这个PhoneWindow有一个“ViewRoot”,这个“ViewRoot”是一个View或者说ViewGroup,是最初始的根视图。
  • “ViewRoot”通过addView方法来一个个的添加View。比如TextView,Button等
  • 这些View的事件监听,是由WindowManagerService来接受消息,并且回调Activity函数。比如onClickListener,onKeyDown等。

Activity的几种LaunchMode

http://fromwiz.com/share/s/3Hsjaq1-lQ9Q2SChN02Hkyvk3mqtd_1vOQt92MTTz53ktcy1

横竖屏切换时候activity的生命周期

  • 设置 android:configChanges=”orientation” 和不设置这个属性,生命周期表现为重新创建activity
  • 设置 android:configChanges=”orientation|keyboardHidden”,在2.3上表现为不重新创建activity,4.0如下
    • android:targetSdkVersion<=”12”,生命周期表现为不重新创建activity
    • android:targetSdkVersion>”12”,表现为重新创建activity
  • 设置 android:configChanges=”orientation|keyboardHidden|screenSize”,在2.3和4.0上都表现为不重新创建
    版本不一样切竖屏执行的次数不一样,而且configChanges在3.2之后需要配置screenSize
    参考:http://www.cnblogs.com/xiaoQLu/p/3324503.html

android中的动画有哪几类,它们的特点和区别是什么?

  • FrameAnimation(逐帧动画):将多张图片组合起来进行播放,类似于早期电影的工作原理,很多App的loading是采用这种方式。
  • TweenAnimation(补间动画):是对某个View进行一系列的动画的操作,包括淡入淡出(Alpha),缩放(Scale),平移(Translate),旋转(Rotate)四种模式。
  • PropertyAnimation(属性动画):属性动画不再仅仅是一种视觉效果了,而是一种不断地对值进行操作的机制,并将值赋到指定对象的指定属性上,可以是任意对象的任意属性。

handler机制的原理

andriod提供了 Handler 和 Looper 来满足线程间的通信。Handler 先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(Message Exchange)。

  • Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
  • Handler: 你可以构造Handler对象来与Looper沟通,以便push新消息到Message Queue里;或者接收Looper从Message Queue取出)所送来的消息。
  • Message Queue(消息队列):用来存放线程放入的消息。
  • 线程:UI thread 通常就是main thread,而Android启动程序时会替它建立一个Message Queue。


需要注意的地方:

  • prepareMainLooper :为ActivityThread特殊准备的
  • handler对象只能添加到有消息队列的线程中 否则会发生异常 其实Activity被构造前已经.prepare了 而且不能.prepare两次
  • 一个线程可以有多个handler 每个 message会对应对应 的handler(监听在handler内部) 所以没事
  • Looper也是可以退出的 如果所有的事情都完事了 可以quit不然,looper会一直等待下去(当然可以不管~)
  • quit :直接退出
  • quitSafely:先设定一个退出标识(小心进不来了),然后把消息处理完后真正退出
  • Activity的主线程就是ActivityThread 主线程的入口是main方法

让Activity变成一个窗口:Activity属性设定

对话框

1
android :theme="@android:style/Theme.Dialog"

半透明的

注意其生命周期

1
android:theme="@android:style/Theme.Translucent"

如何将SQLite数据库(dictionary.db文件)与apk文件一起发布?

可以将dictionary.db文件复制到Eclipse Android工程中的res raw目录中。所有在res raw目录中的文件不会被压缩,这样可以直接提取该目录中的文件。可以将dictionary.db文件复制到res raw目录中

如何将打开res raw目录中的数据库文件?

在Android中不能直接打开res raw目录中的数据库文件,而需要在程序第一次启动时将该文件复制到手机内存或SD卡的某个目录中,然后再打开该数据库文件。复制的基本方法是使用getResources().openRawResource方法获得res raw目录中资源的 InputStream对象,然后将该InputStream对象中的数据写入其他的目录中相应文件中。在Android SDK中可以使用SQLiteDatabase.openOrCreateDatabase方法来打开任意目录中的SQLite数据库文件。

MVC MVVM MVP

http://fromwiz.com/share/s/3Hsjaq1-lQ9Q2SChN02Hkyvk03i2dZ3qEkEB2hONOQ1uxi1j

什么是ANR 如何避免它?

ANR:Application Not Responding。

  • 用户对应用程序的操作(如输入事件,按键、触摸屏事件)在5秒内无响应
  • 广播接受器(BroadcastReceiver)在10秒内仍未执行完毕

不要在UI线程做耗时操作即可避免

如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?

通过重写onSaveInstanceState()方法来实现Activity的运行状态,请注意以下几点:

  • 由于activity 对象被暂停或停止时,它仍然保留在内存里面,关于它的成员信息和当前状态都是活动的,所以此时可以保存Activity的状态,从而使用户所作的Activity的更改保存在内存中
  • 当系统回收内存而将Activity销毁时,就无法保存其状态,所以需要调用onSaveInstanceState()方法来实现状态的保存
  • 很多情况并不需要保持状态信息,比如按下返回键直接关闭程序,所以并不能保证会调用onSaveInstanceState。如果调用了该方法,一般是在onStop 方法之前且可能在 onPause 之后调用。尽管如此,即使你没做任何操作或没有实现 onSaveInstanceState() 方法,你的 activity 状态也能通过Activity 类里面默认实现的 onSaveInstanceState 方法恢复出来。特别是会为布局中的视图( View )默认调用onSaveInstanceState 方法,并在这个方法中允许每一个视图提供它需要恢复的任何信息。几乎每一个 Android框架中的 widget 都视情况实现了这个方法。

注:因为 onSaveInstanceState 方法不一定会被调用(系统因为内存紧张回收的时候才调用 或者调整Activity的方向把),所以你应该只是用它来保存一些 activity 的转换过程状态(即 UI 的状态),而不能用来保存永久性数据。但你可以用 onPause 方法在用户离开 activity 时来保存永久性数据,比如需要保存到数据库的数据。
有一个很好的方法可以用来检验应用程序保存状态的能力,就是简单地旋转你的设备来改变屏幕的方向。因为当屏幕方向改变时,系统为了给新的方向提供一个可能合适的代替资源,会销毁 activity 并新建一个新的。由于这个原因,你的 activity 是否能在其重新创建时完成保存状态就显得尤为重要,因为用户经常会在使用应用程序时旋转屏幕的。
上文部分内容参考了:http://blog.csdn.net/sam_zhang1984/article/details/6430817

谈谈android数据存储方式。

Android提供了5种方式存储数据:

  • 使用SharedPreferences存储数据;它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用。
  • 文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。
  • SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的嵌入式数据库。
  • 使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。
  • 网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。

Android中Activity, Intent, Content Provider, Service各有什么区别。

  • Activity: 活动,是最基本的android应用程序组件。一个活动就是一个用户可以操作的可视化用户界面,每一个活动都被实现为一个独立的类,并且从活动基类继承而来。
  • Intent: 意图,描述应用想干什么。最重要的部分是动作和动作对应的数据。
  • Content Provider:内容提供器,android应用程序能够将它们的数据保存到文件、SQLite数据库中,甚至是任何有效的设备中。当你想将你的应用数据和其他应用共享时,内容提供器就可以发挥作用了。
  • Service:服务,具有一段较长生命周期且没有用户界面的程序组件。

View, surfaceView, GLSurfaceView有什么区别。

  • view是最基础的,必须在UI主线程内更新画面,速度较慢。
  • SurfaceView 是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快
  • GLSurfaceView 是SurfaceView的子类,opengl 专用的

Manifest.xml文件中主要包括哪些信息?

  • manifest:根节点,描述了package中所有的内容。
  • uses-permission:请求你的package正常运作所需赋予的安全许可。
  • permission: 声明了安全许可来限制哪些程序能你package中的组件和功能。
  • instrumentation:声明了用来测试此package或其他package指令组件的代码。
  • application:包含package中application级别组件声明的根节点。
  • activity:Activity是用来与用户交互的主要工具。
  • receiver:IntentReceiver能使的application获得数据的改变或者发生的操作,即使它当前不在运行。
  • service:Service是能在后台运行任意时间的组件。
  • provider:ContentProvider是用来管理持久化数据并发布给其他应用程序使用的组件。

根据自己的理解描述下Android数字签名

  • 所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
  • Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
  • 如果要正式发布一个Android程序,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布。
  • 数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能。*

android:gravity与android:layout_gravity的区别

  • android:gravity用于设置View组件的对齐方式
  • android:layout_gravity用于设置Container组件的 对齐方式。

注册广播接收者两种方式的区别,及优缺点

注册的方法有两种,一种是静态注册:清单文件中声明,一种是动态注册:代码进行注册。
动态注册优点(跟随程序的生命周期):在 Android 的广播机制中,动态注册的优先级是要高于静态注册优先级的,因此在必要的情况下,我们是需要动态注册广播接收器的。
静态注册优点(手机开着即可):动态注册广播接收器还有一个特点,就是当用来注册的 Activity 关掉后,广播也就失效了。同时反映了静态注册的一个优势,就是无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。

android中有哪几种解析xml的类,官方推荐哪种?以及它们的原理和区别

  • DOM:加载内存 生成一个树状结构,消耗内存大
  • SAM:基于事件的方式,速度快,效率高 不能倒退
  • PULL:解析器的运行方式和SAX类似,都是基于事件的模式,区别我们需要自己获取产生的事件然后做相应的操作,而不像SAX那样由处理器触发一种事件的方法,执行我们的代码小巧轻便,非常适合在Android移动设备中使用,Android系统内部在解析各种XML时也是用PULL解析器。

pull比sax更简明,而且不需要扫描完整个流.

双缓冲技术原理以及优缺点:

创建一幅后台图像,将每一帧画入图像,然后调用drawImage()方法将整个后台图像一次画到屏幕上去。
优点:双缓冲技术的优点在于大部分绘制是离屏的。
将离屏图像一次绘至屏幕上,比直接在屏幕上绘制要有效得多。
双缓冲技术可以使动画平滑。
缺点:要分配一个后台图像的缓冲,如果图像相当大,这将占用很大一块内存。

GridView  ListView出现的问题

  • ListView的吨卡现象

    • getView中 耗时操作了
    • view复用
    • 优化布局 清理布局中不用的 view 尽量减少
    • 列表滑动的时候停止夹在图片 
    • 启用硬件加速
  • 图片错位

    • 图片先加载了这个任务然后快速滑动  此控件又被复用了 然后又加载另一个图片
      解决方法: 完成时判断view的url和任务url是否相同然后决定是否加载

Touch事件的传递机制

Activity->Window->View 如果所有人都不消耗最后会在activity中的onTouchEvent上处理
执行顺序:onTouchListener > onTouchEvent > onLongClickListener > onClickListener

View的绘制流程

http://fromwiz.com/share/s/3Hsjaq1-lQ9Q2SChN02Hkyvk2v4H3m2F5QkL2AMzrJ2dUJlA

在View比较重要的回调方法

http://fromwiz.com/share/s/3Hsjaq1-lQ9Q2SChN02Hkyvk1s1fj02XCkI92r2-813nZxDP

View生命周期的官方文档

http://fromwiz.com/share/s/3Hsjaq1-lQ9Q2SChN02Hkyvk0aznMy2WZ4bz26V5Sj17kjFI

设计一套图片异步加载缓存方案

http://blog.csdn.net/boyupeng/article/details/47127605

Fragment的那些坑

http://www.jianshu.com/p/d9143a92ad94
http://www.jianshu.com/p/fd71d65f0ec6
http://www.jianshu.com/p/38f7994faa6b

Http Https

http://www.jianshu.com/p/93fdebe5fef1

网络请求优化

http://www.jianshu.com/p/3141d4e46240

图片优化

http://www.jianshu.com/p/5bb8c01e2bc7

单例

http://www.jianshu.com/p/a956024629cb

额外的了解

一条最长的短信息约占多少byte?

中文70(包括标点),英文160个字节。

什么是嵌入式实时操作系统, Android 操作系统属于实时操作系统吗?

嵌入式实时操作系统是指当外界事件或数据产生时,能够接受并以足够快的速度予以处理,其处理的结果又能在规定的时间之内来控制生产过程或对处理系统作出快速响应,并控制所有实时任务协调一致运行的嵌入式操作系统。主要用于工业控制、 军事设备、 航空航天等领域对系统的响应时间有苛刻的要求,这就需要使用实时系统。又可分为软实时和硬实时两种,而android是基于Linux内核的,因此属于软实时

android中线程与线程,进程与进程之间如何通信

binder跨进程 handler跨线程。主要是防止耗时线程阻塞UI线程;

Android dvm的进程和Linux的进程, 应用程序的进程是否为同一个概念

DVM指dalivk的虚拟机。每一个Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。而每一个DVM都是在Linux 中的一个进程,所以说可以认为是同一个概念

sim卡的EF 文件有何作用

sim卡的文件系统有自己规范,主要是为了和手机通讯,sim本 身可以有自己的操作系统,EF就是作存储并和手机通讯用的

收集的面试(非本人)

蘑菇街内推Android面试

未完成

热修复的原理

Reference&Thanks:

http://www.jianshu.com/p/a22450882af2
http://blog.csdn.net/superjunjin/article/details/7853546
http://blog.csdn.net/superjunjin/article/details/7855995
http://blog.csdn.net/superjunjin/article/details/7862182