Android 在 BT 连接上强行杀死我的启动器

标签 android cordova bluetooth android-4.4-kitkat android-5.1.1-lollipop

我已经使用 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$000:105 com.android.settings.applications.InstalledAppDetails$1.handleMessage:223 

发生的情况:

  • 它发生在几个小时的正常运行时间之后
  • 每次您连接蓝牙 Remote 时都会发生这种情况。 (它已经配对)。闲置几分钟后, Remote 会断开连接以节省电量。一旦您重新连接它(通过按下按钮),该应用程序就会崩溃并重新启动。

到目前为止我尝试过的没有运气的东西:

  • 将应用安装为“普通”应用(而非启动器)
  • 卸载所有 cordova 插件

发生错误的设备:

  • Android 4.4.2 平板电脑(“无名”产品)- 存在错误
  • Android 5.1 平板电脑(“无名”产品)- 存在错误
  • Android 5.1.1 手机 (Samsung xCover) - 没问题!!
  • Android 4.4.2 手机(三星 GALAXY S III Neo)- 没问题!!

那么,为什么平板电脑上的 Android 会终止我的应用程序?是因为它们的硬件便宜,还是因为 Android 版本较旧? 如何防止此错误?

更新

我发现,这个问题与编程无关,因为这个问题发生在每个应用上。这就是为什么我在 Android-Enthusiasts 上发布了另一个问题

最佳答案

问题是由于在运行时更改系统配置引起的。默认情况下, Activity 不会处理这些,只会重新启动。

参见 https://developer.android.com/guide/topics/resources/runtime-changes.html

Cordova 为 orientationkeyboardHiddenkeyboardscreenSizelocale 添加了处理程序> 默认情况下。

为了解决我们的问题,我们只需要添加以处理 navigation 的配置更改到我们的 Activity 中,如下所示:

<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|navigation">

关于Android 在 BT 连接上强行杀死我的启动器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37562411/

相关文章:

android - 支持 Web 和移动设备的单一 AngularJS 代码库

c# - 如何在 C# 中找出蓝牙设备的 COM 端口号?

ios - Beacon 未发现 iOS

c++ - 我正在研究 Arduino Uno。错误 : "' RX' not declared in the scope ."and "duplicate case value"for switch case

java - Java 中比 double 更大的数据类型是什么?

android - 从 eclipse 运行项目时出错

android - 获取 React-Native 部分列表中视口(viewport)中的当前部分

java - Moshi + Retrofit - 处理 JSON 响应

cordova - Phonegap - 以度数和磁场为单位的设备方向

json - 配置文件 (.\ionic.config.json) 不是有效的 JSON 格式