安卓面试题
不要总是在睡觉, 要知行合一:
参考资料: 阿里巴巴安卓开发手册: https://juejin.cn/post/6844903812226891784
面试宝典: https://fuhongliang.gitbooks.io/android/content/ (包含了主要知识点, 但是并不细)
常见社招面试题: https://blog.csdn.net/Androidbye/article/details/114674130
https://blog.csdn.net/huangqili1314/article/details/72792682 (2022.10.10 看的)
安卓:
一. Activity:
https://www.huoban.com/news/post/4436.html
https://zhuanlan.zhihu.com/p/381580761
补充思考:
(1) activity生命周期:
oncreate() onstart() onresume() 三个方法后,才确定一个activity 被启动了(即可以和用户进行交互了), 所以在一个activity 真正启动之前的耗时操作都会导致Activity 启动缓慢; (https://www.cnblogs.com/jenson138/p/4351472.html)
onRestart() 调用时机: 一句话, activity变成 onStop()后恢复时, 会调用onRestart()方法 (https://blog.csdn.net/hnlgzb/article/details/121062053)
onPause() 和 onStop() 之间的区别: onpause() 是页面失去焦点, onStop() 是页面不可见 (https://www.jianshu.com/p/8c01de6f15cc)
onDestroy() 方法具体要做什么: ondestroy执行的时机比较晚, 不要在这个方法里面进行资源释放 (https://blog.csdn.net/dearlaoyuan/article/details/80645840, https://juejin.cn/post/6898588053451833351)
调用finish() 方法后, 走哪些生命周期: (https://blog.csdn.net/fesdgasdgasdg/article/details/79138321) isFinishing() 用于判断 Activity 是否正在 finish。
(2) activity栈:
Activity 是唯一一个可以被保存在history stack中的数据
(3) activity的启动过程:
https://www.jianshu.com/p/d7364591f1d1
https://cloud.tencent.com/developer/article/1917958 (刚开始看着一篇, 给你一个初步认知)
https://www.cnblogs.com/Jax/p/6880631.html (这一篇也可以看)
问题一: activity启动过程中主要涉及到哪些进程?
桌面图标中包含哪些信息?
launcher 和 AMS 之间是如何通信的?
ams作用: 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作
launcher 入门篇: https://www.jianshu.com/p/968e2339ee5f
(4) Activity 启动模式以及使用场景
https://blog.csdn.net/CodeEmperor/article/details/50481726
任务栈: 应用程序创建时候, 使用任务栈来维护创建的activity, 只有栈顶的activity才能和用户进行交互, 每次开启一个页面就会在任务栈中添加一个activity; 退出应用时候, 需要把任务栈中所有activity清出栈 ,任务栈销毁, 才能完成.
任务栈缺点: 每次启动一个页面就会添加一个activity, 会造成栈内数据冗余,
在任务栈中存在不足的情况下, 引入了四种启动模式来进行优化:
standard, singleTop, singleTask, SingleInstance
standard: 标准模式 启动页面每次都会创建一个新的activity
singleTop: 如果栈顶是要要启动的activity则复用, 反之创建一个新的activity入栈
singleTask: 在task中唯一个, 当启动页面在任务栈中存在,则将该activity前的 activity全部出栈, 是启动acitivity置于top
singleInstance: 启动activity会启动一个新的任务栈, 并保证不再有其他activity实例进入
四种模式下的应用场景:
这个还未完全理解; 自己写一下代码;
(2) Fragment
(3) 广播:
使用: https://www.51cto.com/article/692251.html, https://blog.csdn.net/wuto_/article/details/107019214
https://www.jianshu.com/p/ca3d87a4cdf3 (这一篇稍微好一点)
intent过滤器 定义接受订阅的action;
广播可用于跨进程/线程间通信;
动态注册不是常驻广播, 动态注册广播, registerReceiver()
和unregisterReceiver()
要成对出现。
应用内部广播:
onReceive 方法是在主线程中执行的, 因此耗时操作要注意;
AMS 是如何控制的?
广播使用的中注意点:
(1) onReceive() 方法必须在10S内执行完成,否则会发生ANR, 当需要执行很长时间的时候, 可以通过Service来完成, 不能通过开启子线程完成
(2) 动态注册广播, 注意内存泄露问题, 在不使用的时候, 及时释放资源
问题:
问题一: 广播发出去后, 什么时候能够接受到?
问题二: 长驻广播和非长驻广播之间的区别?
答: 常驻广播不依赖activity, 拥有独立的生命周期, 当appBack 退出去后, 还能够接收其他应用发送的广播? (appBack 只是到后台, 还是app进程关闭)
非常驻广播: 随着Activity生命周期创建而创建, 销毁而销毁;
问题三: 非常驻广播没有及时销毁会发生什么?
问题四: 为什么onReceive() 方法中不能做耗时操作?
答: onreceive() 方法运行在主线程, 所以不能做耗时操作, 耗时操作会导致ANR
问题五: onReceive() 方法为什么不能开启子线程?
问题六: 广播的生命周期是什么样的?
答: BroadcastReceiver的生命周期很短,从 onReceiver() 方法开始执行到结束,为其有效期,之后系统会销毁BraodcastReceiver对象,所以在 onReceive 方法中执行异步请求操作,很可能请求结果没有返回,BroadcastReceiver就被系统回收了。
(4) Service
(5) anr
anr定义: https://blog.csdn.net/zhangjin12312/article/details/78800004
文章: https://blog.csdn.net/ahou2468/article/details/120767548
trace文件分析: https://blog.csdn.net/subaohao/article/details/38730309
trace文件:记录发生某个进程发生anr时候,所有线程的状态
tid不是线程id,是一个在Java虚拟机中用来实现线程锁的变量
sysTid是Linux下的内核线程ID
问题:
(1) 内存不足为什么会导致anr:
调用栈是从下往上运行的;
了解线程持有锁, 导致线程等待阻塞
trace文件包含 当时系统所有活动的进程情况;
线程基本信息 + 当时正在做的事情的堆栈信息
Thread 22 应该就是表示 对应tid = 22;
wait to lock: 准备对一个对象进行加锁, 但是这个对象现在被其他线程持有了;
locked : 表示持有哪个对象,进行加锁了
随笔: onresume() 方法 : 应用可以和用户之间进行交互操作
complieOnly 和 implemention 之间的区别:
https://blog.csdn.net/LJ_GOD/article/details/112029556
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探