文档章节

android 面试题(一)

席道坤
 席道坤
发布于 2017/03/30 21:23
字数 3489
阅读 20
收藏 1

一  Activity相关

1.Activity生命周期

     

  • onResume--->Activity is running---->onPause--->onResume:activity先进入半可见状态后又可见。
  • onStart---->onResume---->onPause---->onStop---->onRestart---->onStart:activity进入不可见状态,然后又可见。        
  • onCreate---->onStart---->onResume---->onPause---->onCreate:内存不足,当前后台(半可见)activity被释放。
  • onCreate---->onStart---->onResume---->onPause---->onStop:内存不足,当前后台(不可见)activty被释放。
  • 按HOME键调用onSaveInstanceState,activity销毁时不一定调用该方法。
  • 当activity是被系统销毁的,activity恢复运行时onRestoreInstanceState才会被调用。

2. activity启动模式

standard —— 默认模式,每次激活activity,都会创建一个实例放入栈中。

singleTop —— 如果栈顶有该activity实例就重用该实例,如果没有就创建一个activity实例放入栈中。

singleTask —— 如果栈中有该activity实例就重用该实例,并且将该activity之上的其他activity实例弹出栈。

singleInstance —— 在新栈中创建一个新的activity实例,并且让多个应用共享该activity实例。一旦该activity实例已经存在,任何应用再次激活该activity都会重用该栈中的实例。

 

3.activity视图结构

//结构视图

//源码实例图

参考:

http://blog.csdn.net/mr_liabill/article/details/49534851

http://blog.csdn.net/luoshengyang/article/details/8245546

 

4.activity属性设置

  • android:alwaysRetainTaskState

            应用场景:打开QQ进入聊天界面,按HOME键返回桌面;

            要     求 :在最近任务中切换回QQ和点击桌面QQ图标切换回QQ都要返回到之前聊天界面状态

            实     现 :只需要在入口Activity的标签中添加android:alwaysRetainTaskState="true"属性。

  • android:configChanges        
VALUE                         DESCRIPTION                                                                                                                                                                                      
"mcc" 国际移动用户识别码所属国家代号是改变了-----  sim被侦测到了,去更新mcc    mcc是移动用户所属国家代号
"mnc" 国际移动用户识别码的移动网号码是改变了------ sim被侦测到了,去更新mnc    MNC是移动网号码,最多由两位数字组成,用于识别移动用户所归属的移动通信网
"locale" 地址改变了-----用户选择了一个新的语言会显示出来
"touchscreen" 触摸屏是改变了------通常是不会发生的
"keyboard" 键盘发生了改变----例如用户用了外部的键盘
"keyboardHidden" 键盘的可用性发生了改变
"navigation" 导航发生了变化-----通常也不会发生
"screenLayout" 屏幕的显示发生了变化------不同的显示被激活
"fontScale" 字体比例发生了变化----选择了不同的全局字体
"uiMode" 用户的模式发生了变化
"orientation" 屏幕方向改变了
"screenSize" 屏幕大小改变了
"smallestScreenSize" 屏幕的物理大小改变了,如:连接到一个外部的屏幕上

 在activity中添加了android:configChanges属性,目的是当所指上述属性(Configuration Changes)发生改变时,通知程序调用onConfigChanged方法。

常见用法:

1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。

2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法

 Android3.2(API 13)以后,在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样 会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation", 你还必须设置"ScreenSize"。

解决方法:

AndroidManifest.xml中设置android:configChanges="orientation|screenSize“

 

  • android:exported

            是否允许activity被其他应用调用。

  • android:excludeFromRecents

            是否允许activity显示在最近打开的列表中

  • android:screenOrientation

            限制横屏或竖屏

  • android:windowSoftInputMode

            1.当activity获取焦点时,软件盘是隐藏还是显示。

            2.当activity活动的控件被软件盘遮挡时,是否腾出空间让活动控件是可见的。

  • android:taskAffinity

            activity的亲属关系, 默认情况同一个应用程序下的activity有相同的关系。

  • android:enabled

            是否允许activity被实例化。

  • android:launchMode

            启动模式。

 

