PowerManager.PARTIAL_WAKE_LOCK для Android
Я очень запутался, стоит ли приобретать этот вейклок. Например, у меня есть этот тип кода, который вызывается из onReceive()
из BroadcastReceiever
(CONNECTIVITY_CHANGE, BOOT_COMPLETED и т. Д.) Асинхронно, т.е. я запускаю IntentService
от onReceive()
который выполняет тяжелую работу.
private static void insertInDatabase(Context context /*, some data to be inserted in database*/) {
Database helper = Database.getInstance(context);
PowerManager pm = (PowerManager) context
.getSystemService(Context.POWER_SERVICE);
final WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakelockName);
wakeLock.acquire();
try {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues cv = new ContentValues();
// insert data in database here
} finally {
wakeLock.release();
}
}
Является ли этот сценарий подходящим кандидатом для приобретения PowerManager.PARTIAL_WAKE_LOCK
?
2 ответа
Ответ @paha упускает важный момент: IntentService недостаточно. Между onReceive()
заканчивается и IntentService запускается, телефон может снова заснуть. Вам нужна (статическая) блокировка для преодоления этого разрыва - это реализовано в Mark Murpphy's WakefulIntentService
Так что держите AlarmManager и приемник, но запустите WakefulIntentService
от твоего onReceive()
,
Увидеть:
Метод onReceive(
) работает в главном потоке приложений, и вы не знаете, как долго insertInDatabase()
возьму. Используйте IntentService
для выполнения вставки базы данных и планирования ваших сигналов тревоги. IntentService
позвоню вашему onHandleIntent()
в фоновом потоке, так что вы можете занять необходимое время, и сервис автоматически отключается, когда onHandleIntent()
завершается.
public class MyIntentService extends IntentService {
@Override
protected void onHandleIntent(Intent intent) {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
final WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakelockName);
wakeLock.acquire();
wl.acquire();
try {
SQLiteDatabase db = helper.getWritableDatabase();
ContentValues cv = new ContentValues();
// insert data in database here
} finally {
wakeLock.release();
}
}
}
Начать IntentService
от BroadcastReceiver
использование AlarmManager
, IntentService
работать как шаблон очереди, и вам не нужно беспокоиться о синхронности операций.
Добавлено после обсуждения в комментариях:
Ваш пример кода не говорит, из какого места вы звоните PARTIAL_WAKE_LOCK
, Краткий ответ: PARTIAL_WAKE_LOCK
не требуется в BroadcastReciever
а также PARTIAL_WAKE_LOCK
необходимо в IntentService
, Может быть, это поможет BroadcastReceiver, Service и Wakelock