Android面试

数据结构与算法
各种开源框架使用与原理(okhttp glide gson Rxjava Retrofit ButterKnife dagger等) 各种设计模式(命令模式 观察者模式 抽象工厂模式 build模式 适配器模式 生产者/消费者 装饰者模式 外观模式等) 各种架构(MVP MVC MVVM) 网络(http https udp等) 组件化 模块化 插件化 热修复 IPC AIDL JNI NDK Bindler SQLite 多线程 锁 进程 内存 jvm dvm 以上部分自行查找相关资料

Android进程优先级: 前台、可见、服务、后台、空

Android任务栈: 不唯一 后进先出

activity启动模式: standard:不管任务栈中是否有 都创建 singleTop:栈顶复用 栈顶有就复用 没有就创建 singleTask:任务栈中有 就移到栈顶 没有就创建 singleinstance:有且只有一个实例 并且独享整个任务栈

scheme跳转协议: 服务端定制跳转页面 h5跳转原生页面 一个app跳转到另一个app

Fragment为什么别称为第五大组件: 3.0引入 起初为了适应平板大屏幕 比activity内存小 动态灵活加载 依附于activity

FragmentPagerAdapter和FragmentStatePagerAdapter的区别 前者适用于较少的页面 后者适用于较多的页面 后者切换时有释放Fragment对象 前者切换时 脱离UI并没有回收对象

Fragment生命周期 onAttach onCreate onCreateView onViewCreate onActivityCreated onDestoryView onDetach

Fragment通信 Fragment调用activity的方法 getActivity activity调用Fragment的方法 接口回调 Fragment调用Fragment的方法 先getactivity 再findFragmentById对应的Fragment

Fragment的replace、add、remove 方法 replace(FragmentManager的方法)替换实例 add 将实例添加到最上层 remove 将实例移除

Service是什么: 后台长期运行而没有用户界面 可以由广播、activity启动 运行在主线程中 不能做耗时操作

Service和Thread的区别 Android的后台指完全不依赖于UI线程 Service轻量级的IPC通信

Service启动方式 startService bindService

广播使用场景 同一个app具有多个进程的不同组件之间的消息通信 不同app之间组件的通信

广播的种类 普通广播 有序广播 本地广播(只在app内传播)

实现广播的方式 静态注册 xml中注册 注册完一直运行即使进程被杀死 动态注册 代码中注册 跟随activity的生命周期

广播内部实现机制 1.广播接收者BroadcastReceiver通过Binder机制向AMS(Activity Manager Service)进行注册; 2.广播发送者通过binder机制向AMS发送广播; 3.AMS查找符合相应条件(IntentFilter/Permission等)的BroadcastReceiver,将广播发送到BroadcastReceiver(一般情况下是Activity)相应的消息循环队列中; 4.消息循环执行拿到此广播,回调BroadcastReceiver中的onReceive()方法。

本地广播 别的app无法接受 别的app无法对自己的app发送广播 比系统的全局广播更加高效 以上都是因为 通过handler实现的

handler的内部机制 handler发送message到消息队列中 loop从消息队列循环取消息 发送给handler进行处理 handler内存泄漏(非静态内部类隐试持有外部类的引用 GC只会回收没有被引用或者根集不可到达的对象(取决于GC算法)) 当回收activity时 handler在做好使操作 导致handler对activity的引用没有被释放 导致内存泄漏 解决办法 设为static 或者 在activity的ondestory中 调用removeCallback

asyncTask 本质上封装了线程池和handler的异步框架

handler和asyncTask的区别 前者 对于多个后台任务 简单清晰 后者 轻量级的异步任务类 反馈异步执行的进度 适用于单个或者少量异步任务

asyncTask注意事项 内存泄漏(同handler) 生命周期(不跟随activity 需要主动调用cancel方法保证程序稳定) 结果丢失 (屏幕旋转 系统回收 持有的是之前的activity的引用 则结果无效)

handlerThread产生背景 开启Thread子线程进行耗时操作 多次创建和销毁线程是很耗系统资源的

