Android面试相关精选

前言

借此空闲时间整理下部分面试相关的题目答案当做笔记记录下,同时分享给各位同学学习。答案结合各大相关书籍网络知识汇总总结,如有欠缺缺漏的地方还请见谅。乌拉~!


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.装饰器模式、代理模式有什么区别?
  • 代理模式也叫委托模式,是结构型设计模式。为其他对象提供一种代理以控制对这个对象的访问。当一个对象不能或者不想直接访问另一个对象时,可以通过一个代理对象来间接访问
    被访问的对象不想暴露全部内容时,可以通过代理去掉不想被访问的内容

  • 代理模式: 注重对对象某一功能的流程把控和辅助。它可以控制对象做某些事,重心是为了借用对象的功能完成某一流程,而非对象功能如何

  • 装饰模式: 注重对对象功能的扩展,它不关心外界如何调用,只注重对对象功能的加强,装饰后还是对象本身

  • 装饰器模式: 能动态的新增或组合对象的行为

  • 代理模式: 为其他对象提供一种代理以控制对这个对象的访问

  • 代理模式:
    代理模式中的原类和代理类继承同一父类;
    原类对象与代理类对象接口相同,功能一致;
    起到了隐藏原类的作用

  • 装饰者模式:
    以对 客户端透明(客户端需要指明装饰的是哪个类)的方式 扩展对象的功能,是继承关系的一个替代方案

你可能感兴趣的:(Android面试相关精选)