finish()和onDestroy() 区别什么?
1.finish 做了什么?
finsh 是我们主动调用的。起点源于
- android.app.Activity#finish()
主要是把当前Activity从Task栈中移除。
1 | public void finish() { |
- android.app.Activity#finish(int)
1 | private void finish(int finishTask) { |
- com.android.server.am.ActivityManagerService#finishActivity
1 | /** |
- com.android.server.am.ActivityStack#requestFinishActivityLocked
1 | /** |
- ActivityStack#finishActivityLocked
1 | /** |
- 总的流程
2.onDestory 做了什么?
onDestory主要是进行资源回收,把还在占用的资源释放,里面有很多close。
onDestory 回调方法也是由AMS发出 的 ClientTransaction 消息,然后主线程的looper处理这个消息,通过 transaction.getLifecycleStateRequest() 获知是 DestroyActivityItem ,最后就一步步调用到onDestory了。
调用过程如下
1 | onDestroy():95, MainActivity |
再来看下
- android.app.Activity#onDestroy
1 | protected void onDestroy() { |
- android.app.Application#dispatchActivityDestroyed
1 | void dispatchActivityDestroyed(Activity activity) { |
- 可以通过 android.app.Application#registerActivityLifecycleCallbacks 注册destroye callbacks
基本到这里onDestroy 就是已经做完了。
再次总结
- finish 主动调用,activity栈中就没有这个了,再也不能返回到这个activity。但是这个activity实例对象还在堆中
- onDestory AMS回调,调用,比如上滑关闭Activity,比如手动调用finish引发onDestory。onDestroy只是关闭这个Activity对象 持有的一些系统资源。但是这个activity实例对象还在堆中
- 存在内存泄漏问题?就是上面的finish和onDestory 做完之后,这个activity实例对象还在堆中,还要等待GC的到来,但是,但是, 如果我们在其它地方错误的保留了一个对该activity实例的引用,间接或直接的引用,就会发生内存泄漏。就算你走完了finish和onDestory。
最常见错误的就是 在Activity 中 保留了某一个单列的引用
来源及感谢
Activity相关学习-finish activity https://www.jianshu.com/p/f3dbf635f2c4