Edit:如果 targetSDK 大于 10,则使应用程序进入睡眠状态调用onPause
and onStop
. Source https://stackoverflow.com/a/25497907/1094605
我在姜饼手机上的微型相机应用程序中查看了 Activity 和 SurfaceView 的生命周期。你是完全正确的;当按下电源按钮使手机进入睡眠状态时,表面不会被破坏。当手机进入睡眠状态时,该 Activity 会执行以下操作:onPause
。 (并且不做onStop
.) 确实如此onResume
当手机唤醒时,正如您所指出的,它会在锁定屏幕仍然可见并接受输入的情况下执行此操作,这有点奇怪。当我通过按主页按钮使活动不可见时,活动会同时执行以下操作onPause
and onStop
。有些事情会导致回调surfaceDestroyed
在这种情况下结束之间onPause
和开始onStop
。虽然不是很明显,但看起来确实很一致。
当按下电源按钮使手机进入睡眠状态时,除非明确执行某些操作来停止它,否则相机会继续运行!如果我让相机为每个预览帧执行每个图像的回调,其中包含 Log.d(),则当手机假装睡眠时,日志语句会不断出现。我认为那是非常鬼祟.
另一个令人困惑的是,回调surfaceCreated
and surfaceChanged
happen after onResume
在活动中,如果正在创建表面。
通常,我在实现 SurfaceHolder 回调的类中管理相机。
class Preview extends SurfaceView implements SurfaceHolder.Callback {
private boolean previewIsRunning;
private Camera camera;
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
// ...
// but do not start the preview here!
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// set preview size etc here ... then
myStartPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
myStopPreview();
camera.release();
camera = null;
}
// safe call to start the preview
// if this is called in onResume, the surface might not have been created yet
// so check that the camera has been set up too.
public void myStartPreview() {
if (!previewIsRunning && (camera != null)) {
camera.startPreview();
previewIsRunning = true;
}
}
// same for stopping the preview
public void myStopPreview() {
if (previewIsRunning && (camera != null)) {
camera.stopPreview();
previewIsRunning = false;
}
}
}
然后在活动中:
@Override public void onResume() {
preview.myStartPreview(); // restart preview after awake from phone sleeping
super.onResume();
}
@Override public void onPause() {
preview.myStopPreview(); // stop preview in case phone is going to sleep
super.onPause();
}
这对我来说似乎没问题。旋转事件会导致 Activity 被销毁并重新创建,这也会导致 SurfaceView 被销毁并重新创建。