调用finish()的意义

下面的分析基于这个假设,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的判断。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值