Q1:Activity的onPause是咋回调的?原理是啥?
上图展示的ActivityA start ActivityB,然后回调ActivityA 的onPause方法。
1)ActivityA 通知AMS 去启动ActivityB。
2)在执行到ActivityStack的栈管理这个类的时候,检测一下栈顶的Activity是否已经onPause了;没有的话,就通知Activity去做onPause。
所以重点是在ActivityStack这类中,对Activity的栈做了管理。
Q2::Activity的onStop是咋回调的?原理是啥?
1)在ActivityThread::handleResumeActivity() 中注册了一个
Looper.myQueue().addIdleHandler(new Idler());
2)Idler主要去调用ActivityTaskManagerService::activityIdle()
3)然后ActivityStackSupervisor::activityIdleInternalLocked
4) ActivityStack.stopActivityLocked(r);
5)后面的流程同上面的流程,一直回调到Activity的onStop中。
这里需要注意的是,从一个Activity 调到另一个Activity onStop方法必定回调,不管前面的Activity是否被挡住;所以以前google官网介绍的,onStop是在完全被挡住才会调用是错的;
比如前面一个是全屏的ActivityA,后面启动的是没有状态的栏的ActivityB,后面启动的并没有挡住全屏的,但是全屏ActivityA 还是会被onStop。