安卓面试题

不要总是在睡觉, 要知行合一:

参考资料:  阿里巴巴安卓开发手册: 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

 

posted on 2022-09-27 10:35  黄山一叶  阅读(69)  评论(0编辑  收藏  举报