Android принудительно убивает мой лаунчер при BT-подключении

Я написал приложение для запуска для Android с помощью Apache Cordova. Это приложение, похожее на киоск, и в основном оно работает нормально.

К сожалению, есть проблема: при определенных обстоятельствах Android принудительно убивает мое приложение и немедленно перезапускает его. - Загрузка занимает около 3 секунд, при этом показывает белый экран. Запускается полностью заново (onPause, onResume не вызываются). В логе нахожу:

V/WindowManager(  657): Changing focus from Window{42544288 u0 com.android.settings/com.android.settings.SubSettings} to Window{428ad610 u0 com.android.settings/com.android.settings.SubSettings} Callers=com.android.server.wm.WindowManagerService.addWindow:2665 com.android.server.wm.Session.addToDisplay:163 android.view.IWindowSession$Stub.onTransact:111 com.android.server.wm.Session.onTransact:126 
I/WindowManager(  657): Gaining focus: Window{428ad610 u0 com.android.settings/com.android.settings.SubSettings}
...
I/ActivityManager(  657): Force stopping com.myapp.name appid=10119 user=0: clear data
I/ActivityManager(  657): Killing 2639:com.myapp.name/u0a119 (adj 7): stop com.myapp.name
I/ActivityManager(  657):   Force finishing activity ActivityRecord{42542218 u0 com.myapp.name/.MainActivity t2}
V/ActivityManager(  657): Broadcast: Intent { act=android.intent.action.PACKAGE_RESTARTED dat=package:com.myapp.name flg=0x10 (has extras) } ordered=false userid=0 callerApp=null
V/ActivityManager(  657): Broadcast: Intent { act=android.intent.action.PACKAGE_DATA_CLEARED dat=package:com.myapp.name flg=0x10 (has extras) } ordered=false userid=0 callerApp=null
I/NotificationService(  657): queryReplace=false
I/ActivityManager(  657): Start proc com.android.documentsui for broadcast com.android.documentsui/.PackageReceiver: pid=2740 uid=10036 gids={50036}
V/WindowManager(  657): Changing focus from Window{428ad610 u0 com.android.settings/com.android.settings.SubSettings EXITING} to Window{42544288 u0 com.android.settings/com.android.settings.SubSettings} Callers=com.android.server.wm.WindowManagerService.removeWindowLocked:2770 com.android.server.wm.WindowManagerService.removeWindow:2709 com.android.server.wm.Session.remove:182 android.view.IWindowSession$Stub.onTransact:197 
...
I/WindowManager(  657): Gaining focus: Window{42544288 u0 com.android.settings/com.android.settings.SubSettings}
I/WindowManager(  657): Losing focus: Window{428ad610 u0 com.android.settings/com.android.settings.SubSettings EXITING}
D/DisplayManagerService(  657): Display listener for pid 2639 died.
D/WifiService(  657): Client connection lost with reason: 4
I/WindowState(  657): WIN DEATH: Window{424b0f20 u0 com.myapp.name/com.myapp.name.MainActivity}
W/WindowManager(  657): Force-removing child win Window{424c4168 u0 SurfaceView} from container Window{424b0f20 u0 com.myapp.name/com.myapp.name.MainActivity}
W/WindowManager(  657): Failed looking up window
W/WindowManager(  657): java.lang.IllegalArgumentException: Requested window android.os.BinderProxy@427d8618 does not exist
W/WindowManager(  657):   at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:8571)
W/WindowManager(  657):   at com.android.server.wm.WindowManagerService.windowForClientLocked(WindowManagerService.java:8562)
W/WindowManager(  657):   at com.android.server.wm.WindowState$DeathRecipient.binderDied(WindowState.java:1060)
W/WindowManager(  657):   at android.os.BinderProxy.sendDeathNotice(Binder.java:496)
W/WindowManager(  657):   at dalvik.system.NativeStart.run(Native Method)
I/WindowState(  657): WIN DEATH: null
V/InputMethodManagerService(  657): windowGainedFocus: android.os.BinderProxy@4284cbd0 controlFlags=#0 softInputMode=#10 windowFlags=#1810100
W/InputMethodManagerService(  657): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@42621308 attribute=null, token = android.os.BinderProxy@41f7d370
...
V/SettingsProvider(  657): call(system:anr_debugging_mechanism) for 0
W/ContextImpl( 2336): Calling a method in the system process without a qualified user: android.app.ContextImpl.sendBroadcast:1219 android.content.ContextWrapper.sendBroadcast:365 com.android.settings.applications.InstalledAppDetails.processClearMsg:1133 com.android.settings.applications.InstalledAppDetails.access$000:105 com.android.settings.applications.InstalledAppDetails$1.handleMessage:223 

