如何从JobService返回结果?

5
我正在尝试开发一个小应用程序,使用活动和服务。当用户点击按钮时,活动会启动服务,并从URI中获取数据并返回结果。有时候,数据不可用或不符合要求,此时即使活动在后台,服务也应该每隔X分钟重试。

我已经通过Intent和ResultReceiver(通过bundle传递)实现了活动与服务之间的通信。在实现服务时,我想使用新的JobScheduler组件,但发现它只能接受PersistableBundle,不能添加Parcelable对象(ResultReceiver),只能添加基本类型。

我希望服务能够安排一个工作,在网络可用时每隔X分钟检查数据。一旦获取到数据,就将数据返回给服务,以便它决定是否接受数据或需要重试。如果服务接受数据,则会通过ResultsReceiver将其返回给活动。

我无法在JobService中使用ResultsReceiver,因为我不能构造JobService实例(由JobInfo.Builder完成),也不能向回调对象传递引用。

如何在预定的任务和调用它的服务之间进行通信?

对于Android不熟悉的话题,如果有什么不清楚的地方请见谅。

谢谢!

1个回答

6
如何在定时任务和调用它的服务之间进行通信?
通常情况下,你不需要这么做。你的服务或活动可能已经不存在了。使用JobScheduler的目的是在你的应用程序不再运行时运行作业。如果以其他方式使用它,可能不合适。
尽管如此,你可以使用事件总线(我会选择greenrobot的EventBus,但LocalBroadcastManager在这里也可以工作),在你的进程中触发一个事件表示作业已完成。你的服务(或活动)可以在总线上注册事件并在触发这些事件时做出反应。同时,事件总线可以很好地让事件“掉落”,如果没有注册的处理程序,所以如果需要,你的JobService可以以“点火并忘记”的模式触发该事件。

我能否使用LocalBroadcastManager从JobScheduler向Activity发送数据,并根据从LocalBroadcast接收器获取的更新值更新UI? - Jay Dangar
@JayDangar:原则上是可以的。但要注意你的活动可能不存在。 - CommonsWare
@CommonWare,使用广播接收器我可以解决那个问题吗?我是说结合本地广播管理器和广播接收器。我不确定。 - Jay Dangar
1
@JayDangar:抱歉,我不确定“那个问题”是什么。JobScheduler的设计是用于未来数分钟、数小时或数天可能发生的作业。不能保证您有进程,更别提用户界面了。Android将为您分叉一个进程,但仅此而已。因此,如果要更新存在的UI,则使用LocalBroadcastManager是可以的。如果sendBroadcast()返回false,则说明没有UI响应本地广播,您的JobService可以执行其他操作(例如,弹出通知)。 - CommonsWare
是的,我的“那个问题”涉及使用LocalBroadCast管理器更新UI,但我已经通过使用sharedpreferences解决了这个问题。我将使用jobscheduler更新共享首选项中的数据,并使用onsharedpreferences数据更改回调之类的内容来更新我的数据以及UI方面的内容。因此,无需使用广播接收器,尽管它也可以解决您的问题。 - Jay Dangar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接