下面的分析基于这个假设,finish当前Activity退出后,去到的那个Activity还是同一应用进程的。
1.调用finish()后,具体有什么意义。
一个Activity的各个生命周期是运行在一个应用进程的主线程当中。而一个Activity中的代码需要被运行
有两种入口,第一种是生命周期的回调方法,如oncreate,onresume等。第二种就是主线程(UI线程)的
消息队列分派消息到Handler中,则Handler的run方法在主线程中执行。
主线程的消息队列中的消息从哪里来?从ActivityThread发来的各种消息,需要当前Activity处理的触
摸事件等。
当finish()调用后,就会跟AMS进行非阻塞式的Binder通信了,AMS会去回调应用进程的binder回调
方法,然后这些回调方法会通过该应用进程ActivityThread的Handler发消息到主线程的消息队列中,
然后会回调onpause,onstop,ondestroy()。然后这个Activity的其他生命周期不会再被调用了。
还会销毁该Activity的界面。触摸事件到了该应用进程主线程消息队列后(假如从该Activity返回后去到
的Activity也是在同一进程的),也不会分派给这个Activity了。
该Activity的状态变了,已经是finished或者finishing状态了,已经不是处于最上面的Activity了,受到AMS
的待遇也变了。上面就是调用finish()的意义了。
2.调用finish(),从finish()返回后,下面的代码会继续执行吗?为什么?
会。线程有方法栈,线程一直执行下去,直到栈中的方法全部弹出为止。Android主线程除了有一般线程的
属性意外,他还是由消息队列驱动的,就是说他有个死循环,会不断去消息队列中取出消息,调用Handler
的run方法去执行。
当前Activity被销毁后,下个Activity使用的消息队列也是同一个。那么在该Activity退出后,上个Activity的送
到主线程消息队列的消息应该还是会被执行的。但是有些变量可能已经被回收了,所以在Activity finish后
使用原Activity里变量会有风险。所以在调用了onDestroy后需要把之前送到消息队列还未执行的消息给撤
回了,把一些有风险的子线程停掉。或者有些地方加上isFinishing的判断。