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

Другие вопросы по тегам