SurfaceView 后台切换后黑屏
时间: 2023-06-13 11:05:33 浏览: 69
在 Android 中,当应用程序进入后台并被系统销毁时,SurfaceView 可能会出现黑屏的问题。这是因为 SurfaceView 的生命周期和 Activity 的生命周期不同,当 Activity 进入后台时,SurfaceView 可能会停止更新,从而导致黑屏。
解决这个问题的方法是在 SurfaceView 的 `surfaceCreated` 方法中创建一个后台线程,并在该线程中更新 SurfaceView。当 Activity 进入后台时,这个后台线程仍然在运行,从而保证了 SurfaceView 的更新。
具体实现方式如下:
1. 在 SurfaceView 的构造函数中创建一个 HandlerThread 对象,并启动该线程:
```java
class MySurfaceView extends SurfaceView implements SurfaceHolder.Callback {
private HandlerThread mHandlerThread;
private Handler mHandler;
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
getHolder().addCallback(this);
// 创建后台线程
mHandlerThread = new HandlerThread("MySurfaceView");
mHandlerThread.start();
// 在后台线程中创建 Handler
mHandler = new Handler(mHandlerThread.getLooper());
}
}
```
2. 在 SurfaceView 的 surfaceCreated 方法中创建一个后台任务,并使用 Handler.post() 方法将任务 post 到后台线程中:
```java
@Override
public void surfaceCreated(SurfaceHolder holder) {
// 创建后台任务
Runnable runnable = new Runnable() {
@Override
public void run() {
while (true) {
// 在后台线程中更新 SurfaceView
Canvas canvas = holder.lockCanvas();
if (canvas != null) {
// 绘制 SurfaceView
holder.unlockCanvasAndPost(canvas);
}
}
}
};
// 将任务 post 到后台线程中
mHandler.post(runnable);
}
```
这样,在 Activity 进入后台时,后台线程仍然在运行,从而保证了 SurfaceView 的更新。