Активность onCreate() вызывается при подключении устройства OTG

Я разрабатываю приложение, которое использует USB-устройство OTG.

Устройство, которое я использую, представляет собой USB-сканер штрих-кодов, который Android определяет как клавиатуру.

Но я обнаружил, что каждый раз, когда я подключаю или отключаю устройство OTG, приложение перезапускается, вызывая метод Activity onCreate().

Это вызывает у меня много проблем, потому что я не могу определить, почему вызывается метод onCreate().

Есть ли какое-либо намерение или что-то, что можно было бы сработать и поймать, когда устройство otg подключено / отключено?

Заранее спасибо.


person Hermandroid    schedule 16.04.2016    source источник


Ответы (1)


Android перезапускает вашу активность из-за изменения конфигурации, см. документацию здесь< /а>.

чтобы убедиться, что это так, попробуйте добавить android:configChanges="keyboard" к записи вашей активности в файле манифеста. Это укажет Android не перезапускать активность при подключении клавиатуры. После этого onCreate() больше не следует вызывать при подключении устройства.

обратите внимание, что вы не должны использовать это как исправление, это просто способ убедиться, что это так для вас (и это не конкретная вещь в вашем коде). вам нужно иметь дело с перезапуском активности, так как это нормальное поведение в Android и не должно вызывать проблем с вашим приложением. Одной из распространенных причин перезапуска активности является изменение ориентации, и очень не рекомендуется использовать описанный выше подход для ее решения, у вашей активности не должно быть никаких проблем, когда андроид хочет ее перезапустить, см. этот ответ для получения дополнительной информации.

person Mike    schedule 16.04.2016
comment
Спасибо, Майк, я проверил ссылки, которые вы мне предложили. Попробую восстановить состояния при возникновении configChanges. Но у меня тупой вопрос. Итак, я могу поместить все свои переменные в безголовый фрагмент с помощью setRetainInstance(true) и, очевидно, смогу восстановить его, когда произойдет onfigChange. Но до того, как появились фрагменты, как, черт возьми, можно было восстановить переменные. - person Hermandroid; 16.04.2016
comment
вам не нужно использовать фрагменты, если ваши переменные Parcelable. Если это так, вы можете переопределить onSaveInstanceState, сохранить свои переменные в пакете там, а затем восстановить его с помощью пакета, переданного вашему onCreate, см. это. - person Mike; 16.04.2016
comment
@Herman, если ваши переменные не могут быть сохранены пакетом (например, они Sockets, Threads или AsyncTasks), то в настоящее время лучше использовать фрагменты. До появления фрагментов люди могли использовать устаревший onRetainNonConfigurationInstance(). см. это. - person Mike; 16.04.2016
comment
Большое спасибо @Mike. Очень ценю вашу помощь. Сейчас это работает. Мне нужно только, чтобы вы поместили мои переменные в пакет. - person Hermandroid; 16.04.2016