二 Service相关

参考官网:https://developer.android.google.cn/reference/android/app/Service.html

参考博客:http://www.cnblogs.com/linlf03/p/3296323.html

1.Service生命周期

这里要注意service两种启动方式:startService()和bindService()生命周期对比:

  

1)被start启动的服务的生命周期:如果一个Service被某个Activity 调用 Context.startService 方法启动,那么不管是否有Activity使用bindService绑定或unbindService解除绑定到该Service,该Service都在后台运行。如果一个Service被startService 方法多次启动,那么onCreate方法只会调用一次,onStart将会被调用多次(对应调用startService的次数),并且系统只会创建Service的一个实例(因此你应该知道只需要一次stopService调用)。该Service将会一直在后台运行,而不管对应程序的Activity是否在运行,直到被调用stopService,或自身的stopSelf方法。当然如果系统资源不足,android系统也可能结束服务。

2). 被bind绑定的服务的生命周期:如果一个Service被某个Activity 调用 Context.bindService 方法绑定启动,不管调用 bindService 调用几次,onCreate方法都只会调用一次,同时onStart方法始终不会被调用。当连接建立之后,Service将会一直运行,除非调用Context.unbindService 断开连接或者之前调用bindService 的 Context 不存在了(如Activity被finish的时候),系统将会自动停止Service,对应onDestroy将被调用。

3). 被start启动又被bind绑定的服务的生命周期:如果一个Service又被启动又被绑定,则该Service将会一直在后台运行。并且不管如何调用,onCreate始终只会调用一次,对应startService调用多少次,Service的onStart便会调用多少次。调用unbindService将不会停止Service,而必须调用 stopService 或 Service的 stopSelf 来停止服务。

4). 当服务被停止时清除服务:当一个Service被终止(1、调用stopService;2、调用stopSelf;3、不再有绑定的连接(没有被启动))时,onDestroy方法将会被调用,在这里你应当做一些清除工作,如停止在Service中创建并运行的线程。

2.本地服务(LocalService)

本地服务依附在主进程上,所以不需要IPC和AIDL和主进程通信,

3.远程服务(RemoteService)

    远程服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。该服务是独立的进程,会占用一定资源。

4.启动方式

1、startService 启动的服务:主要用于启动一个服务执行后台任务,不进行通信。停止服务使用stopService;

2、bindService 启动的服务:该方法启动的服务可以进行通信。停止服务使用unbindService;

3、startService 同时也 bindService 启动的服务:停止服务应同时使用stopService与unbindService;

 

三 BroadcastReceiver相关

1.注册方式

静态注册和动态注册

2.广播类型

  • 普通广播:sendBroadcast
  • 有序广播:sendOrderBroadcast
  • 异步广播:已废弃

 

四 ContentProvider相关

http://blog.csdn.net/yhaolpz/article/details/51304345

 

五 View绘制

绘制分三个阶段:

  • measure:判断是否需要重新计算View的大小,需要的话则计算;
  • layout:判断是否需要重新计算View的位置,需要的话则计算;
  • draw: 判断是否需要重新绘制View,需要的话则重绘制。

 

六 View事件机制

参考:Touch事件机制

参考:http://www.cnblogs.com/duoduohuakai/p/3996385.html

1.主要方法

publicbooleandispatchTouchEvent(MotionEventev); //用来分派eventpublicbooleanonInterceptTouchEvent(MotionEventev);//用来拦截eventpublicbooleanonTouchEvent(MotionEventev);//用来处理event

