活动和服务:关于滑动行为

时间:2018-01-29 08:28:55

标签: android xamarin android-activity android-service


我用Xamarin.Android开发了一个StepCounter应用程序。

我现在有什么:

1)在OnCreate()中的MainActivity中,我打电话 StartService(new Intent(this, typeof(MyService)));
然后在OnStart()我致电BindService(serviceIntent, MyServiceConnection, Bind.AutoCreate);

2)这给了我一个很好的服务,1)前景2)StartService和BindService 3)在StartCommandResult.Sticky中返回OnStartCommand()

3)在MyService中,我将MainActivity注册为每个检测到的步骤的监听器。我按建议here使用界面,并且MainActivity中的UI实时更新,一切都很完美。

但是有一个问题。
当我从最近的任务中滑动MainActivity时,我的应用程序应该关闭/完成/关闭,所以它确实如此。
但MyService是STICKY所以它再次启动,用户可以在状态栏中看到通知。这正是我想要的。粘性不朽的服务。
第一种情况:用户按下通知 - >这会创建一个活动 - > OnStart()再次提供与MyService的绑定 - >工作正常。
第二种情况:用户未按通知 - >没有创建任何活动(它是唯一的服务) - >用户做了一些步骤 - >申请失败。

我不知道如何处理第二种行为。 也许这是因为我将MainActivity注册为听众?如果我销毁它,没有什么可以更新我的服务?在OnStop()我致电UnbindService(MyService);,我希望即使没有活动,MyService也能正常工作。但显然,我做错了。

感谢任何帮助。

UPD:找到解决方案,请参阅下面的答案。

2 个答案:

答案 0 :(得分:1)

感谢大家的帮助!
解决方案非常简单。在MyService中,我使用接口将MainActivity注册为侦听器。所以破坏活动导致失败并不奇怪 - 没有什么可以更新了。 在调用this.listener.UpdateUI();

之前,解决方案是检查null

答案 1 :(得分:0)

我了解你的情况,并以某种方式也得到了你想要实现的想法。

在服务类中,您必须使用的返回类型是START_STICKY,我建议您使用START_NOT_STICKY。

两者都有自己的意义和用途。进一步说明如何使用您可以浏览this answer

的返回类型