surfaceDestroyed具体在什么情况下会被调用?

surfaceDestroyed什么时候被调用 在Android开发中,`surfaceDestroyed()`是`SurfaceHolder.Callback`接口的核心方法之一,主要用于通知应用Surface已被销毁或即将不可用。其调用时机与`Surface`的生命周期、Activity状态及系统环境密切相关,具体可归纳为以下场景:

一、Activity进入后台或失去焦点时

当Activity从可见状态切换为不可见状态,例如用户按下Home键、切换到其他应用,或被透明Activity覆盖时,系统会尝试回收Surface资源。此时,`surfaceDestroyed()`通常在Activity的`onPause()`方法执行后、`onStop()`方法执行前被调用。这是因为Surface作为UI渲染的载体,在Activity失去焦点后已显示必要,系统会通过该回调通知应用释放与Surface相关的资源如GL纹理、绘图缓存等。

二、Activity销毁或重建时

在Activity正常销毁如用户按返回键触发`onDestroy()`或因配置变更如屏幕旋转、语言切换导致重建时,`surfaceDestroyed()`会被调用。以屏幕旋转为例,旧Activity实例销毁过程中,其持有的Surface会被系统回收,此时`surfaceDestroyed()`会在旧Activity的`onDestroy()`之前触发;而新Activity创建时,会通过`surfaceCreated()`重新创建Surface。这种场景下,`surfaceDestroyed()`的调用是新旧Surface交替的关键信号。

三、Surface被主动移除或隐藏时

若应用通过代码主动隐藏或移除Surface如调用`SurfaceView`的`setVisibility(View.GONE)`,或`SurfaceHolder`被释放如调用`SurfaceHolder.removeCallback()`,系统会立即触发`surfaceDestroyed()`。此外,当`SurfaceView`所在的窗口被系统强行缩减尺寸如分屏模式切换,导致Surface法继续保持原有大小和格式时,也会通过该方法通知应用Surface已失效。

四、应用进程被系统终止前

当系统因内存不足或其他原因需要终止应用进程时,会先销毁Activity及相关资源,此时`surfaceDestroyed()`会作为Surface生命周期的最后一环被调用。这一过程中,应用需在该回调中紧急释放关键资源如停止渲染线程、释放硬件加速上下文,避免内存泄漏或崩溃。

综上,`surfaceDestroyed()`的调用本质是Surface从“可用”到“不可用”的状态切换通知,其触发场景涵盖Activity状态变化、配置变更、主动操作及系统干预等多种情况。开发者需在该方法中确保及时释放Surface相关资源,以保证应用的稳定性和资源效率。

延伸阅读:

    暂无相关