【问题标题】:IntentService <-> Activity communicationIntentService <-> Activity 通信
【发布时间】:2014-02-25 07:38:48
【问题描述】:

ActivityIntentService 之间的一种通信方式是使用BroadcastReceiver(或本地)和“sendBroadcast()”方法。

BroadcastReceiver 仅在 Activity 处于 onResume - onPause(可见生命周期)中时才会监听。

如果:

  1. Activity 已创建且可见,因此我们的 BroadcastReceiver 正在监听
  2. 我们正在启动新的IntentService,此服务正在后台运行...(例如连接服务器并检查某些内容)。
  3. Activity 开始不可见,因为有人关闭了屏幕。所以在 onPause 方法中,我们的BroadcastReceiverunregistered
  4. Intent 服务完成他的任务并让 sendBroadcast 通知更改的状态或活动应该知道的其他内容。 但是现在接收器未注册,因此此广播消息消失了。
  5. 用户打开屏幕,活动再次可见(但它没有来自意图服务的信息)。 Intent 服务消息丢失。

遇到这种情况怎么办?如果我们希望 Activity 获得有关 intentservice 是否停止并结束其工作或类似情况的信息。

【问题讨论】:

    标签: android service broadcastreceiver broadcast intentservice


    【解决方案1】:

    遇到这种情况该如何处理?

    您处理这种情况的方式与处理各种其他情况的方式相同,例如用户按下 BACK(从而破坏 Activity)并在您的 UI 中执行某些操作以创建您的 Activity 的新实例。

    从服务到活动的消息传递是一个推送接口,有利于实时更新。你需要一个pull接口,activity可以在其中获取当前状态。而且,在许多情况下,这还需要考虑持久性,因为当新的活动实例需要显示这些结果时,服务甚至整个流程可能早已不复存在。

    因此,详细信息在很大程度上取决于服务正在做什么以及 UI 如何确定该工作现在是否已完成以及结果如何。例如,这可能涉及查询数据库。

    【讨论】:

    • 主要问题是这个pull接口。所以这种情况下的细节是: 1.服务正在连接到服务器以检查某些项目的状态是否改变。而这个IntentService 有能力在数据库中更新这个状态(Sqlite/但没有ContentProvider)。所以它会检查状态然后在数据库中改变这个状态。以及如何告诉Activity 该活动是否不可见(侦听广播消息),同时如果此状态已更改,则进行广播。我知道活动每次都可以在onResume 中检查数据库,但是否还有其他可能性?
    • @Jedil:“我知道活动每次都可以在 onResume 中检查数据库,但是否还有其他可能性?” ——onResume() 似乎是一个可能的时间。您可以启动 AsyncTask 来查找当前状态并更新您的 UI 以匹配。
    • 我认为也许有更好的解决方案。但如果没有,使用AsyncTaskLoaders 似乎比使用IntentService 更好。如果我在活动中使用CursorLoadersContentProviders 作为数据存储/源,可能一切都会更好,因为如果我的IntentService 将通过内容提供程序更改存储中的某些内容,CursorLoader 将自动重新加载,对吗?跨度>
    • @Jedil:“如果我的 IntentService 将通过内容提供者更改存储中的某些内容,CursorLoader 将自动重新加载,对吗?” -- 仅当IntentService 使用ContentResolver 通过ContentProvider 执行更改,并且仅当ContentProvider 本身被正确写入(例如,有notifyChange() 调用等)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    相关资源
    最近更新 更多