2.下发机制理解  

    其中Activity和View控件(TextView)拥有分派和处理事件方法,View容器(LinearLayout)具有分派,拦截,处理事件方法。这里也有个比喻:领导都会把任务向下分派,一旦下面的人把事情做不好,就不会再把后续的任务交给下面的人来做了,只能自己亲自做,如果自己也做不了,就只能告诉上级不能完成任务,上级又会重复他的过程。另外,领导都有权利拦截任务,对下级隐瞒该任务,而直接自己去做,如果做不成,也只能向上级报告不能完成任务。

3.onTouch,onTouchEvent,onClick

dispatchTouchEvent——>onTouch——>onTouchEvent——>onClick

返回true即消费事件,不再下发时间;如果返回false,继续下发。

 

七 Android中的几种动画

  Android中有几种动画,Android3.0之前有2种,3.0后有3种。

  FrameAnimation(逐帧动画):将多张图片组合起来进行播放,类似于早期电影的工作原理,很多App的loading是采用这种方式。

  TweenAnimation(补间动画):是对某个View进行一系列的动画的操作,包括淡入淡出(Alpha),缩放(Scale),平移(Translate),旋转(Rotate)四种模式。

  PropertyAnimation(属性动画):属性动画不再仅仅是一种视觉效果了,而是一种不断地对值进行操作的机制,并将值赋到指定对象的指定属性上,可以是任意对象的任意属性。

  http://blog.csdn.net/yanbober/article/details/46481171

 

八 Handler的原理

参见:https://my.oschina.net/kun123/blog/875362

 

九 IPC机制

参考:http://blog.csdn.net/u012760183/article/details/51397014

参考:http://www.androidchina.net/4506.html

IPC (Interprocess communication)跨进程通信,是指在两个进程之间交换数据的过程。多进程通信一般分为两种情况。第一种,一个应用因为自身的需要采用多进程实现,比如某些模块由于特殊原因需要运行在单独的进程中。第二种情况,当前应用需要获得其它应用的数据,由于是两个应用,所以必须采用跨进程的方式。常见方式如下:

1.bundle :
简单易用  但是只能传输Bundle支持的对象 常用于四大组件间进程间通信 
2.文件共享:
简单易用  但不适合在高并发的情况下 并且读取文件需要时间 不能即时通信   常用于并发程度不高 并且实时性要求不高的情况
3.AIDL :
功能强大 支持一对多并发通信 支持即时通信   但是使用起来比其他的复杂 需要处理好多线程的同步问题  常用于一对多通信 且有RPC 需求的场合(服务端和客户端通信)
4.Messenger :
功能一般 支持一对多串行通信 支持实时通信  但是不能很好处理高并发情况 只能传输Bundle支持的类型  常用于低并发的无RPC需求一对多的场合 
5.ContentProvider :
在数据源访问方面功能强大 支持一对多并发操作 可扩展call方法  可以理解为约束版的AIDL  提供CRUD操作和自定义函数  常用于一对多的数据共享场合
6.Socket :
功能强大 可以通过网络传输字节流 支持一对多并发操作  但是实现起来比较麻烦 不支持直接的RPC   常用于网络数据交换
 

十 Android序列化

参考:http://www.jianshu.com/p/fcc59fb523b6

参考:http://wiki.jikexueyuan.com/project/java/serialization.html

序列化是指的语言范畴将一个实例对象编码成字节流,并从字节流编码中重新构建对象实例的能力。将一个对象编码成字节流,称为序列化;从一个字节流中读出一个对象实例,称为反序列化。

 

十一 AIDL理解

参考:一个应用中的AIDL通信

参考:应用间的AIDL通信

十二 热修复的原理

  1:JavaSisst

  2:AspectJ

  3:Xposef

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

  http://www.cnblogs.com/zyw-205520/p/4997863.html

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

十四 Android内存泄露及管理

参见:https://my.oschina.net/kun123/blog/875345

十五 Activity与Fragment通信

  http://gold.xitu.io/entry/56a87b2b2e958a0051906227

十六 Fragment的那些坑

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

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

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

十七 Android UI适配

 参见:https://my.oschina.net/kun123/blog/875472

十八 布局优化

  http://www.jianshu.com/p/145fc61011cd

