活动、异步任务和服务之间的数据交换

Data exchange between Activities, Asynctasks and Services

关于下面所述的问题,我已经到了需要决定是否要这样做的地步:

以下哪种方式更好: - 能够与其他 activities/services 交换服务(或 Intenservice)接收到的数据 - 电池使用 - 总体 "good coding habits" ?

谢谢!

原问题:

我是一名新手 Android 开发人员,遇到过我不知道如何解决的情况。我已经花了几天时间寻找解决方案,但找不到。

在尝试开发我的第一个应用创意时,我开始尝试从互联网接收和解析数据。到目前为止,我所取得的成就是生成一个查询,该查询通过 API 接收 JSON 数据并解析此 JSON。所有这些都在 AsyncTask 中完成。然后在屏幕上显示接收到的数据。

但是,出于我的应用创意的目的,我需要在后台完成此操作。我想到的是:

现在棘手的部分开始了: 我收到的数据(假设每 10 分钟一次)将用于更改闹钟。因此,作为一个简单的示例,假设用户可以将他的闹钟设置为早上 08:00。然后,应用程序每 10 分钟检查一次当前温度,如果温度低于 0° 摄氏度,则将闹钟时间更改为 07:45,因为用户必须提早醒来清除汽车上的冰。 此外,当 "waking up" 应用程序时,当前(或更确切地说是最新接收的)温度应显示在 UI.

实现此目标的最佳方法是什么?我有一些关于来自 AsyncTasks/Services to/from 活动的 passing/receiving 数据的问题。

我的第一种方法是从 MainActivity 启动单个服务,将一些数据传递给该服务(例如警报启动的初始时间和用户的当前位置)。该服务然后有两个单独的 AlarmManagers。其中一个设置为执行实际警报(早上叫醒用户),另一个管理从互联网获取数据的时间间隔。

我的问题: - 到目前为止,我的思路是否有意义? - 传递和接收数据 to/from 服务的最佳方式是什么?我最好的猜测是使用意图传递和广播接收器从服务接收数据。这在这种特定情况下有意义吗?

恐怕不欢迎 post 问题,如果您之前没有付出任何努力。虽然我没有添加任何实际的源代码,但我希望你能看到我已经处理这些问题很长时间了,但在我了解应用程序的结构之前无法真正开始编码。

提前致谢

使用 AlarmManager 根据需要经常启动 IntentService(在您的示例中,在用户计划起床前大约两个小时开始检查温度就足够了,也许再次比正常起床时间早一小时,最后半小时。只有在极端天气情况下才会更频繁。

没有必要在 03:33 a.m 准确检查温度。所以用 setInexactRepeating(),这样会更省电。

另见 Scheduling Repeating Alarms

将结果写入 SharedPreferences 并让一个 IntentService 在正常唤醒时间前 15 分钟检查用户是否应在此时起床。在这种情况下取​​消正常的唤醒警报。通过 SharedPreferences(想想邮箱)和本地 (!) 广播进行通信是个好主意 - 便宜又安全 :)