2

我有一个包含位置集合的 Sqlite 数据库。内容提供者用于访问此数据库。

然后,通过单击活动中的位置列表,这些位置将在数据库中标记为活动或非活动。

然后运行一个服务,该服务将监听活动位置并在到达该位置时执行某些操作。

我的问题是服务运营的最佳方式是什么。

要么让它监视活动位置的光标,该光标会在数据更改时自动更新。包含位置列表的所有活动都必须将位置设置为活动,然后调用服务意图以确保其运行。

在我看来,这样做的好处是,无论数据库中发生什么,服务都是最新的。但是我不确定每次位置更改时保持打开的光标并遍历它是否有效。

另一种方法是让活动在数据库中将位置设置为活动,然后绑定到服务并将位置数据发送给它以进行收听。然后,服务将其存储在一个列表数组中,每当位置发生变化时,都会遍历列表以查看是否已到达该位置。

这样做的缺点是,对于每个位置修改,服务都必须绑定到并且位置会改变。一个优点可能是没有打开游标,并且只存储了一个带有位置的小列表数组。

那么是在服务中游标还是绑定到服务?还是我错过了更好的方法?

4

1 回答 1

1

这是效率与代码复杂性的平衡。

我会在提供者上注册一个观察者,然后在每次修改提供者时更新我的​​活动位置列表,然后我会根据当前位置扫描列表。观察者不需要与游标关联,尽管在调用 ContentObserver.onChange() 时您必须重新查询提供者。

记得在后台做这项工作。使用 IntentService 或编写自己的运行 HandlerThread 的服务;我更喜欢使用 IntentService 或 Service,因为它们不受 Activity 生命周期事件的影响,就像 AsyncTask 一样。

于 2012-12-17T21:32:49.637 回答