Я использую AlarmManager
для отправки широковещательной передачи, когда экран выключен. Это отлично работает на большинстве устройств, но на некоторых (например, Samsung Galaxy S4) требуется 30, 40 или даже 120 секунд вместо указанных 20 секунд до тех пор, пока передача не будет получена. У меня нет доступа к устройствам, на которых это происходит, поэтому я не могу проверить logcat.Несоответствие AlarmManager
Это, как я устанавливаю вверх AlarmManager
:
AlarmManager mAlarmManager=(AlarmManager)mContext.getSystemService(Context.ALARM_SERVICE);
long mInterval = 20 * 1000;
Intent i = new Intent();
i.setAction(MY_ACTION);
mPendingIntent = PendingIntent.getBroadcast(mContext, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
mAlarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + mInterval, mPendingIntent);
И это приемник, зарегистрированный в манифесте:
private class MyIntentReceiver extends BroadcastReceiver {
private static final String TAG = "MyIntentReceiver";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(MY_ACTION)) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
wl.acquire();
Log.e(TAG, "onReceive");
//Carry out my action...
wl.release();
}
}
}
Два вопроса: вы не должны тратить больше, чем на пару миллисекунд в 'onReceive()', и уже есть 'WakeLock', когда вы находитесь в' onReceive() '. Вам нужен ваш собственный «WakeLock», если вы передаете управление другому компоненту (например, «// Выполняем мое действие», действительно делегируем «IntentService»), хотя затем освобождение 'WakeLock', где вы находитесь, неверно. Если вы делегируете другой компонент, используйте [my 'WakefulIntentService' (https://github.com/commonsguy/cwac-wakeful) или пакет поддержки Android WakebackBroadcastReceiver. – CommonsWare
Спасибо, Марк. Я изменил свой код на конструкцию WakefulBroadcastReceiver/IntentService, но несогласованность на S4 все еще существует (она работает на других устройствах, как и раньше). Если я увеличиваю интервал (например, 30 или 40 секунд вместо 20), несогласованность увеличивается экспоненциально (т. Е. На 1-2 минуты дольше, чем предполагалось до тех пор, пока не будет выполнено мое действие). Я в шоке от этого, потому что я думал, что использование «RTC_WAKEUP» гарантирует, что фактическое время будет использоваться, а не только «устройство пробуждено» - время? – Nick
Это должно быть. Если вы можете создать воспроизводимый тестовый пример, загрузите его где-нибудь, и я загляну к нему. У меня есть S4, хотя он может быть не такой же S4-модель, как у вас (Samsung применил «S4» к нескольким устройствам). Или попробуйте [этот образец «WakefulIntentService»] (https://github.com/commonsguy/cw-omnibus/tree/master/AlarmManager/Wakeful) или [этот образец «WakefulBroadcastReceiver»] (https://github.com/ commonsguy/cw-omnibus/tree/master/AlarmManager/WakeCast) и попробуйте воспроизвести свои симптомы на основе одного из них. – CommonsWare