文章目录
- 第一部分:基础入门题(考察核心生命周期认知)
-
- [1. 请说出Fragment完整的生命周期方法,按执行顺序罗列。](#1. 请说出Fragment完整的生命周期方法,按执行顺序罗列。)
- [2. Fragment的生命周期中,哪些方法是成对出现的,分别对应什么场景?](#2. Fragment的生命周期中,哪些方法是成对出现的,分别对应什么场景?)
- [3. Fragment的onCreate()和onCreateView()有什么区别,各自适合做什么操作?](#3. Fragment的onCreate()和onCreateView()有什么区别,各自适合做什么操作?)
- [4. Fragment从创建到显示在屏幕上,会依次执行哪些生命周期方法?](#4. Fragment从创建到显示在屏幕上,会依次执行哪些生命周期方法?)
- [5. Fragment从屏幕上消失到彻底销毁,会依次执行哪些生命周期方法?](#5. Fragment从屏幕上消失到彻底销毁,会依次执行哪些生命周期方法?)
- [6. onCreateView和onViewCreated方法区别](#6. onCreateView和onViewCreated方法区别)
- 第二部分:进阶基础题(结合Activity生命周期联动)
-
- [1. 请描述Activity正常启动时,与依附的Fragment之间生命周期方法的执行顺序。](#1. 请描述Activity正常启动时,与依附的Fragment之间生命周期方法的执行顺序。)
- [2. 请描述Activity正常退出销毁时,与依附的Fragment之间生命周期方法的执行顺序。**](#2. 请描述Activity正常退出销毁时,与依附的Fragment之间生命周期方法的执行顺序。**)
- [3. Activity执行onPause()、onStop()时,Fragment会分别触发哪些生命周期方法?**](#3. Activity执行onPause()、onStop()时,Fragment会分别触发哪些生命周期方法?**)
- [4. Activity执行onRestart()时,Fragment会触发哪些生命周期方法?](#4. Activity执行onRestart()时,Fragment会触发哪些生命周期方法?)
- [5. Activity配置变更(如屏幕旋转),不手动处理的情况下,Activity和Fragment的生命周期分别如何变化?](#5. Activity配置变更(如屏幕旋转),不手动处理的情况下,Activity和Fragment的生命周期分别如何变化?)
- [6. Activity被系统回收后重建,Fragment会重新执行完整生命周期吗,和初次创建有什么区别? **](#6. Activity被系统回收后重建,Fragment会重新执行完整生命周期吗,和初次创建有什么区别? **)
- [7. 依附于Activity的Fragment,能不能脱离Activity单独执行生命周期?](#7. 依附于Activity的Fragment,能不能脱离Activity单独执行生命周期?)
- 第三部分:场景应用题(日常开发高频场景)
-
- [1. 使用add()方法添加Fragment,隐藏(hide)该Fragment,会触发哪些生命周期方法?](#1. 使用add()方法添加Fragment,隐藏(hide)该Fragment,会触发哪些生命周期方法?)
- [2. 被hide的Fragment,再次show()显示出来,会触发哪些生命周期方法?](#2. 被hide的Fragment,再次show()显示出来,会触发哪些生命周期方法?)
- [3. 使用replace()方法替换Fragment,被替换掉的旧Fragment会执行哪些生命周期方法?](#3. 使用replace()方法替换Fragment,被替换掉的旧Fragment会执行哪些生命周期方法?)
- [4. addToBackStack()添加回退栈,对Fragment生命周期有什么影响?](#4. addToBackStack()添加回退栈,对Fragment生命周期有什么影响?)
- [5. 点击返回键,弹出回退栈中的Fragment,该Fragment会执行哪些生命周期方法?](#5. 点击返回键,弹出回退栈中的Fragment,该Fragment会执行哪些生命周期方法?)
- [6. 使用ViewPager2加载Fragment,左右滑动切换页面时,Fragment会触发哪些生命周期方法?](#6. 使用ViewPager2加载Fragment,左右滑动切换页面时,Fragment会触发哪些生命周期方法?)
- [7. 使用ViewPager加载Fragment,结合setOffscreenPageLimit()设置缓存页数,切换页面时,离屏Fragment的生命周期会如何变化?](#7. 使用ViewPager加载Fragment,结合setOffscreenPageLimit()设置缓存页数,切换页面时,离屏Fragment的生命周期会如何变化?)
- [8. DialogFragment弹出和关闭时,自身以及依附的Activity会触发哪些生命周期方法?](#8. DialogFragment弹出和关闭时,自身以及依附的Activity会触发哪些生命周期方法?)
- [9. 动态移除(remove)一个Fragment,会触发该Fragment的哪些生命周期方法?](#9. 动态移除(remove)一个Fragment,会触发该Fragment的哪些生命周期方法?)
- [10. Fragment进入后台,再切回前台,生命周期方法如何执行?](#10. Fragment进入后台,再切回前台,生命周期方法如何执行?)
- 第四部分:疑难场景题(大厂高频难点)
-
- [1. 同一个Fragment实例,重复添加到Activity中,生命周期会出现异常吗,会触发哪些方法?](#1. 同一个Fragment实例,重复添加到Activity中,生命周期会出现异常吗,会触发哪些方法?)
- [2. Fragment嵌套(子Fragment依附父Fragment),父子Fragment的生命周期执行顺序是什么?](#2. Fragment嵌套(子Fragment依附父Fragment),父子Fragment的生命周期执行顺序是什么?)
- [3. 父Fragment执行生命周期方法,子Fragment会同步执行吗,有哪些例外情况?](#3. 父Fragment执行生命周期方法,子Fragment会同步执行吗,有哪些例外情况?)
- [4. 屏幕旋转时,如何避免Fragment重新创建,此时生命周期如何变化?](#4. 屏幕旋转时,如何避免Fragment重新创建,此时生命周期如何变化?)
- [5. Fragment设置setRetainInstance(true),配置变更时,生命周期会跳过哪些方法?](#5. Fragment设置setRetainInstance(true),配置变更时,生命周期会跳过哪些方法?)
- [6. Activity设置为单任务模式、透明主题时,依附的Fragment生命周期有什么变化?](#6. Activity设置为单任务模式、透明主题时,依附的Fragment生命周期有什么变化?)
- [7. Fragment从布局文件静态注册,和代码动态添加,生命周期执行有什么区别?](#7. Fragment从布局文件静态注册,和代码动态添加,生命周期执行有什么区别?)
- [8. Fragment的onDestroyView()和onDestroy()有什么区别,什么情况下会只执行onDestroyView()?](#8. Fragment的onDestroyView()和onDestroy()有什么区别,什么情况下会只执行onDestroyView()?)
- [9. 使用导航组件(Navigation)切换Fragment,生命周期和普通replace()有什么不同?](#9. 使用导航组件(Navigation)切换Fragment,生命周期和普通replace()有什么不同?)
- [10. 系统内存不足,回收后台Fragment,Fragment恢复时生命周期如何执行?](#10. 系统内存不足,回收后台Fragment,Fragment恢复时生命周期如何执行?)
- 第五部分:原理深挖题(高级工程师考察)
-
- [1. Fragment的生命周期由谁控制,和Activity的生命周期管理有什么核心区别?](#1. Fragment的生命周期由谁控制,和Activity的生命周期管理有什么核心区别?)
- [2. 为什么Fragment的onCreateView()不能耗时操作,onViewCreated()适合做什么?](#2. 为什么Fragment的onCreateView()不能耗时操作,onViewCreated()适合做什么?)
- [3. FragmentManager是如何调度Fragment生命周期的,核心流程是什么?](#3. FragmentManager是如何调度Fragment生命周期的,核心流程是什么?)
- [4. 为什么hide()/show()不会触发Fragment的视图销毁重建,而replace()会?](#4. 为什么hide()/show()不会触发Fragment的视图销毁重建,而replace()会?)
- [5. Fragment生命周期中,哪些方法可以做耗时操作,哪些方法严禁耗时操作?](#5. Fragment生命周期中,哪些方法可以做耗时操作,哪些方法严禁耗时操作?)
- [6. AndroidX Fragment和support库中的Fragment,生命周期有什么差异?](#6. AndroidX Fragment和support库中的Fragment,生命周期有什么差异?)
- [7. 如何监听Fragment的生命周期,除了重写方法还有哪些方式?](#7. 如何监听Fragment的生命周期,除了重写方法还有哪些方式?)
- [8. Fragment状态保存和恢复,对应哪些生命周期方法,和Activity的状态保存有什么关联?](#8. Fragment状态保存和恢复,对应哪些生命周期方法,和Activity的状态保存有什么关联?)
- [9. 为什么在 Fragment 中监听 LiveData 要使用 viewLifecycleOwner](#9. 为什么在 Fragment 中监听 LiveData 要使用 viewLifecycleOwner)
第一部分:基础入门题(考察核心生命周期认知)
1. 请说出Fragment完整的生命周期方法,按执行顺序罗列。
答案:标准完整生命周期顺序:onAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> onActivityCreated()(已废弃) -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()。
注:AndroidX版本中onActivityCreated()已废弃,相关逻辑移至onViewCreated()。
2. Fragment的生命周期中,哪些方法是成对出现的,分别对应什么场景?
答案:
-
onAttach() 与 onDetach():绑定Activity、脱离Activity成对出现;
-
onCreate() 与 onDestroy():创建实例、销毁实例成对出现;
-
onCreateView() 与 onDestroyView():创建视图、销毁视图成对出现;
-
onStart() 与 onStop():可见、不可见成对出现;
-
onResume() 与 onPause():获取焦点、失去焦点成对出现。
3. Fragment的onCreate()和onCreateView()有什么区别,各自适合做什么操作?
答案:
-
onCreate():实例创建阶段调用,此时还未创建视图,执行时机早于onCreateView(),适合做初始化数据、初始化非视图对象、获取参数、注册广播等操作;
-
onCreateView():用于加载并返回Fragment布局视图,核心是创建视图层级,适合做布局填充,不适合做耗时操作和视图控件绑定;
-
区别:onCreate()无视图,onCreateView()负责创建视图;onCreate()只执行一次,onCreateView()可能因视图重建多次执行。
4. Fragment从创建到显示在屏幕上,会依次执行哪些生命周期方法?
答案:onAttach() -> onCreate() -> onCreateView() -> onViewCreated() -> onStart() -> onResume(),执行完onResume()后,Fragment完全可见且可交互。
5. Fragment从屏幕上消失到彻底销毁,会依次执行哪些生命周期方法?
答案:onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()。
6. onCreateView和onViewCreated方法区别

第二部分:进阶基础题(结合Activity生命周期联动)
1. 请描述Activity正常启动时,与依附的Fragment之间生命周期方法的执行顺序。
答案:Activity的onCreate() -> Fragment的onAttach() -> Fragment的onCreate() -> Fragment的onCreateView() -> Fragment的onViewCreated() -> Activity的onStart() -> Fragment的onStart() -> Activity的onResume() -> Fragment的onResume()。
2. 请描述Activity正常退出销毁时,与依附的Fragment之间生命周期方法的执行顺序。**
答案:Fragment的onPause() -> Activity的onPause() -> Fragment的onStop() -> Activity的onStop() -> Fragment的onDestroyView() -> Fragment的onDestroy() -> Fragment的onDetach() -> Activity的onDestroy()。
3. Activity执行onPause()、onStop()时,Fragment会分别触发哪些生命周期方法?**
答案:
-
Activity执行onPause():Fragment先执行onPause();
-
Activity执行onStop():Fragment先执行onStop();
整体顺序:Fragment的onPause() → Activity的onPause() → Fragment的onStop() → Activity的onStop()。
4. Activity执行onRestart()时,Fragment会触发哪些生命周期方法?
答案:Activity执行onRestart()之后,会触发Fragment的onStart(),随后Activity执行onStart()、onResume(),Fragment再执行onResume()。
5. Activity配置变更(如屏幕旋转),不手动处理的情况下,Activity和Fragment的生命周期分别如何变化?
答案:
-
Activity:会销毁重建,执行onPause()→onStop()→onDestroy(),随后重新执行onCreate()→onStart()→onResume();
-
Fragment:默认跟随Activity销毁重建,执行onPause()→onStop()→onDestroyView()→onDestroy()→onDetach(),再重新执行onAttach()→onCreate()→onCreateView()→onStart()→onResume();
-
视图和数据会丢失,除非做状态保存。
6. Activity被系统回收后重建,Fragment会重新执行完整生命周期吗,和初次创建有什么区别? **
- 会重建并执行完整生命周期;
- 区别:重建时Fragment会恢复之前保存的状态数据,初次创建无历史状态;系统会自动恢复Fragment实例,不需要手动重新添加;如果是动态添加的Fragment,系统会自动恢复,无需重复add。
7. 依附于Activity的Fragment,能不能脱离Activity单独执行生命周期?
答案:不能。Fragment是依赖于Activity的组件,没有独立的任务栈,生命周期完全由宿主Activity和FragmentManager调度控制,必须依附Activity才能运行,无法单独存在、单独执行生命周期。
第三部分:场景应用题(日常开发高频场景)
1. 使用add()方法添加Fragment,隐藏(hide)该Fragment,会触发哪些生命周期方法?
答案:hide()操作不会触发任何生命周期方法,Fragment只是视图不可见,实例、视图依然存活,不会执行onPause、onStop、onDestroyView等方法。
2. 被hide的Fragment,再次show()显示出来,会触发哪些生命周期方法?
答案:show()操作同样不会触发任何生命周期方法,只是把隐藏的视图重新显示,实例和视图全程保持存活。
3. 使用replace()方法替换Fragment,被替换掉的旧Fragment会执行哪些生命周期方法?
答案:不加入回退栈的情况下,旧Fragment会执行:onPause()→onStop()→onDestroyView()→onDestroy()→onDetach(),彻底销毁;
加入回退栈的情况下,旧Fragment只会执行:onPause()→onStop()→onDestroyView(),实例保留,不执行onDestroy和onDetach。
4. addToBackStack()添加回退栈,对Fragment生命周期有什么影响?
答案:
-
调用replace()时配合addToBackStack(),被替换的Fragment不会彻底销毁,只会销毁视图(执行onDestroyView),实例保留在内存中;
-
Fragment会被加入回退栈,点击返回键可以恢复;
-
不会影响新添加Fragment的生命周期执行。
5. 点击返回键,弹出回退栈中的Fragment,该Fragment会执行哪些生命周期方法?
答案:弹出回退栈,恢复之前的Fragment,会重新执行视图创建相关方法:onCreateView()→onViewCreated()→onStart()→onResume(),重建视图,实例复用。
6. 使用ViewPager2加载Fragment,左右滑动切换页面时,Fragment会触发哪些生命周期方法?
答案:
-
切离当前页面:Fragment执行onPause()→onStop(),视图保留,实例存活;
-
切回当前页面:Fragment执行onStart()→onResume();
-
默认不会销毁视图,除非页面被回收。
7. 使用ViewPager加载Fragment,结合setOffscreenPageLimit()设置缓存页数,切换页面时,离屏Fragment的生命周期会如何变化?
答案:
-
在缓存页数范围内的离屏Fragment:只会执行onPause()→onStop(),不销毁视图和实例;
-
超出缓存页数的Fragment:会执行onPause()→onStop()→onDestroyView(),销毁视图,实例保留,切回时重建视图。
8. DialogFragment弹出和关闭时,自身以及依附的Activity会触发哪些生命周期方法?
答案:
-
弹出:DialogFragment执行onStart()→onResume(),宿主Activity不会触发任何生命周期方法;
-
关闭:DialogFragment执行onPause()→onStop()→onDestroyView(),宿主Activity依然不会触发生命周期;
-
只有DialogFragment彻底销毁,才会执行onDestroy()→onDetach()。
9. 动态移除(remove)一个Fragment,会触发该Fragment的哪些生命周期方法?
答案:完整销毁流程:onPause()→onStop()→onDestroyView()→onDestroy()→onDetach(),实例和视图全部销毁,无法恢复。
10. Fragment进入后台,再切回前台,生命周期方法如何执行?
答案:
-
进入后台:Fragment执行onPause()→onStop();
-
切回前台:Fragment执行onStart()→onResume();
全程不销毁视图和实例。
第四部分:疑难场景题(大厂高频难点)
1. 同一个Fragment实例,重复添加到Activity中,生命周期会出现异常吗,会触发哪些方法?
答案:
-
会出现异常,直接抛出IllegalStateException,提示Fragment已添加;
-
不会触发完整生命周期,添加操作直接失败;
-
原因:一个Fragment实例只能绑定一个Activity,且只能添加一次,重复添加会冲突。
2. Fragment嵌套(子Fragment依附父Fragment),父子Fragment的生命周期执行顺序是什么?
答案:
-
创建顺序:父Fragment先执行onAttach→onCreate→onCreateView→onViewCreated,随后子Fragment执行完整的创建生命周期(onAttach→onCreate→onCreateView...),最后父子Fragment同步执行onStart→onResume;
-
销毁顺序:子Fragment先执行销毁流程(onPause→onStop...),父Fragment再执行销毁流程。
3. 父Fragment执行生命周期方法,子Fragment会同步执行吗,有哪些例外情况?
答案:
-
正常情况下会同步执行:父Fragment执行onPause、onStop、onStart、onResume,子Fragment会同步执行;
-
例外:父Fragment执行onCreate、onDestroy、onDestroyView时,子Fragment生命周期不受影响;子Fragment单独hide/show,不会影响父Fragment;父Fragment视图重建,子Fragment也会重建视图。
4. 屏幕旋转时,如何避免Fragment重新创建,此时生命周期如何变化?
答案:
-
避免重建方式:在Activity注册时配置android:configChanges="orientation|screenSize",拦截配置变更,不让Activity销毁重建;
-
生命周期变化:Activity和Fragment都不会执行销毁和重建流程,无任何生命周期方法调用,视图和数据保持原样。
5. Fragment设置setRetainInstance(true),配置变更时,生命周期会跳过哪些方法?
答案:
-
会跳过onDestroy()和onDetach(),Fragment实例不会销毁;
-
依然会执行onPause→onStop→onDestroyView销毁视图;
-
重建时跳过onAttach→onCreate,直接执行onCreateView→onStart→onResume,复用原有实例。
6. Activity设置为单任务模式、透明主题时,依附的Fragment生命周期有什么变化?
答案:
-
单任务模式:Activity不会重复创建,Fragment也不会重复创建,切换到该Activity,Fragment执行onStart→onResume;
-
透明主题Activity:启动透明Activity,原Activity和Fragment不会执行onStop,只会执行onPause;关闭透明Activity,Fragment直接执行onResume,不执行onStart。
7. Fragment从布局文件静态注册,和代码动态添加,生命周期执行有什么区别?
答案:
-
静态注册:生命周期跟随Activity自动执行,无法手动控制添加、移除、替换,Activity销毁时Fragment自动销毁;
-
动态添加:可手动控制生命周期调度,支持add、remove、replace、hide、show等操作,可加入回退栈,灵活性更高;
-
静态注册Fragment不能重复添加,动态添加可灵活管理多个Fragment。
8. Fragment的onDestroyView()和onDestroy()有什么区别,什么情况下会只执行onDestroyView()?
答案:
-
区别:onDestroyView()仅销毁Fragment的视图层,实例依然存活;onDestroy()销毁Fragment实例,释放所有资源;
-
只执行onDestroyView()场景:replace()配合addToBackStack()、ViewPager缓存页面超出限制、屏幕旋转且设置setRetainInstance(true)。
9. 使用导航组件(Navigation)切换Fragment,生命周期和普通replace()有什么不同?
答案:
-
Navigation切换:默认自动加入回退栈,离开的Fragment只执行onDestroyView,实例保留;返回时重建视图,复用实例;
-
普通replace():不加回退栈会彻底销毁Fragment;
-
Navigation生命周期更规范,能自动处理状态恢复和回退逻辑。
10. 系统内存不足,回收后台Fragment,Fragment恢复时生命周期如何执行?
答案:
-
系统回收时,Fragment会执行完整销毁流程;
-
恢复时,重新执行完整生命周期:onAttach→onCreate→onCreateView→onStart→onResume;
-
会恢复之前保存的状态数据,视图重新创建。
第五部分:原理深挖题(高级工程师考察)
1. Fragment的生命周期由谁控制,和Activity的生命周期管理有什么核心区别?
答案:
-
控制方:Fragment生命周期由宿主Activity和FragmentManager(SupportFragmentManager/ChildFragmentManager)共同调度,通过事务(FragmentTransaction)触发;
-
核心区别:Activity生命周期由系统AMS调度,受任务栈和系统资源管理;Fragment生命周期受控于宿主和代码手动事务,灵活性更高,可单独控制显示、隐藏、销毁视图,不依赖系统调度。
2. 为什么Fragment的onCreateView()不能耗时操作,onViewCreated()适合做什么?
答案:
-
onCreateView()是UI绘制关键流程,耗时操作会阻塞主线程,导致页面卡顿、黑屏;该方法核心职责是填充布局,必须快速返回View对象;
-
onViewCreated()在视图创建完成后调用,适合做控件绑定、设置监听、加载数据、初始化视图样式、接收数据赋值等操作。
3. FragmentManager是如何调度Fragment生命周期的,核心流程是什么?
答案:
-
FragmentManager通过FragmentTransaction收集操作(add、remove、replace等),提交事务后执行调度;
-
监听宿主Activity生命周期,同步分发onStart、onResume、onPause等生命周期;
-
维护Fragment栈和状态,根据事务类型、回退栈状态,决定执行完整销毁还是仅销毁视图;
-
配置变更时,负责保存和恢复Fragment状态,重建Fragment实例。
4. 为什么hide()/show()不会触发Fragment的视图销毁重建,而replace()会?
答案:
-
hide()/show()只是改变Fragment视图的可见性(setVisibility),不改变Fragment的添加状态和实例状态,FragmentManager不会调度生命周期;
-
replace()本质是remove旧Fragment+add新Fragment,会触发Fragment的移除和添加逻辑,视图层会被销毁重建;
-
两者底层实现逻辑不同,hide/show是视图操作,replace是实例调度操作。
5. Fragment生命周期中,哪些方法可以做耗时操作,哪些方法严禁耗时操作?
答案:
-
严禁耗时操作(主线程阻塞):onCreate、onCreateView、onViewCreated、onStart、onResume、onPause、onStop、onDestroyView,这些方法属于UI生命周期,耗时会卡顿;
-
可做轻量耗时(建议开子线程):onDestroy、onDetach(资源释放);
-
所有耗时操作必须放在子线程执行,配合回调更新UI。
6. AndroidX Fragment和support库中的Fragment,生命周期有什么差异?
答案:
-
AndroidX移除了onActivityCreated()方法,相关逻辑合并到onViewCreated();
-
AndroidX新增了onViewCreated()、onStateChanged()等更细化的生命周期回调;
-
AndroidX生命周期调度更严谨,修复了旧support库的内存泄漏、状态丢失问题;
-
AndroidX支持更好的状态保存和恢复,嵌套Fragment生命周期更稳定。
7. 如何监听Fragment的生命周期,除了重写方法还有哪些方式?
答案:
-
重写Fragment生命周期方法(最常用);
-
通过FragmentManager.registerFragmentLifecycleCallbacks()注册全局监听;
-
使用LifeCycleOwner,配合LiveData、LifecycleObserver观察者模式监听;
-
通过ViewModel感知生命周期变化。
8. Fragment状态保存和恢复,对应哪些生命周期方法,和Activity的状态保存有什么关联?
答案:
-
Fragment状态保存:onSaveInstanceState()(销毁前调用),恢复:onViewCreated()、onActivityCreated()(废弃)中获取Bundle数据;
-
关联:Activity的onSaveInstanceState()会触发Fragment的状态保存;Activity重建时,会把保存的状态分发给Fragment,完成数据恢复;
-
Fragment和Activity共用状态保存机制,状态数据相互关联。
9. 为什么在 Fragment 中监听 LiveData 要使用 viewLifecycleOwner
在 Fragment 中监听 LiveData 时使用 viewLifecycleOwner 是为了确保观察者的生命周期与 Fragment 的视图生命周期保持一致,避免在视图已经销毁后仍然收到数据更新,从而导致崩溃或内存泄漏。
Fragment 的生命周期比它的视图更长,例如在 onDestroyView() 之后,Fragment 实例可能还存在,但视图已经被销毁。如果使用 this(即 Fragment 本身)作为生命周期所有者,LiveData 的观察者仍然活跃,一旦数据更新,可能会尝试更新已经不存在的 UI 组件,引发空指针异常。
而 viewLifecycleOwner 的生命周期绑定的是 Fragment 的视图创建到销毁的过程(从 onCreateView 到 onDestroyView)。使用它来观察 LiveData,可以确保在视图销毁后自动解除监听,避免不必要的风险。