就是这道阿里Android岗面试题,一面刷掉了90%的面试者!你会答吗?(3)

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

thread.attach(false);

Looper.loop(); //消息循环运行

throw new RuntimeException(“Main thread loop unexpectedly exited”);

}

thread.attach(false);便会创建一个Binder线程(具体是指ApplicationThread,Binder的服务端,用于接收系统服务AMS发送来的事件),该Binder线程通过Handler将Message发送给主线程,具体过程可查看 startService流程分析,这里不展开说,简单说Binder用于进程间通信,采用C/S架构。

另外,ActivityThread实际上并非线程,不像HandlerThread类,ActivityThread并没有真正继承Thread类,只是往往运行在主线程,该人以线程的感觉,其实承载ActivityThread的主线程就是由Zygote fork而创建的进程。

主线程的死循环一直运行是不是特别消耗CPU资源呢? 其实不然,这里就涉及到Linux pipe/e****poll机制,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里,详情见Android消息机制1-Handler(Java层),此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作。这里采用的epoll机制,是一种IO多路复用机制,可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作,本质同步I/O,即读写是阻塞的。 所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源。

(3) Activity的生命周期是怎么实现在死循环体外能够执行起来的?

ActivityThread的内部类H继承于Handler,通过handler消息机制,简单说Handler机制用于同一个进程的线程间通信。

Activity的生命周期都是依靠主线程的Looper.loop,当收到不同Message时则采用相应措施:

在H.handleMessage(msg)方法中,根据接收到不同的msg,执行相应的生命周期。

比如收到msg=H.LAUNCH_ACTIVITY,则调用ActivityThread.handleLaunchActivity()方法,最终会通过反射机制,创建Activity实例,然后再执行Activity.onCreate()等方法;

再比如收到msg=H.PAUSE_ACTIVITY,则调用ActivityThread.handlePauseActivity()方法,最终会执行Activity.onPause()等方法。 上述过程,我只挑核心逻辑讲,真正该过程远比这复杂。

**主线程的消息又是哪来的呢?**当然是App进程中的其他线程通过Handler发送给主线程,请看接下来的内容:


最后,从进程与线程间通信的角度,通过一张图加深大家对App运行过程的理解:

system_server进程是系统进程,java framework框架的核心载体,里面运行了大量的系统服务,比如这里提供ApplicationThreadProxy(简称ATP),ActivityManagerService(简称AMS),这个两个服务都运行在system_server进程的不同线程中,由于ATP和AMS都是基于IBinder接口,都是binder线程,binder线程的创建与销毁都是由binder驱动来决定的。

App进程则是我们常说的应用程序,主线程主要负责Activity/Service等组件的生命周期以及UI相关操作都运行在这个线程; 另外,每个App进程中至少会有两个binder线程 ApplicationThread(简称AT)和ActivityManagerProxy(简称AMP),除了图中画的线程,其中还有很多线程,比如signal catcher线程等,这里就不一一列举。

Binder用于不同进程之间通信,由一个进程的Binder客户端向另一个进程的服务端发送事务,比如图中线程2向线程4发送事务;而handler用于同一个进程中不同线程的通信,比如图中线程4向主线程发送消息。

结合图说说Activity生命周期,比如暂停Activity,流程如下:

  1. 线程1的AMS中调用线程2的ATP;(由于同一个进程的线程间资源共享,可以相互直接调用,但需要注意多线程并发问题)

  2. 线程2通过binder传输到App进程的线程4;

  3. 线程4通过handler消息机制,将暂停Activity的消息发送给主线程;

  4. 主线程在looper.loop()中循环遍历消息,当收到暂停Activity的消息时,便将消息分发给ActivityThread.H.handleMessage()方法,再经过方法的调用,最后便会调用到Activity.onPause(),当onPause()处理完后,继续循环loop下去。

以上,就是关于这个问题回答的所有思路和具体解析参考,觉得对你有参考意义,还请大家随手点赞支持一下。

1546页全网最全Android大厂面试真题


本真题资料适应于实习 & 初级工程师 & 中级工程师,高级工程师勉强吧。附带详细答案解析,旨在能帮助广大Android学习者找到心仪的Offer。

文档内容总共7大模块:

  • 1.Java部分

  • 2.Kotlin部分

  • 3.Android部分

  • 4.移动UI框架部分(Flutter为主)

  • 5.数据结构与算法部分

  • 6.常用的开源库部分

  • 7.计算机网络认识

**由于篇幅原因,以下只有局部内容展示,需要此完整文档的朋友,点击此处获取。**更多Android进阶学习资料笔记、面经真题,请在我的Github中查看。

1.Java部分

1.1 操作系统相关

  • 1.什么是操作系统?(校招&实习)

  • 2.什么是线程,什么是进程?(校招&实习)

1.2 JDK&JVM&JRE

  • 1.JDK & JVM & JRE分别是什么以及它们的区别?(校招&实习)

  • 2.解释一下为什么Java可以跨平台?(校招&实习)

