Android面试复习汇总

Activity与Fragment之间生命周期比较

  • http://blog.csdn.net/chun0801/article/details/51956847
  • Activity于Fragment的生命周期的不同主要表现在onCreate和onDestroy两个生命周期方法中:
    1. 在Activity的onCreate方法回调时,在回调期间,Fragment首先会执行
      onAttach()-->onCreate()-->onCreateView()-->onActivityCreated()
    2. 在Activity的onDestroy()回调时,在回调期间,Fragment首先会执行onDestroyView()-->onDestroy()-->onDetach()

Arraylist 与 Linkedlist 异同?

  • http://www.cnblogs.com/janneystory/p/5758958.html
  • Arraylist与LinkedList的差异主要是因为实现的不同导致的性能差异以及不同的适用场景:
    1. Arraylist是基于动态数组实现,Linkedlist基于链表实现。
    2. 由于Arraylist是基于数组,得益于数组的随机高效访问,也同样具备随机访问的良好表现,适用于对List数据集的访问次数远大于存储和删除数据次数。而Linkedlist由于是链表,需要指针的移动,导致访问速度不如ArrayList,适用于存储数据的次数远大于读取数据的场景。
    3. 也同样受限于数组,Arraylist的数据存储和删除会涉及到数组的移动,会付出相对大的代价,导致性能下降。而Linkedlist由于是基于链表实现的双向链表,更新或者删除数据只需要更新附近的节点即可,不涉及数据的移动,所以性能要高于Arraylist。

MVP模式

  • http://blog.csdn.net/lmj623565791/article/details/46596109
  • MVP模式是一种代码的结构,是从MVC模式上面发展而来,用于在项目代码繁多,结构臃肿的情况下对代码的划分,MVC是传统的编程方式,其中Model、Controler和View之间呈三角形方式相互调用,界限模糊,几乎所有的代码都集中于Activity,需要测试的时候无从下手,扩展业务的时候没办法很快定位到功能代码,此时MVP应运而生,Model不再与View层有相互调用关系,全部以接口形式调用,由Presenter集中控制,使得代码结构清晰,测试时只需要重写为View定义的接口的测试实现类代替实际View传入Presenter进行测试即可,维护性和扩展性得到很大提升,测试也更方便,就是接口会增加很多,在大的项目中这是值得的!

App启动崩溃异常捕捉

  • http://www.jianshu.com/p/fb28a5322d8a
  • App启动崩溃异常捕捉:
    即捕捉非受检异常(UnCheckException),也就是由于程序的错误造成的错误,无法挽回,只能关闭程序。是在程序发布后,用户手机上产生的崩溃异常需要传回开发者手中以便解决的一种手段:
    1. 需要创建Thread.UncaughtExceptionHandler接口的实现类
    2. 调用Thread.getDefaultUncaughtExceptionHandler()获取系统的实现类实例保存,以备我们自定义的处理方法没有成功处理异常时再执行系统的处理逻辑
    3. 调用Thread.setDefaultUncaughtExceptionHandler(this)方法使用自定义的接口实现类代替系统实现
    4. 重写uncaughtException方法,拿到Throwable后实现自己的逻辑,譬如保存到硬盘,上传到服务器回馈给开发者
    5. System.exit(0)杀死进程(0表示正常结束,1表示异常关闭)

JVM 内存区域 开线程影响哪块内存

  • http://www.cnblogs.com/wangjzh/p/5258254.html
  • 堆:用于存储动态生成的对象和数组,其中对象的引用指针存放在虚拟机栈中,提供给线程引用,在线程执行完毕,虚拟机栈被回收,只是对堆中相应对象的引用没了,对象并不会被回收,只有在此对象不再有另外的引用时,并且在gc扫描到的时候才会被回收,这也是内存泄漏发生的地方
  • 方法区:用于存储静态变量、常量和(JIT)即时编译产生的字节码,其中常量位于方法区内部的一个常量池,动态产生的常量也会放入常量池,例如String的intern方法
  • 虚拟机栈:也称为方法栈,用于存储在方法运行期间产生的局部变量,包括方法的操作码,也就是方法的索引
  • 本地方法栈:和虚拟机栈唯一不同的是,它针对的是native方法
  • 程序计数器:这是一块较小的内存区域,是对当前线程字节码执行的位置指示器,分支、跳转、异常处理、循环和线程恢复等基础功能都需要依赖于程序计数器
  • JVM内存区域分为线程共享区和非线程共享区:
    1. 线程共享区:堆、方法区
    2. 非线程共享区:虚拟机栈、本地方法栈、程序计数器
  • 线程共享区是属于JVM所拥有,每一个程序有一个JVM,而每一个JVM有一份线程共享区,存在于整个程序运行期间
  • 非线程共享区是属于每一条线程拥有,存在周期就是线程的运行周期,线程执行完毕就会被回收
  • 所以开线程会影响到线程共享区,因为需要对线程需要的资源进行加载

