Android在BT连接

时间:2016-06-01 07:43:36

标签: 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 

发生的情况:

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

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

  • 将应用程序安装为"正常"应用程序(不是发射器)
  • 卸载每个cordova插件

发生错误的设备:

  • Android 4.4.2平板电脑("无名"产品) - 出现错误
  • Android 5.1平板电脑("无名"产品) - 出现错误
  • Android 5.1.1手机(三星xCover) - 没问题!!
  • Android 4.4.2手机(三星GALAXY S III Neo) - 没问题!!

那么为什么平板电脑上的Android会杀死我的应用呢?是因为他们有廉价的硬件,还是因为Android版本较旧? 如何防止此错误?

更新

我发现问题与编程无关,因为此问题发生在每个应用上。这就是我在Android-Enthusiasts

上发布另一个问题的原因

5 个答案:

答案 0 :(得分:1)

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

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

Cordova默认为orientationkeyboardHiddenkeyboardscreenSizelocale添加处理程序。

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

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

答案 1 :(得分:0)

在崩溃的设备中,出于某种原因,您是否拥有开发者选项:不要将活动标记为。

你是否使用改变活动的cordova插件?

由于某种原因,某项活动正在被销毁,您可以在这里找到一些信息:

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

答案 2 :(得分:0)

这适用于所有应用。任何已经进入后台或未被使用一段时间的应用程序,虚拟引擎将其设置为较低优先级,当它需要内存或任何其他资源时,它会杀死应用程序。

你无法避免它。你可以做的是使用onSaveInsanceState()onRestoreInstanceState()在同一个地方重新开始:

onSaveInstanceState () and onRestoreInstanceState ()

另一种选择是将服务附加到您的应用。这样你的应用程序就不会被杀死:

How can we prevent a Service from being killed by OS?

答案 3 :(得分:0)

虽然我不是Android的专家,看着日志我觉得关键在于以下几行:

  

&#34; java.lang.IllegalArgumentException:请求窗口android.os.BinderProxy@427d8618不存在&#34;

当您尝试调用目标设备上不可用的系统API时,通常会发生此错误。这就是为什么你说这个问题取决于设备。此问题也导致应用程序重新启动,如您所述。您需要弄清楚的是&#34;什么是API调用会导致您的应用崩溃?&#34;

我在帖子中提到的另一个有趣的事情是此崩溃只发生在no-name产品中。所以我认为无名可能只是导致问题,因为在蓝牙配对期间,内部BluetoothDevice.getName()可能会返回null导致崩溃。我坚信这会导致问题,并建议你看看这个{{3为了一些帮助。

答案 4 :(得分:0)

它不是平板电脑或移动设备问题。我怀疑您的平板电脑中已启用不要保留活动选项(开发人员选项)。请检查一下。

Android 4.4.2平板电脑(&#34;无名&#34;产品) - 出现错误

Android 5.1平板电脑(&#34;无名&#34;产品) - 出现错误