Я использую будильник, чтобы делать снимки с регулярными интервалами времени. Я использую BroadcastReceiver следующим образом:Поведение PowerManager и PARTIAL_WAKE_LOCK
@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();
}
The capturePicture()
звонки Camera.takePicture(...)
, а затем завершается. Наконец, как вы можете видеть, вызывается wl.release()
.
Проблема в том, что обратный вызов takePicture
занимает очень много времени в моем случае. Фактически, он выполняет некоторые манипуляции на только что снятой картинке, которая может занять до 5 секунд на моем устройстве.
Вопрос, так как wl.release()
вызывается, когда вычислительная интенсивная задача выполняется в обратном вызове takePicture, есть ли побочный эффект? То есть, предположим, что устройство находится в режиме ожидания. Начинается тревога -> активируется wakelock -> снимается и обрабатывается изображение, но в то же время выдается рассылка wakelock ... безопасно или существует риск того, что устройство вернется в режим ожидания до того, как процедуры завершается обратный вызов takePicture?
Большое спасибо @Mr_and_Mrs_D за ваше предложение ответа. Но что касается кода, о котором я сообщал в своем сообщении, как долго процессор будет продолжать работать после 'release()'? Я имею в виду, предположим, что устройство находится в режиме ожидания, затем запускается будильник и используется «PowerManager.PARTIAL_WAKE_LOCK». Исходя из этого, из документации API я прочитал: «Если вы удерживаете частичную блокировку слежения, процессор будет продолжать работать независимо от любых тайм-аутов дисплея или состояния экрана и даже после нажатия пользователем кнопки питания». _, но когда вызывается 'release()', устройство возвращается в режим ожидания мгновенно? – user2923045
Мой вопрос, потому что мое приложение прекрасно работает, когда устройство подключено к источнику питания, но оно не работает (время от времени), когда устройство работает с батареями ... – user2923045
Ваш wakelock в onReceive ничего не делает. AlarmManager держит его для вас во время onReceive. Вы должны использовать WakefulIntentService в качестве ответа в моем ответе. Там вам нужно дождаться завершения обработки (я не знаю, как - задайте другой вопрос). Пока вы ждете в WIS, вы в безопасности - WIS имеет блокировку слежения. Ожидается отказ от батарей, а не отказ от питания - в батареях он не спит как можно скорее –