Android принудительно убивает мой лаунчер на BT connect
Я написал приложение-лаунчер для 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-энтузиастов
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">
Это не планшет или мобильная проблема. Я подозреваю, что на планшете включена опция "Не сохранять действия"("Параметры разработчика"). Пожалуйста, проверьте это.
Планшет Android 4.4.2 (продукт без названия) - ошибка присутствует
Планшет Android 5.1 (продукт без названия) - ошибка присутствует
Хотя я не эксперт в Android, глядя на журнал, я чувствую, что ключ кроется в следующих строках:
"java.lang.IllegalArgumentException: запрошенное окно android.os.BinderProxy@427d8618 не существует"
Эта ошибка обычно возникает, когда вы пытаетесь вызвать системный API, который недоступен на вашем целевом устройстве. Вот почему, как вы сказали, эта проблема зависит от устройства. Также эта проблема приводит к перезагрузке приложения, как вы сказали. Все, что вам нужно выяснить, это "что это за вызов API, который приводит к сбою вашего приложения"
Еще одна интересная вещь, которую я отметил в вашем посте, заключается в том, что этот сбой происходит только в no-name
товар. Таким образом, я считаю, что отсутствие имени может быть причиной проблемы, как во время сопряжения Bluetooth, внутренне BluetoothDevice.getName()
может возвращать null, что приводит к сбою. Я твердо верю, что это вызывает проблему, и предлагаю вам взглянуть на эту ссылку для некоторой помощи.
Это верно для всех приложений. Любое приложение, которое перешло в фоновый режим или какое-то время не используется, виртуальный движок устанавливает для него более низкий приоритет, а когда ему требуется память или любой другой ресурс, оно убивает приложение.
Вы не можете избежать этого. Что вы можете сделать, это перезапустить с того же места, где он был убит, используя onSaveInsanceState()
а также onRestoreInstanceState()
:
onSaveInstanceState () и onRestoreInstanceState ()
Другой вариант - подключить сервис к вашему приложению. Таким образом, ваше приложение не будет убито:
В устройствах, по которым происходит сбой, по какой-то причине у вас есть возможность для разработчика: не оставлять действия отмеченными.
Вы используете плагины Cordova, которые изменяют деятельность?
По какой-то причине активность разрушается, здесь вы можете найти информацию:
https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html