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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值