Обстоятельства, когда это происходит:

  • Это происходит после нескольких часов безотказной работы
  • Это происходит каждый раз при подключении пульта дистанционного управления Bluetooth. (Он уже в паре). Через несколько минут простоя пульт дистанционного управления отключается для экономии энергии. При повторном подключении (нажатием кнопки) приложение вылетает и перезагружается.

Что я пробовал до сих пор безуспешно:

  • Установите приложение как «обычное» приложение (не лаунчер)
  • Удалите все плагины Cordova

Устройства, на которых возникает ошибка:

  • Планшет Android 4.4.2 ("безымянный" продукт) - Ошибка присутствует
  • Планшет Android 5.1 ("безымянный" продукт) - Ошибка присутствует
  • Телефон Android 5.1.1 (Samsung xCover) - Нет проблем!!
  • Телефон Android 4.4.2 (Samsung GALAXY S III Neo) - Нет проблем!!

Так почему же Android на планшетах убивает мое приложение? Это потому, что у них дешевое оборудование, или потому, что версии Android старше? Как я могу предотвратить эту ошибку?

ОБНОВЛЕНИЕ

Я обнаружил, что проблема не связана с программированием, потому что эта проблема возникает в каждом приложении. Вот почему я разместил еще один вопрос на Android-энтузиастам.


person Michael B    schedule 01.06.2016    source источник
comment
Хотя я не эксперт в Android, глядя на журнал, я чувствую, что ключ находится в следующих строках: java.lang.IllegalArgumentException: запрошенное окно android.os.BinderProxy@427d8618 не существует. Эта ошибка обычно возникает, когда вы пытаетесь вызвать системный API, который недоступен на вашем целевом устройстве. Вот почему, как вы сказали, эта проблема зависит от устройства. Также эта проблема приводит к перезагрузке приложения, как вы сказали. Все, что вам нужно выяснить, это то, что это за вызов API, который приводит к сбою вашего приложения. Надеюсь, это имеет смысл.   -  person Gandhi    schedule 03.06.2016
comment
@IngoAlbers Хотя я не эксперт в Android, глядя на журнал, я чувствую, что ключ находится в следующих строках: java.lang.IllegalArgumentException: запрошенное окно android.os.BinderProxy@427d8618 не существует. Эта ошибка обычно возникает, когда вы пытаетесь вызвать системный API, который недоступен на вашем целевом устройстве. Вот почему, как вы сказали, эта проблема зависит от устройства. Также эта проблема приводит к перезагрузке приложения, как вы сказали. Все, что вам нужно выяснить, это то, что это за вызов API, который приводит к сбою вашего приложения. Надеюсь, это имеет смысл.   -  person Gandhi    schedule 03.06.2016
comment
Спасибо за ваш комментарий. Проблема в том, что я не вызываю никаких вызовов системного API. Система делает это сама. Может быть, я могу изменить это в каком-то файле конфигурации системы? (рут имеется), но не знаю где искать и что менять.   -  person Michael B    schedule 06.06.2016
comment
Вы упомянули, что эта проблема возникает каждый раз, когда вы подключаетесь к Bluetooth Remote Control. Так что я бы посмотрел в эти строки, чтобы выяснить   -  person Gandhi    schedule 06.06.2016
comment
Еще одна интересная вещь, которую я отметил в вашем посте, это то, что этот сбой происходит только в безымянном продукте. Поэтому я считаю, что no-name может просто вызывать проблему, так как во время сопряжения Bluetooth внутренне BluetoothDevice.getName() может возвращать значение null, что приводит к сбою. Я твердо верю, что это вызывает проблему, и предлагаю вам просмотреть эту ссылку для некоторых help - stackoverflow.com/questions/26290640/ Держи меня в курсе   -  person Gandhi    schedule 06.06.2016
comment
@IngoAlbers У вас была возможность посмотреть этот комментарий? было полезно?   -  person Gandhi    schedule 07.06.2016
comment
@IngoAlbers l Есть новости по этому поводу?   -  person Gandhi    schedule 09.06.2016
comment
@Gandhi К сожалению, я больше не работаю над этим проектом. Насколько я знаю, Майкл еще не решил эту проблему. Он скоро обновится здесь. Спасибо за комментарии. Определенно подал некоторые идеи.   -  person IngoAlbers    schedule 09.06.2016
comment
@MichaelB Удачи, Майкл? Ответ помог?   -  person Gandhi    schedule 10.06.2016
comment
@IngoAlbers Спасибо за награду. Действительно чувствовать себя мотивированным. Удачного кодирования. Ваше здоровье   -  person Gandhi    schedule 12.06.2016