如何保持应用的稳定性

  • 所谓应用稳定性,也就是防止应用在使用过程中尽量少出现闪退、卡顿、流畅,尽量避免内存泄漏和内存溢出。要预防这一类问题,要从编写代码的时候就开始注意,主要分为以下几点:
  1. 四大组件方面:
    • Activity:响应时间限制是5s,表现在不可以在主线程执行耗时操作,可以考虑使用开启子线程
    • Broadcast:响应时间限制是10s,原因是onReceiver方法执行在主线程中,其中操作过于耗时,可以考虑开启Service,然后在Service中开启子线程执行
    • Service:响应时间限制是20s,原因是Service默认运行在主线程中,需要开子线程执行操作
  2. 内存方面:
    • OOM:当前申请的内存已经超过了虚拟机的可用内存
    • 内存泄漏:分配出去的内存不再使用,却无法回收重复利用。解决方法主要是对每个对象的生命周期达到完美的控制
      1. 图片方面:图片压缩,先加载缩略图,在滑动时不加载图片
      2. 内部类设置为静态内部类,对外部类的引用使用弱引用,静态变量的生命周期过长
      3. 在Activity的OnDestroy方法中做一些资源的回收操作
    • 内存抖动:程序短时间内创建大量对象,然后回收的现
      1. 一般出现在onDraw方法中,由于view的绘制可能会调用此方法多次,如果在此方法中创建对象,可能就出现短时间内大量对象被创建的现象,之后gc就会运行,回收对象,也就是内存抖动现象
  3. UI方面:UI的绘制帧数保持在60fps为最佳,这要求每帧的绘制时间不超过1000/60ms,也就是16ms左右一定要完成界面渲染,否则就会出现卡顿
    • 卡顿原因:
      1. UI线程,即主线程中执行了耗时操作
      2. 布局过于复杂
      3. 动画的执行次数过多
      4. view重复的调用measure、layout方法
    • 解决方案:
      1. 使用include、viewstub、merge等标签减少布局层级
      2. 布局太复杂考虑使用自定义View
      3. 使用RecyclerView
      4. 不要频繁绘制View
      5. 使用多线程执行耗时操作
  • 总结:对于网络上的资源,如图片、json数据,可以考虑使用缓存技术,懒加载技术,先显示出效果给用户,之后获取到数据再刷新,提供最好的体验;至于布局的层级的精简可以使用一些优化工具,编码可能导致的内存泄漏可以使用静态扫描工具如Findbugs等,编码的规则参考阿里规约。

okhttp源码?

设计模式相关(例如Android中哪里使用了观察者模式,单例模式相关)

抽象类和接口的区别

判断环(猜测应该是链表环)

OOM,内存泄漏

触摸事件的分发?

AIDL机制

Android相关优化(如内存优化、网络优化、布局优化、电量优化、业务优化)

合并多个单有序链表(假设都是递增的)

集合

序列化的作用,以及 Android 两种序列化的区别。

OOM的可能原因?

前台切换到后台,然后再回到前台,Activity生命周期回调方法。弹出Dialog,生命值周期回调方法。

wait/notify

多线程断点续传原理

Activity 上有 Dialog 的时候按 home 键时的生命周期

统计启动时长,标准

ThreadLocal 原理

JVM内存模型,内存区域

是否熟悉Android jni开发,jni如何调用java层代码

bitmap recycler 相关

GC回收策略

进程和 Application 的生命周期;

Application 和 Activity 的 context 对象的区别

ViewPager使用细节,如何设置成每次只初始化当前的Fragment,其他的不初始化

view渲染

concurrenthashmap

android 事件传递机制

ListView重用的是什么

hashmap数据结构?

手写生产者/消费者模式

横竖屏切换的时候,Activity 各种情况下的生命周期

为什么不能在子线程更新UI

Glide 内存缓存如何控制大小?

集合 Set实现 Hash 怎么防止碰撞

