java.lang.IllegalArgumentException:服务未注册 - Xamarin BoundServiceDemo 崩溃

java.lang.IllegalArgumentException: Service not registered - Xamarin BoundServiceDemo crash

我有一个问题,我现有的绑定服务丢失了它的绑定器属性(绑定器由于某种原因被处置)。所以我退后一步,重新学习 Bound Servcie。我从 Xamarin 从以下页面下载了 BoundServiceDemo 应用程序: https://developer.xamarin.com/guides/android/application_fundamentals/services/part_2_-_bound_services/

项目已构建并运行。但我注意到,如果我执行一系列 Unbind from serviceBind to service(通过在项目中单击按钮),第三个 stop 将始终崩溃。绑定到服务后按 Get timestamp from service 并不能阻止崩溃的发生。堆栈跟踪如下:

05-23 10:33:21.334 11788 11788 D AndroidRuntime: Shutting down VM

05-23 10:33:21.344 11788 11788 E AndroidRuntime: FATAL EXCEPTION: main

05-23 10:33:21.344 11788 11788 E AndroidRuntime: Process: com.xamarin.xample.boundservicedemo, PID: 11788

05-23 10:33:21.344 11788 11788 E AndroidRuntime: java.lang.IllegalArgumentException: Service not registered: md57edca57e0b6c066e67883d386d06086f.TimestampServiceConnection@37c0e

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at android.app.LoadedApk.forgetServiceDispatcher(LoadedApk.java:1156)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at android.app.ContextImpl.unbindService(ContextImpl.java:1452)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at android.content.ContextWrapper.unbindService(ContextWrapper.java:644)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at mono.android.view.View_OnClickListenerImplementor.n_onClick(Native Method)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at mono.android.view.View_OnClickListenerImplementor.onClick(View_OnClickListenerImplementor.java:30)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at android.view.View.performClick(View.java:5697)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at android.widget.TextView.performClick(TextView.java:10814)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at android.view.View$PerformClick.run(View.java:22526)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at android.os.Looper.loop(Looper.java:158)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7229)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)

05-23 10:33:21.344 11788 11788 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

05-23 10:33:21.344 4699 4724 W VirtualScreenManagerService: moveTaskBackToDisplayIfNeeded(): top activity or app is null

05-23 10:33:21.354 4699 4724 D InputDispatcher: Focused application set to: xxxx

我正在使用 VS2015 和 Xamarin 版本 4.5.0.443。我希望这不是 Xamarin 的错误,因为我的应用程序在其生命周期内执行多个 bind/unbind 服务。有人可以阐明一下吗?谢谢。

我联系了示例代码的作者Tom Opgenorth,他认为是Click事件的事件处理程序的动态设置导致了崩溃。事件处理程序现已修改为在 activity 启动时注册一次。它已经解决了这个问题。

根据Tom的信息,我发现每次单击停止服务按钮时都会注册RestartServiceButton单击的事件处理程序,但直到应用程序停止时才注销。这意味着 RestartServiceButton 单击事件将针对每个后续单击触发多次。所以这个问题也可以通过在事件触发时注销自身来解决

void RestartServiceButton_Click(object sender, System.EventArgs e)
{
    ...
    restartServiceButton.Click -= RestartServiceButton_Click;
}

Tom 应该很快就会上传更新版本