#android #performance #wakelock
#Android #Производительность #блокировка пробуждения
Вопрос:
В настоящее время я разрабатываю приложение, которое использует GCM для отправки уведомления нескольким устройствам, которое запускает службу для начала опроса очереди сообщений RabbitMQ и выполняет некоторую обработку каждого полученного сообщения. Я использую WakefulBroadcastReceiver, чтобы поддерживать устройство в состоянии бодрствования после запуска службы, но я вижу значительное снижение производительности, если экраны устройств выключены, а не если я оставляю их включенными. Я также снял флажок с параметра «Оптимизация Wi-Fi» и убедился, что для параметра «Всегда поддерживать Wi-Fi включенным во время сна».
Есть ли что-то еще, чего мне не хватает? Служба не останавливается полностью, она просто замедляется всякий раз, когда экран гаснет. Нажимаю ли я кнопку ожидания или отключаю ее по истечении установленного времени. Устройства работают под управлением Jelly Bean (4.2.2) и Kit Kat (4.4.2)
Заранее спасибо!
Добавлены фрагменты кода ниже. Упомянутый рабочий класс просто вызывает другой класс, который выполняет некоторую обработку данных:
public class GcmBroadcastReceiver extends WakefulBroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// Explicitly specify that GcmIntentService will handle the intent.
ComponentName comp = new ComponentName(context.getPackageName(), GcmIntentServicece.class.getName());
// Start the service, keeping the device awake while it is launching.
startWakefulService(context, (intent.setComponent(comp)));
setResultCode(Activity.RESULT_OK);
}
}
Метод ‘onHandleIntent’ службы намерений
@Override
protected void onHandleIntent(Intent intent)
{
Bundle extras = intent.getExtras();
GoogleCloudMessaging gcm = GoogleCloudMessaging.getInstance(this);
String messageType = gcm.getMessageType(intent);
if (!extras.isEmpty())
{
if (GoogleCloudMessaging.MESSAGE_TYPE_MESSAGE.equals(messageType))
{
String message = extras.getString("message");
if (message.equals(START_PROCESSING))
{
Worker worker = new Worker(this, queueServerUrl, Integer.parseInt(queueServerPort), queueName, fileServerUrl);
Map<String, Integer> results = worker.StartWorking();
// Update the results
update(results, jobId);
}
}
}
// Release the wake lock provided by the WakefulBroadcastReceiver.
GcmBroadcastReceiver.completeWakefulIntent(intent);
}
Комментарии:
1. Что делают службы? Можете ли вы поделиться кодом?
2. Я предполагаю, что устройства делают это специально для экономии заряда батареи. Высокая вычислительная мощность обычно не требуется, когда экран выключен.
3. Служба просто вызывает рабочий класс, который выполняет некоторую обработку данных в текстовых файлах. Я добавил код, который создает и освобождает блокировку