1.finished之后的生命周期很明白.但finish之后的代码是否执行呢?
2.测试:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("hello wofrld 1");
finish();
System.out.println("hello wofrld 2");
}
3.结果:
hello wofrld 1
hello wofrld 2
//2017年4月21日更新
4.分析:
finish执行的是一个异步的方法,看finish源码
ActivityManagerNative.getDefault().finishActivity(mToken, resultCode, resultData, finishTask)
ActivityManagerNative.getDefault()
返回AMS(ActivityManagerService)的Binder发起IPC(进程间通信)异步调用AMS的finishActivity。类比线程的话就是thread.start(),所以UI线程继续往下走。
finish之后的onPause是怎么被调用的呢?
finishActivity的第一个实参mToken 是个Binder(IBinder接口) ,其实现类是ApplicationThread。
ApplicationThread是ActivityThread的内部类,所以持有ActivityThread对象的引用,可以愉快的往UI线程的Looper里put message。
ActivityThread:应用进程启动时FrameWork层创建的,持有管理着MessageQueue的Looper,MessageQueue无限循环,处理各种Service发来的信息(如InputManagerService发来的touch事件、AMS发来Activity的各种生命周期回调和应用自定义的Handler的信息。
所以把ApplicationThread这个Binder传给AMS,AMS就可以在处理完Activity的堆栈变更后(比如让stack中那个Activity接下来展示),通过ApplicationThread这个Binder 发起IPC向应用进程的MessageQueue里put事件,事件引发调用Activity对象的onPause方法(你可以在onPause抛个异常,看堆栈信息)。