Ответы (5)


Проблема была вызвана изменениями конфигурации системы во время выполнения. По умолчанию действия не будут обрабатывать их, а просто перезапустят.

См. https://developer.android.com/guide/topics/resources/runtime-changes.html

Cordova по умолчанию добавляет обработчики для orientation, keyboardHidden, keyboard, screenSize и locale.

Чтобы решить нашу проблему, нам просто нужно было добавить обработку изменения конфигурации для navigation в нашу активность следующим образом:

<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|navigation">
person IngoAlbers    schedule 01.07.2016

В устройствах, которые дают сбой, по какой-то причине у вас есть опция разработчика: не оставлять отмеченные действия.

Используете ли вы плагины Cordova, которые изменяют действия?

Похоже, что по какой-то причине активность уничтожается, здесь вы можете найти некоторую информацию:

https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html#when-can-this-happen

person Breixo    schedule 03.06.2016
comment
Спасибо! Не вести деятельность не задано. Также я удалил все плагины Cordova и протестировал их с новым новым приложением Cordova. Ошибка там тоже присутствует. - person Michael B; 10.06.2016

Это справедливо для всех приложений. Любое приложение, которое перешло в фоновый режим или какое-то время не используется, виртуальный движок устанавливает для него более низкий приоритет, и когда ему требуется память или любой другой ресурс, он убивает приложение.

Вы не можете этого избежать. Что вы можете сделать, так это перезапустить с того же места, где он был убит, используя onSaveInsanceState()и onRestoreInstanceState():

onSaveInstanceState() и onRestoreInstanceState()

Другой вариант — подключить службу к вашему приложению. Таким образом, ваше приложение не будет убито:

Как мы можем предотвратить уничтожение службы ОС?

person Ashish Rawat    schedule 08.06.2016
comment
Это может быть универсальное решение. Но я не думаю, что это решает конкретную проблему, с которой застрял пользователь. - person Gandhi; 09.06.2016

Хотя я не эксперт в Android, глядя на журнал, я чувствую, что ключ находится в следующих строках:

«java.lang.IllegalArgumentException: запрошенное окно android.os.BinderProxy@427d8618 не существует»

Эта ошибка обычно возникает, когда вы пытаетесь вызвать системный API, который недоступен на вашем целевом устройстве. Вот почему, как вы сказали, эта проблема зависит от устройства. Также эта проблема приводит к перезагрузке приложения, как вы сказали. Все, что вам нужно выяснить, это «что это за вызов API, который приводит к сбою вашего приложения».

Еще одна интересная вещь, которую я отметил в вашем посте, это то, что этот сбой происходит только в no-name продукте. Поэтому я считаю, что no-name может быть просто причиной проблемы, так как во время сопряжения Bluetooth внутренне BluetoothDevice.getName() может возвращать значение null, что приводит к сбою. Я твердо верю, что это вызывает проблему, и предлагаю вам взглянуть на это ссылка для получения помощи.

person Gandhi    schedule 09.06.2016

Это не проблема планшета или мобильного телефона. Я подозреваю, что на вашем планшете включен параметр Не сохранять действия (параметры для разработчиков). Пожалуйста, проверьте это.

Планшет Android 4.4.2 ("безымянный" продукт) - Ошибка присутствует

Планшет Android 5.1 ("безымянный" продукт) - Ошибка присутствует

person AndroidEnthusiastic    schedule 09.06.2016
comment
Спасибо! К сожалению это не так - опция не установлена. - person Michael B; 10.06.2016