Android 在 BT 连接上强行关闭我的启动器
Android is force-killing my launcher on BT connect
我用 Apache cordova 为 Android 编写了一个启动器应用程序。它适用于类似信息亭的应用程序,基本上工作正常。
不幸的是有一个问题:
在某些情况下 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[=11=]0:105 com.android.settings.applications.InstalledAppDetails.handleMessage:223
发生时的情况:
- 正常运行数小时后发生
- 每次连接蓝牙遥控器时都会发生这种情况。 (它已经配对)。闲置几分钟后,遥控器会断开连接以节省电量。一旦您重新连接它(通过按下按钮),应用程序就会崩溃并重新启动。
到目前为止我试过什么但运气不好:
- 将应用安装为 "normal" 应用(不是启动器)
- 卸载所有 cordova 插件
发生错误的设备:
- Android 4.4.2 平板电脑("no-name" 产品)- 存在错误
- Android 5.1 平板电脑("no-name" 产品)- 存在错误
- Android 5.1.1 phone (Samsung xCover) - 没问题!!
- Android 4.4.2 phone (Samsung GALAXY S III Neo) - 没问题!!
那么为什么平板电脑上的 Android 会终止我的应用程序?是因为它们的硬件便宜,还是因为 Android 版本较旧? 如何防止此错误?
更新
我发现问题与编程无关,因为这个问题发生在每个应用。这就是为什么我在 Android-Enthusiasts
上发布了另一个问题
在崩溃的设备中,出于某种原因,您有开发者选项:不保留标记的活动。
您是否使用更改活动的 cordova 插件?
看起来由于某种原因 activity 正在被摧毁,您可以在这里找到一些信息:
https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html#when-can-this-happen
所有应用程序都是如此。任何已进入后台或一段时间未使用的应用程序,虚拟引擎将其设置为较低的优先级,当它需要内存或任何其他资源时,它会终止该应用程序。
你无法避免它。您可以做的是使用 onSaveInsanceState()
和 onRestoreInstanceState()
:
在它被杀死的同一个地方重新启动
onSaveInstanceState () and onRestoreInstanceState ()
另一种选择是将服务附加到您的应用程序。这样您的应用就不会被杀死:
How can we prevent a Service from being killed by OS?
虽然我不是Android这方面的专家,但看日志感觉关键在下面几行:
"java.lang.IllegalArgumentException: Requested window android.os.BinderProxy@427d8618 does not exist"
当您尝试调用目标设备上不可用的系统 API 时,通常会发生此错误。这就是为什么正如您所说,这个问题取决于设备。此外,如您所说,此问题会导致应用程序重新启动。你只需要弄清楚"what is that API call which crashes your app"
我在您的 post 中注意到的另一件有趣的事情是,此崩溃仅发生在 no-name
产品中。因此,我认为无名称可能只是导致问题的原因,因为在蓝牙配对期间,内部 BluetoothDevice.getName()
可能会返回空值,导致 crash.I 坚信这是导致问题的原因,并建议您查看此 link寻求帮助。
这不是平板电脑或手机的问题。我怀疑您的平板电脑启用了不保留活动选项(开发人员选项)。请检查。
Android 4.4.2 平板电脑("no-name" 产品)- 存在错误
Android 5.1 平板电脑("no-name" 产品)- 存在错误
问题是由于在运行时更改系统配置引起的。默认情况下,活动不会处理这些,只会重新启动。
见https://developer.android.com/guide/topics/resources/runtime-changes.html
Cordova 默认为 orientation
、keyboardHidden
、keyboard
、screenSize
和 locale
添加处理程序。
为了解决我们的问题,我们只需要将 navigation
的配置更改添加到我们的 activity 中,如下所示:
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|navigation">
我用 Apache cordova 为 Android 编写了一个启动器应用程序。它适用于类似信息亭的应用程序,基本上工作正常。
不幸的是有一个问题: 在某些情况下 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[=11=]0:105 com.android.settings.applications.InstalledAppDetails.handleMessage:223
发生时的情况:
- 正常运行数小时后发生
- 每次连接蓝牙遥控器时都会发生这种情况。 (它已经配对)。闲置几分钟后,遥控器会断开连接以节省电量。一旦您重新连接它(通过按下按钮),应用程序就会崩溃并重新启动。
到目前为止我试过什么但运气不好:
- 将应用安装为 "normal" 应用(不是启动器)
- 卸载所有 cordova 插件
发生错误的设备:
- Android 4.4.2 平板电脑("no-name" 产品)- 存在错误
- Android 5.1 平板电脑("no-name" 产品)- 存在错误
- Android 5.1.1 phone (Samsung xCover) - 没问题!!
- Android 4.4.2 phone (Samsung GALAXY S III Neo) - 没问题!!
那么为什么平板电脑上的 Android 会终止我的应用程序?是因为它们的硬件便宜,还是因为 Android 版本较旧? 如何防止此错误?
更新
我发现问题与编程无关,因为这个问题发生在每个应用。这就是为什么我在 Android-Enthusiasts
上发布了另一个问题在崩溃的设备中,出于某种原因,您有开发者选项:不保留标记的活动。
您是否使用更改活动的 cordova 插件?
看起来由于某种原因 activity 正在被摧毁,您可以在这里找到一些信息:
https://cordova.apache.org/docs/en/latest/guide/platforms/android/index.html#when-can-this-happen
所有应用程序都是如此。任何已进入后台或一段时间未使用的应用程序,虚拟引擎将其设置为较低的优先级,当它需要内存或任何其他资源时,它会终止该应用程序。
你无法避免它。您可以做的是使用 onSaveInsanceState()
和 onRestoreInstanceState()
:
onSaveInstanceState () and onRestoreInstanceState ()
另一种选择是将服务附加到您的应用程序。这样您的应用就不会被杀死:
How can we prevent a Service from being killed by OS?
虽然我不是Android这方面的专家,但看日志感觉关键在下面几行:
"java.lang.IllegalArgumentException: Requested window android.os.BinderProxy@427d8618 does not exist"
当您尝试调用目标设备上不可用的系统 API 时,通常会发生此错误。这就是为什么正如您所说,这个问题取决于设备。此外,如您所说,此问题会导致应用程序重新启动。你只需要弄清楚"what is that API call which crashes your app"
我在您的 post 中注意到的另一件有趣的事情是,此崩溃仅发生在 no-name
产品中。因此,我认为无名称可能只是导致问题的原因,因为在蓝牙配对期间,内部 BluetoothDevice.getName()
可能会返回空值,导致 crash.I 坚信这是导致问题的原因,并建议您查看此 link寻求帮助。
这不是平板电脑或手机的问题。我怀疑您的平板电脑启用了不保留活动选项(开发人员选项)。请检查。
Android 4.4.2 平板电脑("no-name" 产品)- 存在错误
Android 5.1 平板电脑("no-name" 产品)- 存在错误
问题是由于在运行时更改系统配置引起的。默认情况下,活动不会处理这些,只会重新启动。
见https://developer.android.com/guide/topics/resources/runtime-changes.html
Cordova 默认为 orientation
、keyboardHidden
、keyboard
、screenSize
和 locale
添加处理程序。
为了解决我们的问题,我们只需要将 navigation
的配置更改添加到我们的 activity 中,如下所示:
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|navigation">