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的AMS中调用线程2的ATP;(由于同一个进程的线程间资源共享,可以相互直接调用,但需要注意多线程并发问题)
-
线程2通过binder传输到App进程的线程4;
-
线程4通过handler消息机制,将暂停Activity的消息发送给主线程;
-
主线程在looper.loop()中循环遍历消息,当收到暂停Activity的消息时,便将消息分发给ActivityThread.H.handleMessage()方法,再经过方法的调用,最后便会调用到Activity.onPause(),当onPause()处理完后,继续循环loop下去。
以上,就是关于这个问题回答的所有思路和具体解析参考,觉得对你有参考意义,还请大家随手点赞支持一下。
本真题资料适应于实习 & 初级工程师 & 中级工程师,高级工程师勉强吧。附带详细答案解析,旨在能帮助广大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 生命周期?
-
33.如何设置Activity进入和退出的动画?
-
34.谈谈你对Activity中onNewIntent()方法的认识?
-
35.如果一个Activity启动比较慢,需要优化,你觉得可以从哪些方面入手?
-
36.Activity之间传递数据的方式Intent是否有大小限制,如果传递的数据量偏大,有哪些方案?
-
37.了解scheme跳转协议吗?谈一谈
-
38.谈谈你对Activity的Context的认识?
-
39.如何在Application中获取当前Activity实例?
-
40.Activity进程优先级?
-
41.Activity出现ANR的条件有哪些 & 解决方案?
2.2 BroadcastReceiver
-
1.广播是什么?(校招&实习)
-
2.广播的注册方式有哪些?(校招&实习)
-
3.广播的分类 & 特性 & 使用场景?(校招&实习)
-
4.说说系统广播和本地广播的原理 & 区别 & 使用场景。
-
5.有两个应用注册了一样的广播,一个是静态,一个是动态,连优先级也一样,那么当广播从系统发出来后,哪个应用先接收到广播?
2.3 ContentProvider
-
1.什么是内容提供者?(校招&实习)
-
2.说说如何创建自己应用的内容提供者 & 使用场景。(校招&实习)
-
3.说说ContentProvider的原理。
-
4.ContentProvider,ContentResolver,ContentObserver之间的关系?
-
5.说说ContentProvider的权限管理。
2.4 Service
-
1.什么是Service?(校招&实习)
-
2.说说Service的生命周期。(校招&实习)
-
3.Service和Thread的区别?(校招&实习)
-
4.Android 5.0以上的隐式启动问题及其解决方案。
-
5.给我说说Service保活方案
-
6.IntentService是什么 & 原理 & 使用场景 & 和Service的区别。
-
7.创建一个独立进程的Service应该怎样做?
-
8.Service和Activity之间如何通信?
-
9.说说你了解的系统Service。
写在最后
由于本文罗列的知识点是根据我自身总结出来的,并且由于本人水平有限,无法全部提及,欢迎大神们能补充~
将来我会对上面的知识点一个一个深入学习,也希望有童鞋跟我一起学习,一起进阶。
提升架构认知不是一蹴而就的,它离不开刻意学习和思考。
**这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家,**梳理了多年的架构经验,筹备近1个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
最近还在整理并复习一些Android基础知识点,有问题希望大家够指出,谢谢。
希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!
转发+点赞+关注,第一时间获取最新知识点
Android架构师之路很漫长,一起共勉吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
学的层面来剖析的视频及资料分享给大家,**梳理了多年的架构经验,筹备近1个月最新录制的,相信这份视频能给你带来不一样的启发、收获。
[外链图片转存中…(img-d8VBgjjU-1715073139943)]
[外链图片转存中…(img-0fcQ6lPz-1715073139946)]
最近还在整理并复习一些Android基础知识点,有问题希望大家够指出,谢谢。
希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!
转发+点赞+关注,第一时间获取最新知识点
Android架构师之路很漫长,一起共勉吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!