代码之家  ›  专栏  ›  技术社区  ›  firienn

活动和服务:关于刷卡行为

  •  1
  • firienn  · 技术社区  · 6 年前


    我用Xamarin开发了一个步进计数器应用程序。安卓

    我现在有什么:

    1) In Main活动In OnCreate() 我打电话 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是粘性的,所以它会再次启动,用户可以在状态栏中看到通知。这正是我想要的。粘性不朽服务。
    第一个场景 :用户按下通知->创建活动-> OnStart() 再次提供与MyService的绑定->工作正常。
    第二种情况 :用户未按通知->尚未创建任何活动(这是唯一的服务)->用户执行一些步骤->应用程序失败。

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

    非常感谢您的帮助。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   firienn    6 年前

    谢谢大家的帮助!
    解决方案非常简单。在MyService中,我使用接口将MainActivity注册为监听器。因此,销毁活动导致失败也就不足为奇了——再也没有什么可更新的了。 解决方案是在调用之前检查null this.listener.UpdateUI();

        2
  •  0
  •   Pranay Soni    6 年前

    我理解你的处境,不知何故也得到了你想要实现的想法。

    在服务类中,您必须使用的返回类型是START\u STICKY,我建议您使用START\u NOT\u STICKY。

    两者都有各自的意义和用途。进一步介绍如何使用返回类型 this answer