handlerThread特点 本质上是线程类 继承了Thread 有自己的looper对象 可以进行looper循环 通过looper对象传递给handler对象 可以在handleMessage方法中执行异步任务 优点是不会堵塞 减少性能的消耗 缺点不能同时进行多任务处理 效率低 与线程池注重并发不同 handlerThread是一个串行队列,背后只有一个线程

IntentService 本质封装了handlerThread和handler的异步框架 可以做耗时操作(有异步方法) 继承自Service 异步请求类 当任务执行完成后会自动停止 比Service优先级高 可以开启多次 但实例只有一个 执行完第一个任务后再执行第二个任务(其实是handler在处理)

bitmap优化 recycle lru 计算insamplesize 缩略图 三级缓存

ui卡顿原理 1秒60帧 16ms每帧 overdraw 有大量重叠部分 比如重合的View都有自己的背景 过度绘制 同一帧多次绘制

ui卡顿原因分析 人为的在ui线程中做轻微的耗时操作,导致卡顿 布局layout过于复杂,无法在16ms内渲染完成 同一时间动画执行次数过多,导致cpu和gpu负载过重 View的过度绘制,导致某些像素在同一帧时间内被绘制多次,导致cpu和gpu负载过重 View频繁的出发measure layout 导致耗时过多 内存频繁触发GC 导致暂时阻塞渲染操作 冗余资源及逻辑等导致加载和执行缓慢 anr

ui卡顿优化 布局优化(使用include merge等标签 尽量不要嵌套 使用比重代替长宽 自定义View代替复杂) 列表及adapter优化 背景和图片等内存分配优化 避免anr

java内存分配策略 1、静态存储区 2、栈区 3、堆区

java是如何管理内存的

java中的内存泄漏 定义:无用对象持续占有内存或者无用对象的内存得不到及时释放

Android中内存泄漏 1、单例 2、匿名内部类 3、handler 4、避免使用static变量 5、资源未关闭(广播、游标、数据库、stream 、socket、bitpam) 5、asyncTask

内存管理机制概述 1、分配机制 2、回收机制

Android内存管理机制 1、分配机制 2、回收机制

内存管理机制目标 1、更少的占用内存 2、合适的时候,合理的释放系统资源 3、在系统紧张的时候,释放掉大部分不重要的资源 4、合理的在特殊的生命周期中,保存或者还原重要数据,以至于系统能够正确的恢复应用

Android内存优化方法 1、当Service完成任务后,尽量停止它 2、当UI不可见的时候,释放掉一些只有ui使用的资源 3、在系统内存紧张的时候,尽可能多的释放掉一些非重要资源 4、避免滥用bitmap导致内存浪费 5、使用针对内存优化过的数据容器(少用枚举 消耗的内存是常量的两倍多 ) 6、避免使用依赖注入的框架 7、使用ZIP对齐的APK 8、使用多进程

如何对冷启动进行优化 1、减少onCreate方法的工作量 2、不要让Application参与业务操作 ,也不要进行耗时操作 3、不要以静态变量的方式在Application中保存数据 4、布局优化

Android不用静态变量存储数据 1、静态变量数据由于进程被杀死而初始化 2、使用其他方式:文件、视频、contentprovider

有关sharepreference的问题 1、不能夸进程同步 2、存储的文件过大(取值导致阻塞主线程 产生大量临时变量 一直存储在内存中)

其他优化 内存对象序列化 序列化:将对象的状态信息转化为可以存储或传输的形式的过程 Serializeble(java自带 在使用内存时比Serializeble性能高 序列化时产生大量临时变量 频繁垃圾回收) Parcelble(Android自带 不可用于磁盘数据的序列化 不能保证数据的持续性 用于进程间的数据传递)

MVC模式 简单来说就是通过controller的控制去操作model层的数据,并且返回给view层展示 大家想过这样会有什么问题吗?显然是有的,不然为什么会有MVP和MVVM的诞生呢,是吧。问题就在于xml作为view层,控制能力实在太弱了,你想去动态的改变一个页面的背景,或者动态的隐藏/显示一个按钮,这些都没办法在xml中做,只能把代码写在activity中,造成了activity既是controller层,又是view层的这样一个窘境 定义: 1、M: 业务逻辑 2、V:处理数据显示的操作 3、C:Activity处理用户交互问题 特点: 1、耦合性低 2、可扩展性好 3、模块职责划分明确