List,Set,Map的区别

synchronized与Lock

简述IPC?

HashMap实现原理,ConcurrentHashMap 的实现原理

ANR怎么分析解决

object类的equal 和hashcode 方法重写,为什么?

四大组件

图片加载原理

Binder机制介绍

activity栈

static synchronized 方法的多线程访问和作用,同一个类里面两个synchronized方法,两个线程同时访问的问题

类加载机制

动态权限适配方案,权限组的概念

Java中同步使用的关键字,死锁

图片加载库相关,bitmap如何处理大图,如一张30M的大图,如何预防OOM

性能优化如何分析systrace?

Activity与Service通信的方式

视频加密传输

NIO

用到的一些开源框架,介绍一个看过源码的,内部实现过程。

有没有尝试简化Parcelable的使用

volatile的原理

上一问扩展,海量数据,内存中放不下,怎么求出。

消息机制实现

微信主页面的实现方式

垃圾回收机制与调用System.gc()区别

volatile

广播的使用方式,场景

死锁的概念,怎么避免死锁

ANR的原因

List 和 Map 的实现方式以及存储方式。

二叉树 深度遍历与广度遍历

简述消息机制相关

网络请求缓存处理,okhttp如何处理网络缓存的

事件传递机制的介绍

service生命周期

内存泄露如何产生?

Binder相关?

TCP/UDP的区别

Activity生命周期

逻辑地址与物理地址,为什么使用逻辑地址

ActicityThread相关?

线程间 操作 List

广播的使用场景
百度

MVP

Activity的启动模式

消息机制

一个无序,不重复数组,输出N个元素,使得N个元素的和相加为M,给出时间复杂度、空间复杂度。手写算法

线程和进程的区别?

广播的分类?

如何保证线程安全?

常用数据结构简介

singleTask启动模式

进程调度

链表反转

开启线程的三种方式,run()和start()方法区别

hashmap如何put数据(从hashmap源码角度讲解)?

string to integer

handler实现机制(很多细节需要关注:如线程如何建立和退出消息循环等等)

Android中开启摄像头的主要步骤

对 Dalvik、ART 虚拟机有基本的了解;

Java设计模式,观察者模式

synchronized与ReentrantLock

进程保活

双亲委派模型

数据库数据迁移问题

进程间通信的机制

Java中对象的生命周期

关于handler,在任何地方new handler 都是什么线程下

堆排序过程,时间复杂度,空间复杂度

TreeMap具体实现

适配器模式,装饰者模式,外观模式的异同?

fragment之间传递数据的方式?

Https请求慢的解决办法,DNS,携带数据,直接访问IP

简述tcp四次挥手?

HashMap源码,SpareArray原理

glide 使用什么缓存?

ReentrantLock的内部实现

谈谈classloader

String buffer 与string builder 的区别?

强引用置为null,会不会被回收?

内部类和静态内部类和匿名内部类,以及项目中的应用

数据结构中堆的概念,堆排序

差值器&估值器

Bitmap 使用时候注意什么?

算法判断单链表成环与否?

RxJava

两个不重复的数组集合中,求共同的元素。

RecycleView的使用,原理,RecycleView优化

AlertDialog,popupWindow,Activity区别

LinearLayout、RelativeLayout、FrameLayout的特性、使用场景

sqlite升级,增加字段的语句

微信上消息小红点的原理

怎么去除重复代码

threadlocal原理

TCP与UDP区别与应用(三次握手和四次挥手)涉及到部分细节(如client如何确定自己发送的消息被server收到) HTTP相关 提到过Websocket 问了WebSocket相关以及与socket的区别

排序,快速排序的实现

广播(动态注册和静态注册区别,有序广播和标准广播)

应用安装过程

ConCurrentHashMap实现

HashMap

synchronized用法

线程死锁的4个条件?

Java线程池

垃圾收集器

LRUCache原理

RxJava的作用,与平时使用的异步操作来比,优势

进程间通信的方式

AsyncTask机制

树:B+树的介绍

描述清点击 Android Studio 的 build 按钮后发生了什么

ArrayList与LinkedList区别

Activity之间的通信方式

jvm相关

.Android进程分类

listview图片加载错乱的原理和解决方案

fragment 各种情况下的生命周期

Activity启动模式

序列化

Handler 机制

x个苹果,一天只能吃一个、两个、或者三个,问多少天可以吃完

热修复,插件化

AndroidManifest的作用与理解

