Android使用Application状态与Intents在活动和服务之间共享对象

时间:2013-04-24 18:48:27

标签: android

我正在寻找关于Intents vs Application上下文的一些一般性建议。

如果您的应用程序具有执行某些内容(如线程网络侦听器)和/或收集位置信息的服务,则需要在具有主Activity的结构化集合中共享,并且主Activity将必须在用户输入上调整说数据,在这些级别之间共享这些数据的最明智的方法是什么?

现在我有一个使用Intents的设置,但我不喜欢它,尽管现在可能会这样做。我不能完整地序列化数据,所以我在这里和那里广播位。主要问题是我的Intents用于更新的主数据集存储在主Activity中。

我想将数据集移动到我的服务中,或将其存储在应用程序上下文中。但是我担心线程安全,因为主Activity会偶尔调整数据。例如单击,更改布尔值,或从数据集中删除项目等...

我明白了Intents,但是我想广播一个Intent作为需要存储在Application上下文中的数据的函数的触发器,而不是作为在应用程序周围改组数据(部分数据)的工具。 / p>

我是否可以合理地使用应用程序上下文以安全的方式更新和共享服务和活动之间的数据?我希望我的服务在后台运行,而Activity用于在用户返回应用程序时拉取或更新数据集,或更改方向。感谢。

UPDATE /澄清

这个怎么样?访问绑定服务getter / setter方法进行数据共享是否安全?我绑定到我的服务来通过公共方法启动/停止线程函数(自从我跳回到这一点并意识到我已经绑定了一段时间后)我能以这种方式安全地调用getter / setter吗?

2 个答案:

答案 0 :(得分:0)

我建议你不要尝试创建自己的解决方案,而是考虑MVC模型。

如果你需要在两个[C]控制器之间传递数据(例如,Activity,Fragment,...),你应该将它们保存在[M] odel中,这是以你可以(de)序列化你的数据的方式实现的。 / p>

是否使用SQlite(或某些ORM),SharedPreferences,文件存储(可能是序列化的json),文件中的二进制blob(请参阅ObjectOutputStreamObjectInputStream)或其他[M] odel实现,取决于完全基于您的自定义用例。

由于系统和用户如何使用您的应用程序,因此将数据静态存储在上下文中通常非常非常讨厌的想法。

考虑更多用例,例如使用独立线程获取数据并将数据保存到[M] odel中。如果您的[M] odel将是某种静态变量或应用程序上下文变量,那么您将始终需要坚持使用它并使用诸如同步,等待/加入/通知等混乱。 如果您的[M] odel将是独立的SQL(或noSQL)数据库,您可以使用观察者来通知[M] odel更改,并且根本不需要上下文。

android.os.NetworkOnMainThreadException可以看出,您应该对数据进行异步处理。无论数据是在线存储,还是在本地数据库,文件系统或上下文中存储。坚持这些知识,并试着找出自己的解决方案。

答案 1 :(得分:0)

要传达活动和服务,您可以部署ResultReceiver或LocalBroadcast。该服务可以通过所提到的方法发送其结果,从而完成繁重的工作并与活动交互。您可以在Activity的生命周期的onStart和onStop方法上将Activity连接到服务,以确定Activity是否在前台,以相应地更新UI。

希望它有所帮助。

注意:根据我的个人经验,我与他们合作过,他们做得很好。我不建议绑定到服务,因为它给Activity带来了复杂性。