进程保活方案 1、利用系统广播拉活 不及时 2、利用系统Service机制拉活 短时间被kill超过三次就拉不活了(将Service 设置为 START_STICKY状态) 3、利用Native进程拉活(利用Linux 中的 fork 机制创建 Native 进程,在 Native 进程中监控主进程的存活,当主进程挂掉后,在 Native 进程中立即对主进程进行拉活。在主进程中创建一个监控文件,在主进程中持有文件锁。拉活进程启动后,申请文件锁将会被堵塞,一旦可以成功获取到锁,说明主进程挂掉,即可进行拉活5.0后失效) 4、利用JobScheduler机制拉活(5.0后) 5、利用账号机制拉活(失效) https://segmentfault.com/a/1190000006251859

进程杀死场景 触发系统进程管理机制 被第三方杀死 厂商杀进程 用户主动强行停止

bindle机制 https://blog.csdn.net/weijinqian0/article/details/52233529

热修复原理 https://blog.csdn.net/u012943767/article/details/52355214 https://www.jianshu.com/p/d10aa991ca76

http和https https://www.cnblogs.com/wqhwe/p/5407468.html

网络请求优化 https://www.jianshu.com/p/d4c2c62ffc35

数据库优化 https://www.jianshu.com/p/3b4452fc1bbd

Android和js交互 https://blog.csdn.net/carson_ho/article/details/64904691

Android 组件化和插件化 https://blog.csdn.net/mhhyoucom/article/details/79000072

如何导入外部数据库 https://blog.csdn.net/gpwner/article/details/53195925

描述一次网络请求的过程 https://blog.csdn.net/seu_calvin/article/details/53304406

Service和activity通信 https://blog.csdn.net/qq_28468727/article/details/52144155

Android实现wap方式联网 https://blog.csdn.net/seu_calvin/article/details/53305034

Requestlayout onlayout ondraw drawchild 区别与联系 https://blog.csdn.net/weixin_41101173/article/details/79726311

android中Invalidate和postInvalidate的差别 https://www.cnblogs.com/newcaoguo/p/6053288.html

动画框架实现原理 https://www.jianshu.com/p/3683a69c38ea

Android View刷新机制 https://www.oschina.net/question/163910_27566

contentprovider https://blog.csdn.net/carson_ho/article/details/76101093

自定义View优化 https://blog.csdn.net/whb20081815/article/details/74474736

activity缓存方法 https://www.jianshu.com/p/eac026497f14

merge viewstub https://www.jianshu.com/p/62ba51bc7dbc

json优缺点 https://blog.csdn.net/ssisse/article/details/51555227

怎样退出app https://blog.csdn.net/rabbit_in_android/article/details/50772811

res和asset的区别 https://blog.csdn.net/xiang462042190/article/details/43638299

bitmap详细了解

Android长连接和心跳机制 https://blog.csdn.net/ttkatrina/article/details/72956338

zygote启动过程 https://blog.csdn.net/cike110120/article/details/52157665

心跳包 https://blog.csdn.net/bless2015/article/details/52680220

XML解析方式 https://blog.csdn.net/WILLMAX_007/article/details/51416963

forceclose http://www.jb51.net/article/90176.htm

Android体系架构 https://blog.csdn.net/spy19881201/article/details/5775484

如何安全退出已调用多个activity的Application https://blog.csdn.net/debug2/article/details/6193644

dvm进程 linux进程 应用程序进程是否为同一个概念 https://blog.csdn.net/qq_27073205/article/details/46240261

Android如何捕获未捕获的异常 http://www.jb51.net/article/78858.htm

Framework 工作方式及原理,Activity 是如何生成一个 view 的,机制是什么 https://www.jianshu.com/p/34758dd69019