模块化实现(好处,原因)

点击事件被拦截,但是相传到下面的view,如何操作?

动态布局

synchronize的原理

并发集合了解哪些

ReentrantLock 、synchronized和volatile(n面)

Oom 是否可以try catch ?

java注解

画出 Android 的大体架构图

BroadcastReceiver,LocalBroadcastReceiver 区别

Android消息机制原理

handler发消息给子线程,looper怎么启动

View事件传递

App中唤醒其他进程的实现方式

Bundle 机制

权限管理系统(底层的权限是如何进行 grant 的)

OSGI

CAS介绍

Service的开启方式

Android 上的 Inter-Process-Communication 跨进程通信时如何工作的;

recycleview listview 的区别,性能

volatile用法

动态加载

翻转一个单项链表

死锁

Java中内存区域与垃圾回收机制

软引用、弱引用区别

B树、B+树

介绍下SurfView

RxJava的功能与原理实现

ListView的优化

系统启动流程 Zygote进程 –> SystemServer进程 –> 各种系统服务 –> 应用进程

怎么启动service,service和activity怎么进行数据交互

多进程场景遇见过么?

垃圾收集机制 对象创建,新生代与老年代

java四中引用

SP是进程同步的吗?有什么方法做到同步

App启动流程,从点击桌面开始

Java中String的了解。

内存泄漏的可能原因?

Android系统为什么会设计ContentProvider,进程共享和线程安全问题

如何保证多线程读写文件的安全?

Glide源码?

排序,堆排序实现

集合的接口和具体实现类,介绍

进程间通信方式?

静态内部类的设计意图。

进程状态

简述Activity启动全部过程?

为什么要有线程,而不是仅仅用进程?

ANR 如何产生?

EventBus作用,实现方式,代替EventBus的方式

如何实现Fragment的滑动

图:有向无环图的解释

大体说清一个应用程序安装到手机上时发生了什么;

性能优化,怎么保证应用启动不卡顿

线程池

快速排序的时间复杂度,空间复杂度

多线程(关于AsyncTask缺陷引发的思考)

Jni 用过么?

二叉树,给出根节点和目标节点,找出从根节点到目标节点的路径

RxJava的作用,优缺点

如何实现线程同步?

类加载器

JVM内存模型

lock原理

RxJava简介及其源码解读?

EventBus实现原理

https相关,如何验证证书的合法性,https中哪里用了对称加密,哪里用了非对称加密,对加密算法(如RSA)等是否有了解

项目:拉活怎么做的

多线程:怎么用、有什么问题要注意;Android线程有没有上限,然后提到线程池的上限

JVM

下拉状态栏是不是影响activity的生命周期,如果在onStop的时候做了网络请求,onResume的时候怎么恢复

线程如何关闭,以及如何防止线程的内存泄漏

Android中进程内存的分配,能不能自己分配定额内存

如何取消AsyncTask

项目组件化的理解

HashSet与HashMap怎么判断集合元素重复

垃圾回收

Android事件分发机制

App 是如何沙箱化,为什么要这么做;

进程与线程

计算一个view的嵌套层级

封装view的时候怎么知道view的大小

模式MVP,MVC介绍

Android中数据存储方式

String 为什么要设计成不可变的?

synchronized与Lock的区别

断点续传的实现

HashMap的实现,与HashSet的区别

Android为什么引入Parcelable

用IDE如何分析内存泄漏?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,924评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,781评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,813评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,264评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,273评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,383评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,800评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,482评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,673评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,497评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,545评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,240评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,802评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,866评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,101评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,673评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,245评论 2 341

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,333评论 25 707
  • Java中的String类可以被继承么? 答:不能,因为它是一个final类,同样的还有Integer,Float...
    gyymz1993阅读 3,960评论 2 104
  • java 接口的意义-百度 规范、扩展、回调 抽象类的意义-乐视 为其子类提供一个公共的类型封装子类中得重复内容定...
    交流电1582阅读 2,207评论 0 11
  • 才发现已在外出差12天,跟着不同的同事,连轴在粤东、珠三角地区打转。幸运的是,逃避了前阵子的胡思乱想和残酷失眠,问...
    滴答滴答滴阅读 278评论 1 1
  • 爱看电影的我,爱写影评的我,和喜欢陪着我的你,在小城悠然的下午,去看了《寒战2》。诺大的影院只有四个人,红墙红椅,...
    九月城池阅读 220评论 2 3