【问题标题】:Service updating an activity that is not active服务更新不活动的活动
【发布时间】:2014-04-06 15:40:03
【问题描述】:

最好的方法是什么?

1) MainActivity(即 UI)被创建并启动一个开始监听 TCP 套接字的服务(它应该是一个 IntentService,因为 MainActivity 是唯一的客户端吗?)。

2) 服务接收消息并在出现问题时更新 UI(使用 LocalBroadcastManager?)。

3) 用户通过单击返回或主页按钮关闭活动。 MainActivity 不再处于活动状态,但服务应继续在后台运行,接收消息并以某种方式与 MainActivity(不存在)通信。我对此一无所知,类似于 runOnUiThread()?

4) 当用户返回并恢复 MainActivity 时,UI 不仅应显示新消息,还应显示“旧”消息:自服务启动以来收到的每条消息。

5) 消息不是永久的:如果整个应用程序被杀死,手机关闭 ecc,它们应该被删除。它们具有相同的服务生命周期。

我担心没有像与不活动的活动通信这样的事情(第 3 点),我应该在本地文件中写入消息,检查它是否有更新 onCreate() 和 onResume()。有没有更聪明的方法?第 3 点和第 4 点是关键点。实现它们的最佳方法是什么? (无需编写代码,只需使用关键字或示例链接进行说明即可。

【问题讨论】:

  • 您需要将消息缓存在数据库中,并且可以使用同步适配器。下载并查看 Google I/O aap

标签: android android-intent service


【解决方案1】:

MainActivity 不再活动

MainActivity 可能会被破坏,而不仅仅是“不活跃”。

并以某种方式与 MainActivity 通信

即使有一个MainActivity 的实例还没有被垃圾回收,如果它被销毁,它也永远不会被再次使用。而且您无法与尚不存在的MainActivity 实例通信。

当用户返回并恢复 MainActivity 时,UI 不仅应显示新消息,还应显示“旧”消息:自服务启动以来收到的每条消息。

MainActivity 在这种情况下需要数据,而不是让数据被推送到它。拉动是通过向服务询问此数据(通过bindService(),通过在事件总线上发布GimmeMyData 事件等),还是活动和服务是否通过某些中介(例如, ContentProvider),由你决定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多