Android中Activity的工作过程(三)

文章收藏的好句子:只要你愿意,那些无人问津的时光,都可以用来淬炼更好的自己。

PS:本文是基于 Android Api 26 来分析源码的。

本文是基于Android中Activity的工作过程(二)这篇文章继续来写的,在Android中Activity的工作过程(二)这篇文章中,我们在如下代码;

41aa4f24af3d32b04925cdd923452b69.png

分析了 MainActivity(这里的 this 是指 MainActivity) 的 onCreate 和 onStart 方法在源码中的调用流程;本篇文章分析 MainActivity 的 onResume 和 Main2Activity 的 onStop 方法在源码中的调用流程。

Android中Activity的工作过程(二)这篇文章中,我们分析到如下几行代码;

6dc8ebd4febaa6fdb58d7c517da623e6.png

看注释34,它是调用了 ActivityThread 的 handleResumeActivity(IBinder token,boolean clearHide, boolean isForward, boolean reallyResume, int seq, String reason) 方法;

05bd644bb11947afeac10613a4a4bb98.png

看注释43,它调用了 ActivityThread 的 performResumeActivity(IBinder token,boolean clearHide, String reason) 方法;

c864e8235c02e60a91ebc9de83b1cc3e.png

看注释45,r.activity 是一个 Activity 类型的对象,这里调用了 Activity 的 performResume 方法;

be45c7879cbc13e34e0b89fda4b33074.png

看注释46,这里调用了 Activity 的 performRestart 方法;

bc15e8173a13bcc28c06c31a21972f43.png

看注释48,这里的 mInstrumentation 是 Instrumentation 类型的对象,这里调用了 Instrumentation 的 callActivityOnRestart(Activity activity) 方法;

c0a5fa3c1577b7da1225467d3bcd93d1.png

看到了没有,这里调用了 Activity 的 onRestart 方法,在下面这两行代码中;

//49、
Intent intent = new Intent(this,Main2Activity.class); 
startActivity(intent);

显然是回调了 Main2Activity 的 onRestart 方法;好,我们看回注释47的代码,mInstrumentation 是 Instrumentation 类型的对象,这里就调用了 Instrumentation 的 callActivityOnResume(Activity activity) 方法;

1e91d17cbaae3c792490b51a63b20816.png

看到注释50没有,这里调用了 Activity 的 onResume 方法了,然后我们再看一下注释49的代码,所以说注释50的代码其实是调用 Main2Activity 的 onResume 方法。

好了,我们再回头看注释44的代码,这里最终会调用到 Idler 的 queueIdle 方法;

80d21ee9cf4d3b92f47d21faf14b5f76.png

看注释50的代码,这里的 am 是 ActivityManagerService 类型的对象,这里就会调用到 ActivityManagerService 的 activityIdle(IBinder token, Configuration config, boolean stopProfiling) 方法;

97463b5632cdd66c420f6b0e0a9af75c.png

看注释51处的代码,mStackSupervisor 是 ActivityStackSupervisor 类型的对象,这里就调用了 ActivityStackSupervisor 的 activityIdleInternalLoc-ked(final IBinder token, boolean fromTimeout,boolean processPausin-gActivities, Configuration config) 方法;

082e9eb5a504f8a7e97e7fe29de8834a.png

看注释52,stack 是 ActivityStack 类型的对象,这里就会调用到 ActivityStack 的 stopActivityLocked(ActivityRecord r) 方法;

babc43892416376941c206c433551d9a.png

看注释53的代码,r.app.thread 本质上就是 ActivityThread 的内部类 ApplicationThread 对象,所以就会调用到 ApplicationThread 的 scheduleStopActivity(IBinder token, boolean showWindow,int configChanges) 方法;

72abe6357fe2f794bfd0fad824619df7.png

看注释54的代码,这里就会插入一条消息给 ActivityThread 的内部类 H 处理,最终由 H 的 what = H.STOP_ACTIVITY_HIDE 的处理;

0017e0ecb408a968deaf441534034801.png

看注释55,这里就调用到了 ActivityThread 的 handleStopActivity(IBinder token, boolean show, int configChanges, int seq) 方法;

0ef7825022f0324f7cf1f5a6cadd13af.png

看注释56,这里就调用了 ActivityThread 的 performStopActivityInner(ActivityClientRecord r,StopInfo info, boolean keepShown, boolean saveState, String reason) 方法;

7102e0642db29913f7ca6944880d98a0.png

看注释57,这里的 r.activity 就是 Activity 类型的对象,这里又调用了 Activity 的 performStop(boolean preserveWindow) 方法;

22917577ed34b8632ef23194f263c02e.png

看注释58,这里的 mInstrumentation 是 Instrumentation 类型的对象,这里又调用了 Instrumentation 的 callActivityOnStop(Activity activity) 方法;

492cbb33822093c2cd67ce8a6676c9f8.png

看到注释59了没有,这里调用了 Activity 的 onStop 方法;如果我们回看注释49的代码,那么这里的 activity 并不是指的是 this (this 是指MainActivity),而是指的是 Main2Activity 的 onStop 方法,所以注释59的代码调用的是我们启动流程里面的 Main2Activity 的 onStop 方法

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值