Android线程间通信 1.共享变量(内存) 2.管道 3.handle机制 runOnUiThread(Runnable) view.post(Runnable)

Android 进程通信 https://www.jianshu.com/p/ce1e35c84134

activity启动过程 https://www.jianshu.com/p/9ecea420eb52

讲解一下context https://blog.csdn.net/guolin_blog/article/details/47028975

recycleview http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0307/4032.html

LRUCache原理 https://blog.csdn.net/u012943767/article/details/51897259

启动时长 https://blog.csdn.net/beyond_liyy/article/details/52273740

保持应用稳定性 https://www.jianshu.com/p/40681fa8b284

classLoader https://www.jianshu.com/p/a620e368389a

动态布局 https://www.jianshu.com/p/0d6f753fdd92

减少重复代码 https://blog.csdn.net/u011494050/article/details/40593605

sp是进程同步吗 有什么方法做到同步 https://www.jianshu.com/p/bdebf741221e

surfaceView https://blog.csdn.net/luoshengyang/article/details/8661317/

线程间操作list https://www.jianshu.com/p/7a7985653651

app启动流程 从点击桌面图标开始 https://blog.csdn.net/hehe26/article/details/51460057

动态加载 https://www.jianshu.com/p/aa9a324626a8

构建流程 https://www.jianshu.com/p/4962634901fb

安装过程 https://www.jianshu.com/p/21412a697eb0

dalvik art基本了解 https://blog.csdn.net/seu_calvin/article/details/52354964

Android 沙箱化 https://blog.csdn.net/ljheee/article/details/53191397

系统启动流程 zygote-systemserver-各种系统服务-应用进程 https://www.jianshu.com/p/33152a7bec26 四篇都要看

recycleView 和listview 对比 https://blog.csdn.net/u014497502/article/details/50917321

synchronized和Lock的区别 https://blog.csdn.net/u012403290/article/details/64910926?locationNum=11&fps=1

listview 图片加载错乱原理及解决方案 https://blog.csdn.net/a394268045/article/details/50726560

动态适配权限 权限组的概念 https://www.jianshu.com/p/a37f4827079a

加载大图 https://blog.csdn.net/zuo8787/article/details/51406986

计算view的嵌套层级 https://blog.csdn.net/zx_android/article/details/79558509

多线程实现断点续传 https://blog.csdn.net/tianzhaoai/article/details/56673071

封装一个view的时候怎么知道View的大小 https://blog.csdn.net/z82367825/article/details/52206599

下拉状态栏会影响activity的生命周期吗 不会

onstop做了网络请求 onresume的时候怎么恢复???

OOM是否可以try catch 可以 但不是解决之道

Android 多进程场景 https://blog.csdn.net/seu_calvin/article/details/53932171

强引用置为null 会不会被回收 表示可以清理了 什么时候清理时GC的事

AndroidManifest作用与理解 https://blog.csdn.net/garyhu1/article/details/55666816

Android开启摄像头的主要步骤 http://www.jb51.net/article/87424.htm

AlertDialog,popupWindow,Activity区别 https://blog.csdn.net/qq_26358311/article/details/79578376

线程如何关闭 如何防止线程的内存泄漏 http://www.jb51.net/article/42146.htm https://blog.csdn.net/qq_32618417/article/details/51703435

viewpager懒加载 https://www.jianshu.com/p/7a47907f49c2

Android studio内存泄漏分析 https://blog.csdn.net/cxq234843654/article/details/51250306

插值器估值器 https://blog.csdn.net/qq_24530405/article/details/50630744

消息机制 https://blog.csdn.net/seu_calvin/article/details/52120086

systrace https://www.2cto.com/kf/201710/688172.html

微信小红点实现 https://www.zhihu.com/question/35462625

为什么不能再子线程中更新UI https://www.jianshu.com/p/ed1af0c6aee2 https://www.cnblogs.com/lao-liang/p/5108745.html

垃圾回收与System.gc https://blog.csdn.net/jiyiqini/article/details/46725647

转载于:https://juejin.im/post/5ac6bdb9518825558723cb1a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值