1.3 面向过程 & 面向对象

  • 1.什么是面向过程 & 什么是面向对象 & 区别?(校招&实习)

  • 2.给我说说Java面向对象的特征以及讲讲你代码中凸显这些特征的经验。(校招&实习)

  • 3.什么是重载 & 什么是重写 & 区别。(校招&实习)

  • 4.谈谈你对this和super的认识。(校招&实习)

  • 5.接口和抽象类的区别。(校招&实习)

  • 6.静态属性和静态方法能被继承吗?静态方法又是否能被重写呢?(校招&实习)

  • 7.给我说说权限修饰符特性。(校招&实习)

  • 8.给我谈谈Java中的内部类。(校招&实习)

  • 9.闭包和内部类的区别?

  • 10.Java多态的实现机制是什么?

  • 11.谈谈你对对象生命周期的认识?

  • 12.static关键字的作用?(校招&实习)

  • 13.final关键字的作用。(校招&实习)

1.4 八大基本数据类型&引用类型

  • 1.说说Java中的8大基本类型 & 内存中占有的字节 & 什么是引用类型?(校招&实习)

  • 2.什么是拆箱 & 装箱,能给我举栗子吗?(校招&实习)

1.5 数组

  • 1.能说说多维数组在内存上是怎么存储的吗?

  • 2.你对数组二次封装过吗?说说封装了什么

1.6 Java异常

  • 1.说说Java异常体系主要用来干什么的 & 异常体系?(校招&实习)

  • 2.Error和Exception的区别?(校招&实习)

  • 3.说说运行时异常和非运行时异常的区别?(校招&实习)

  • 4.如何自定义一个异常?(校招&实习)

  • 5.throw和throws 的区别?(校招&实习)

  • 6.try{}catch{}finally{}可以没有finally吗?(校招&实习)

  • 7.finally语块有什么特点?(校招&实习)

  • 8.return在try{}catch{}finally{}中执行具有哪些规则?(校招&实习)

  • 9.给我例举至少5个常见的运行时异常。(校招&实习)

1.7 NIO/BIO/AIO

  • 1.NIO是什么 & BIO是什么 & AIO是什么 & 它们之间的区别?(校招&实习)

  • 2.IO按照方向和数据类型划分能划分为哪些数据流?(校招&实习)

  • 3.能给我说说NIO有什么特点?平常开发中使用过吗?

2.Android 部分

2.1 Activity

  • 1.Activity是什么?(校招&实习)

  • 2.典型情况下的Activity生命周期?(校招&实习)

  • 3.异常情况下的Activity的生命周期 & 数据如何保存和恢复? (校招&实习)

  • 4.从Activity A跳转到Activity B之后,然后再点击back建之后,它们的生命周期调用流程是什么?(校招&实习)

  • 5.如何统计Activity的工作时间?(校招&实习)

  • 6.给我说说Activity的启动模式 & 使用场景。(校招&实习)

  • 7.如何在任意位置关掉应用所有Activity & 如何在任意位置关掉指定的Activity?(校招&实习)

  • 8.Activity的启动流程(从源码角度解析)?

  • 9.启动一个其它应用的Activity的生命周期分析。

  • 10.Activity任务栈是什么?在项目中有用到它吗?说给我听听

  • 11.什么情况下Activity不走onDestory?

  • 12.什么情况下Activity会单独执行onPause?(校招&实习)

  • 13.a->b->c界面,其中b是SingleInstance的,那么c界面点back返回a界面,为什么?

  • 14.如果一个Activity弹出一个Dialog,那么这个Acitvity会回调哪些生命周期函数呢?

  • 15.Activity之间如何通信 & Activity和Fragment之间通信 & Activity和Service之间通信?

  • 16.说说Activity横竖屏切换的生命周期。(校招&实习)

  • 17.前台切换到后台,然后在回到前台时Activity的生命周期。

  • 18.下拉状态栏时Activity的生命周期?

  • 19.Activity与Fragment的生命周期比较?

  • 20.了解哪些Activity常用的标记位Flags?

  • 21.谈谈隐式启动和显示启动Activity的方式?

  • 22.Activity用Intent传递数据和Bundle传递数据的区别?为什么不用HashMap呢?

  • 23.在隐式启动中Intent可以设置多个action,多个category吗 & 顺便讲讲它们的匹配规则?

  • 24.Activity可以设置为对话框的形式吗?(校招&实习)

  • 25.如何给Activity设置进入和退出的动画?

  • 26.Activity使用Intent传递数据是否有限制 & 如果传递一个复杂的对象,例如一个复杂的控件对象应该怎么做?

  • 27.在Activity中可以多次调用setContentView方法吗?说说不同时机第二次调用setContentView会发生什么?

  • 28.说说分别在Activity里每一个生命周期函数里调用finish方法后,接下来Activity的生命周期如何回调?

  • 29.有什么方法可以启动一个没有在AndroidManifest.xml中注册过的Activity?

  • 30.在Activity进行配置时,catrgory和action的区别是什么?

  • 31.activity中分别在onCreate,onStart,onResume中调用finish后的生命周期如何回调?

  • 32.锁定屏与解锁屏幕,Activity 生命周期?

总结

【Android 详细知识点思维脑图(技能树)】

我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

最后,赠与大家一句话,共勉!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

最后,赠与大家一句话,共勉!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-LusZs3yd-1713126089950)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值