PowerManager和PARTIAL_WAKE_LOCK行为

时间:2014-01-14 10:27:43

标签: android camera android-wake-lock powermanager

我使用闹钟定期拍照。我使用BroadcastReceiver如下:

@Override
public void onReceive(Context context, Intent intent) 
{
    Log.d(TAG, "Capturing pic");

    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "CAPPIC");
    wl.acquire();

    capturePicture();

    wl.release();
}

capturePicture()调用Camera.takePicture(...)然后结束。最后,如您所见,wl.release()被调用。

现在,问题是takePicture的回调在我的情况下非常耗时。实际上,它会对刚刚拍摄的照片执行一些操作,这可能需要5秒才能完成。

我的问题是,因为在调用takePicture回调的计算密集型任务时调用wl.release(),是否有任何副作用?也就是说,假设设备处于待机模式。闹钟开始 - >唤醒锁被激活 - >图片被采取和操纵,但同时计算唤醒锁被释放...是安全的还是设备在进入takePicture回调的例程结束之前返回待机模式的风险?

1 个答案:

答案 0 :(得分:2)

您的设置错误,因为您不应该在接收器中做很多事情,并且AlarmManager持有唤醒锁,onReceive()无论如何运行 - 是的编辑时不应该释放唤醒锁。您应该委托服务,并且由于详细原因here,这必须是WakefulIntentService。现在,在该服务中,您应该设置一个等待处理完成的机制 - 可能使用CountDownLatch。