1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > android 如何获取离开屏幕时间 android – SurfaceHolder回调如何与Activity生命周期相关?...

android 如何获取离开屏幕时间 android – SurfaceHolder回调如何与Activity生命周期相关?...

时间:2022-11-05 08:58:40

相关推荐

android 如何获取离开屏幕时间 android – SurfaceHolder回调如何与Activity生命周期相关?...

编辑:如果targetSDK大于10,将应用程序睡眠调用onPause和onStop。

Source

我在我的姜饼手机上的一个小相机应用程序中查看了活动和SurfaceView的生命周期。你是完全正确的;当按下电源按钮使手机进入睡眠状态时,表面不会被破坏。当手机进入睡眠状态时,Activity会执行onPause。 (并不做onStop。)当手机唤醒时,它执行onResume,并且,正如你指出,它在锁定屏幕仍然可见并接受输入时执行此操作,这是有点奇怪。当我通过按Home按钮使活动不可见时,Activity同时执行onPause和onStop。在这种情况下,在onPause的结束和onStop的开始之间,会导致回调surfaceDestroyed。这不是很明显,但它似乎非常一致。

当电源按钮按下以睡眠手机,除非明确地做了停止它,相机保持运行!如果我有相机对每个预览帧做一个每图像回调,在其中有一个Log.d(),日志语句不断来到,而手机假装睡觉。我认为这是非常鬼祟。

作为另一个混乱,回调surfaceCreated和surfaceChanged发生在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;

}

}

}

然后在Activity中:

@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被销毁和重新创建。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。