前言
借此空闲时间整理下部分面试相关的题目答案当做笔记记录下,同时分享给各位同学学习。答案结合各大相关书籍网络知识汇总总结,如有欠缺缺漏的地方还请见谅。乌拉~!
1.Activity生命周期
onCreate()、onStart()、onResume()、onPause()、onStop()、onRestart()、onDestroy()
2.Android四大组件
Activity、Service、BroadcastReceiver、ContentProvider
3.五种常用布局
ConstraintLayout(约束)、LinearLayout(线性)、RelativeLayout(相对)、FrameLayout(帧布局)、GridLayout(网格)
4.Activity四种启动模式、解释含义、生命周期的影响
Standard(标准模式)、SingleTop(栈顶复用模式)、SingleTask(栈内复用模式) 、SingleInstance(单实例模式)
- Standard: 每次启动一个Activity都会又一次创建一个新的实例入栈,无论这个实例是否存在。
生命周期: onCreate、onStart、onResume都会被调用 - SingleTop: Activity处于栈顶时,会直接复用栈顶的Activity,不会再创建新的Activity;若须要创建的Activity不处于栈顶,此时会又一次创建一个新的Activity入栈,同Standard。
生命周期: 栈顶被直接复用时,onCreate、onStart不会执行,因为它并没有发生改变。但是一个新的方法 onNewIntent会被回调(正常创建Activity时不会回调此方法)。 - SingleTask: Activity已经处于栈中时,不会创建新的Activity,而是将存在栈中的Activity上面的其他Activity所有销毁,移除出栈,使它成为栈顶。
生命周期: 同SingleTop 模式 - SingleInstance: 全局单例模式,加强的SingleTask。具有此模式的Activity仅仅能单独位于一个任务栈中,只要启动过就不再启动。
生命周期: 触发后onNewIntent()、onRestart()、onStart()、onResume()
(举例SingleTask的一个运用: 用户在主界面跳转到其他页面,运行多次操作后想返回到主页)
5.Service启动方式、区别及其生命周期
- startService: onCreate()--->onStartCommand() --->onDestroy()
- bindService: onCreate()--->onBind() --->onUnbind()--->onDestroy()
区别: - startService是调用service的 onCreate方法
bindService是调用service的 onBind方法 - startService多次只触发一次onCreate回调,但是会触发了多次onStartCommand回调
bindService会自动去查找该服务是否启动,如果没有会走startService的启动逻辑 - startService启动的service需要stopService或者stopSelf进行停止
bindService启动的service需要通过unBindService才能停止
如果先调用startService再调用bindService需要先stopService或者stopSelf再unBindService才能停止
6.说一下onStartCommand()函数返回的几种状态
START_NOT_STICKY、START_STICKY、START_REDELIVER_INTENT
7.BroadcastReceiver它的使用方式、类型和机制
广播的方式为静态(常驻)和动态(非常驻),sendBroadcast()、sendOrderedBroadcast()、sendStickyBroadcast();类型分为本地和全局广播;机制分为 有序和无序
(一般不会问得这么浅显易懂,还需要自己理解问题)
8.解释下无序和有序
- 无序广播: 所有的接收者都会接收事件,不可以被拦截,不可以被修改
- 有序广播: 按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件
9.什么是ContentProvider和ContentResolver
- ContentProvider: 四大组件之一,主要用于不同的应用程序之间实现数据共享功能
- ContentResolver: 是数据调用者,ContentProvider将数据发布出来,通过ContentResolver对象结合Uri进行调用,通过ContentResolver对象可以调用ContentProvider的增删改查
10.Android的数据存储方式有哪些
- SharedPreferences
- 文件存储
- SQLite数据库
- ContentProvider
- 网络存储
11.什么是AIDL
全称Android Interface Definition Language(接口定义语言),是用于定义服务器和客户端通信接口的一种描述语言,用来实现进程间通信。一般分为服务和客户两端,调用AILD函数的应用称为客户端,提供AIDL函数的为服务端,客户端通过绑定服务端的Service来进行交互
12.自定义View绘制流程
onMeasure()(测量)、onLayout()(位置)、onDraw()(绘制)
13.自定义view步骤
- 自定义View属性(attrs)
- 构造方法中获得自定义的属性
- 重写onMesure
- 重写onDraw
14.LinearLayout和RelativeLayout哪个绘制性能好一点
两种使用都可以,非要说的有区别,那就是weight权重上有区分,linearlayout设置权重后会重绘多次(好像是两次吧,应该在源码800行左右开始)
15.什么是ANR
全称Application Not Responding。5s内无法响应用户输入事件(例如键盘输入, 触摸屏幕等),主线程阻塞,超过相应阀值则会触发ANR异常。不要在主线程(UI线程)里面做繁重的操作
16.什么是OOM
俗称内存溢出,内存占有量超过了VM所分配的最大值,虚拟机无法满足。Android系统的APP每个进程或者虚拟机有最大内存限制,一旦超过这个限制系统就会抛出OOM错误
17.那如何避免OOM
- 动态回收内存,不用的对象设置为null,对象引用使用软引用,如Handler
- 优化Dalvik虚拟机的堆内存分配
- 自定义堆内存大小
- 避免使用Enum(枚举)
- 使用软引用的图片资源,并且适当压缩大小,如边界压缩
- 使用更小的图片,减少Bitmap对象的内存占用,不用的图片直接recycle
- 使用更加轻量的数据结构(SparseArray)
18.内存泄露与内存溢出的区别
- 内存溢出: Android系统会给每个APP分配内存,默认16M内存,每个厂商的默认值不一样,内存占有量超过了系统分配的内存,就会造成内存溢出
- 内存泄露: 对象回收不及时,当一个对象不再使用了,本应该被GC回收,但是这个对象由于被其他正在使用的对象所持有,造成无法被回收,导致一部分内存一直被占有(长时间持有)。
- 两者关联: 内存泄露过多会导致内存溢出
19.简要说明HashMap原理
底层基于数组和链表,Hash表的Map实现, Hash表就是Hash数组,Map实现是指实现了Map接口。主要是通过key的hashCode来计算hash值的。
(只要hashCode相同,计算出来的hash值就一样 (面试的时候这句话可以不要说,但是要知道。因为这可能会有个hash冲突的提问,切记言多必失) )
20.概括下HashMap与HashTable的区别
- Hashtable是线程安全,HashMap是非线程安全,HashMap的性能会高于Hashtable
- HashMap可以使用null作为key,不过建议还是尽量避免这样使用。HashMap以null作为key- 时,总是存储在table数组的第一个节点上。而Hashtable则不允许null作为key
- HashMap继承了AbstractMap,HashTable继承Dictionary抽象类,两者均实现Map接口
- HashMap的初始容量为16,Hashtable初始容量为11,两者的填充因子默认都是0.75
- HashMap扩容时是当前容量翻倍即:2n,Hashtable扩容时是容量翻倍+1即:2n+1
- HashMap和Hashtable的底层实现都是数组+链表结构实现
两者计算hash的方法不同: - HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取摸
- Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模
(这里建议以上7条必须全部背过,不用一字不差,至少了解大概)
21.概括说明下TreeMap
- TreeMap继承于AbstractMap,实现NavigableMap>>SortMap接口, 是一个有序的key-value集合,其底层数据结构为红黑树,基于红黑树实现
- TreeMap支持克隆
- TreeMap支持序列化
- TreeMap取出来的是排序后的键值对。
- TreeMap是非同步的
- Iterator 方法返回的迭代器是fail-fastl的(不允许在遍历的过程中对容器中的数据进行修改)
- 使用默认排序或者根据提供的 Comparator 进行排序,具体取决于使用的构造方法
22.Android有哪几种多线程方式
- Activity.runOnUiThread(Runnable)
- View.post(Runnable) ;
View.postDelay(Runnable , long) - Handler
- AsyncTask
23.在OnCreate中开启一个Thread更新UI会怎样
不会崩溃,正常更新显示。因为这个阶段ViewRootImpl还没生成,不会检查是否在主线程。
24.简要说下你对Handler的理解
- 一个消息传递机制,在android里负责发送和处理消息
- Looper负责管理线程的消息队列和消息循环
- Message是线程间通讯的消息载体
- MessageQueue是消息队列,先进先出,保存有待线程处理的消息
- 它的目的就是将工作线程中需更新UI的操作信息 传递到 UI主线程,保证线程安全。
一般在在子线程中需要刷新UI时使用Handler
25.SharedPreferences中的commit与apply区别
- commit()方法有返回值,apply()方法没有
- commit()方法是同步执行,apply()方法是异步执行
- commit是同步的提交到硬件磁盘,apply提交到内存, 而后异步才提交到硬件磁盘
26.Get与Post区别
- Get是从服务器上获取数据,Post是向服务器传送数据
- Get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一 一对应,在URL中可以看到。Post是通过HTTP Post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
- Get传送的数据量较小,不能大于2KB。Post传送的数据量较大,一般被默认为不受限制
- Get安全性非常低,Post安全性较高。但是执行效率却比Post方法好
27.MVP的理解
- MVP 全称是Model - View - Presenter ,是模型(model)-视图(view)-协调器(presenter)的缩写。
- Moder:业务逻辑和数据处理(数据库存储,网络请求,耗时操作)
- View : 负责View的绘制以及与用户交互,处理用户事件和视图部分的展示
- Presenter:负责完成View于Model间的交互,View和Modelde的桥梁
业务逻辑抽离到Presenter层,View层专注于UI的处理 - 分离视图逻辑与业务逻辑,达到解耦的目。
- 提高代码的阅读性
- Presenter被抽象成接口,可以根据Presenter的实现方式进行单元测试
- 可拓展性强
- MVP中Model和View之间的没有任何联系,是两个完全独立的模块,当Model模型发生数据改变时,通过Presenter通知View视图发生相应的UI改变
28.Fragment生命周期
onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()、onPause()、onStop()、onDestroyView()、onDestroy()、onDetach()
29.Activity和Fragment之间如何通信?
事务传递、接口传递、通过getActivity()方法来获得Activity的实例,可以调用一些例如findViewById()之类的方法。
30.Fragment和FragmentActivity之间的区别?
- FragmentActivity 继承自Activity,用来解决Android 3.0之前无法使用Fragment的问题,使用时需要导入v4包,同时继承 FragmentActivity
- Android 3.0之后直接继承自Activity,并且在其中嵌入使用Fragment。
- 获得FragmentManager的方式也不同
Android 3.0以下:getSupportFragmentManager()
Android 3.0以上:getFragmentManager()
31.事件分发
事件分发顺序: Activity(Window) -> ViewGroup -> View
主要方法dispatchTouchEvent() 、onInterceptTouchEvent()和onTouchEvent()
super:调用父类方法
true:消费事件,即事件不继续往下传递
false:不消费事件,事件继续往下传递 / 交由给父控件onTouchEvent()处理
32.ScrollView嵌套ListView产生的问题
ListView高度显示问题,只显示一个item,解决办法是ListView重写onMeasure()方法,设置属性为AT_MOST,同时ScrollView在xml中增加属性
android:focusable="true"
android:focusableInTouchMode="true"
滑动冲突问题,达成效果焦点在ListView时滑动ListView,焦点在ScrollView时滑动ScrollView
设置ListView OnTouchListener监听
listView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View arg0, MotionEvent arg1) {
scrollView.requestDisallowInterceptTouchEvent(true);
return false;
}});
33.装饰器模式、代理模式有什么区别?
-
代理模式也叫委托模式,是结构型设计模式。为其他对象提供一种代理以控制对这个对象的访问。当一个对象不能或者不想直接访问另一个对象时,可以通过一个代理对象来间接访问
被访问的对象不想暴露全部内容时,可以通过代理去掉不想被访问的内容 -
代理模式: 注重对对象某一功能的流程把控和辅助。它可以控制对象做某些事,重心是为了借用对象的功能完成某一流程,而非对象功能如何
-
装饰模式: 注重对对象功能的扩展,它不关心外界如何调用,只注重对对象功能的加强,装饰后还是对象本身
-
装饰器模式: 能动态的新增或组合对象的行为
-
代理模式: 为其他对象提供一种代理以控制对这个对象的访问
-
代理模式:
代理模式中的原类和代理类继承同一父类;
原类对象与代理类对象接口相同,功能一致;
起到了隐藏原类的作用 -
装饰者模式:
以对 客户端透明(客户端需要指明装饰的是哪个类)的方式 扩展对象的功能,是继承关系的一个替代方案
网友评论