Все в порядке, за исключением случая, когда экран выключен и кабель для зарядки отсоединен.
В этом случае он отключается от брокера, потому что «имеет превышено время ожидания», что вызвано тем, что клиент не отправляет никаких pingreq.
Если экран включен (заблокирован или нет) и кабель для зарядки не подключен, я вижу pingreq каждый интервал проверки активности.
То же самое, когда экран выключен с подключенным кабелем для зарядки.
Это одинаковое поведение на Android 9 и 14
Что касается настроек Android
- on A14 Я разрешил приложению «использовать батарею в фоновом режиме без каких-либо ограничений» (неограниченный режим) в настройках приложения.
- на A9 разрешена фоновая активность и нет оптимизации батареи
Код: Выделить всё
onCreate (Bundle savedInstanceState)
{
...
startService(new Intent(this, MQTTService.class));
...
}
Код: Выделить всё
public int onStartCommand(Intent intent, int flags, int startId)
{
Intent notIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notIntent, PendingIntent.FLAG_IMMUTABLE);
Notification not = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("MQTT listener")
.setContentText("connecting to broker...")
.setSmallIcon(R.drawable.ic_mqtt)
.setContentIntent(pendingIntent)
.setColor(getColor(R.color.white))
.setOngoing(true)
.setPriority(PRIORITY_MAX)
.build();
not.flags = Notification.FLAG_ONGOING_EVENT;
startForeground(NOT_STATE_ID, not);
connect2Server();
Log.d(TAG, "onStartCommand()");
isRunning = true;
return START_STICKY;
}
[Изменить 3 декабря]Вот некоторые обновления
- В качестве отчаянного решения я реализовал специальный поток, который отправляет тупое сообщение брокеру каждый интервал поддержки активности. Благодаря этому потоку клиент больше не отключается брокером.
- обнаружено, что я пропустил параметр подключения: automaticReconnect
, который по умолчанию имеет значение false. После установки значения true я начинаю видеть сообщения PING, и клиент больше не отключается. Я думал, что смогу указать виновника, но установка значения false не воссоздает проблему!?! и клиент теперь отправляет PING-сообщения независимо от того, является ли автоматическоеReconnect истинным или ложным….
Подробнее здесь: https://stackoverflow.com/questions/798 ... reen-is-of
Мобильная версия