十九 android https

    http://www.cnblogs.com/zery/p/5164795.html

二十 网络请求优化

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

二十一 数据库优化

  http://www.jianshu.com/p/3b4452fc1bbd

二十二 图片优化

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

二十三 HybridJAVA 与JS交互

参见:http://www.cnblogs.com/dailc/p/5930231.html

二十四 单例

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

二十五 Java GC原理

  http://www.jianshu.com/p/d75a32ac5bed?

二十六 ANR

参考:http://www.jianshu.com/p/124f3b75e164

ANR:Application Not Responding。在Android中,活动管理器和窗口管理器这两个系统服务负责监视应用程序的响应,当用户操作的在5s内应用程序没能做出反应,BroadcastReceiver在10秒内没有执行完毕,就会出现应用程序无响应对话框,这既是ANR。

避免方法:Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者异步方式)来完成。主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。

二十七 Volley

  http://www.jianshu.com/p/9e17727f31a1

二十八 设计模式

  http://gold.xitu.io/entry/56ebb4ad5bbb50004c440972

二十九 RxJava

  http://gank.io/post/560e15be2dca930e00da1083?from=timeline&isappinstalled=0#toc_1

  原文链接:http://www.jianshu.com/p/a22450882af2

三十 Retrofit

三十一 DataBinding

三十二 单元测试

三十三 代码混淆

三十四 性能优化

http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0120/2336.html

© 著作权归作者所有

席道坤
粉丝 14
博文 231
码字总数 186433
作品 0
徐汇
程序员
私信 提问
Android开发工程师面试指南(面试题集附答案、简历模板)

给Android开发工程师的一份面试指南,包含面试题集与简历模板。 面试题集 面试题集里的答案大部分来源于我的博客,因此这个题集也相当于是我的博客的精华版,希望对需要面试的Android同学有所...

郭孝星
2018/04/08
0
0
BAT等大厂Android面试书单和知识点清单

java是Android开发的基础,在BAT的初面中,会涉及到比较多的java基础知识,所以比较重要,下面我介绍的书籍内容是由浅到深。 1.Thinking in java:这本书被称为Java的三大圣经之一,虽然书比...

android自学
2018/07/25
0
0
金三银四背后,一个 Android 程序员的面试心得

回顾一下自己这段时间的经历,九月份的时候,公司通知了裁员,我匆匆忙忙地出去面了几家,但最终都没有拿到offer,我感觉今年的寒冬有点冷。到十二月份,公司开始第二波裁员,我决定主动拿赔...

终端研发部
03/19
42
0
Android--面试中遇到的问题总结(三)

《Android 开发工程师面试指南 LearningNotes 》,作者是陶程,由梁观全贡献部分。大家可以去知乎关注这两位用心的少年。这份指南包含了大部分Android开发的基础、进阶知识,不仅可以帮助准备...

sealin
2017/02/22
0
0
工科转CS | Amazon,华为,阿里菜鸟 会把offer给怎样的求职者?

专栏 | 九章算法 网址 | www.jiuzhang.com 学员背景 北美 Top50 非 CS 相关工科专业在职半年,裸辞刷题三个月 拿到 offer:Amazon,华为,阿里菜鸟,美东一个做手机 APP的小公司。 签约 offe...

九章算法
2018/11/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0
【技术分享】TestFlight测试的流程文档

上架基本需求资料 1、苹果开发者账号(如还没账号先申请-苹果开发者账号申请教程) 2、开发好的APP 通过本篇教程,可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestF...

qtb999
昨天
10
0
再见 Spring Boot 1.X,Spring Boot 2.X 走向舞台中心

2019年8月6日,Spring 官方在其博客宣布,Spring Boot 1.x 停止维护,Spring Boot 1.x 生命周期正式结束。 其实早在2018年7月30号,Spring 官方就已经在博客进行过预告,Spring Boot 1.X 将维...

Java技术剑
昨天
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部